Olivia_v2017/Olivia/olv_reco.cpp

377 lines
12 KiB
C++
Raw Blame History

#include "stdafx.h"
#ifdef OLIVIA_COMPILA
#include "olv_reco.h"
#include "olv_reco_thr.h"
#include "olv_geom.h"
#include "olv_sens_ws.h"
#include "ini_file.h"
/**
* @file olv_reco.cpp
* Archivo de definiciones y variables de la utilidad de recogida de residuos del programa Olivia.
*/
Colv_reco::Colv_reco(COlivia *olv) : Colv_limp(olv)
{
this->olv = olv;
thr_reco = new Colv_reco_thr(this);
//rellena_campos();
t_vaci=t_sal=0;
kg_max=kg_reco_def=0;
anch_vehi=0;
giro_vehi=OLV_LIMP_GIRO_VEHIC;
memset(coor_plant,0,3*sizeof(double));
nod_instal=nod_plant=-1;
ptos_vaci=NULL;
dens_frac=150;
info_carg=NULL;
//
}
Colv_reco::~Colv_reco(void)
{
cancela();
delete(thr_reco);
if(ptos_vaci)
free(ptos_vaci);
if(info_carg)
free(info_carg);
if(ord_sec_plan)
{
if(ord_sec_plan[1].ctnod[0] && ord_sec_plan[1].ctnod[0]==ord_sec_plan[0].ctnod[0])
ord_sec_plan[1].ctnod[0]=NULL;
//solo libera la segunda parte parte, el destructor de limp hace el resto
if(ord_sec_plan[1].ctnod[0])
{
ord_sec_plan[1].libera(0,conjs.n);
free(ord_sec_plan[1].ctnod[0]);
}
ord_sec_plan[1].ctnod[0]=NULL;
}
}
//*************************************************************************************
/**
* Termina las tareas
*/
void Colv_reco::cancela()
{
thr_reco->termina_th();
}
//*************************************************************************************
/**
* Inicia las variables que son propias de limpieza
*/
void Colv_reco::inicia_limp()
{
res_circ=OLV_RES_RECOGER_SOLO_LADO_Y_GIROS;
t_tto=t_vaci;
//ang_lim = giro_vehi*OLV_PI/180;
tipo_ambit=OLV_AMB_PUN;
v_despl=0;
uds_tto=OliviaDef::GeneralDef::OlvTipTtoMin;
}
//*************************************************************************************
/**
* Rellena los campos de la dbf
*/
void Colv_reco::rellena_campos()
{
camps_r.campo_uds[0]=0;
camps_r.campo_capa[0]=0;
camps_r.campo_kgcont[0]=0;
Colv_limp::rellena_campos();
rellena_campos_sens();
}
//*************************************************************************************
/**
* Pone las opciones de configuraci<63>n de lo que recibe por el socket
*/
int Colv_reco::pon_config(char *config_)
{
int j;
char *token;
char config[2048];
if(!config)
return 0;
strcpy_s(config,2048,config_);
j=Colv_limp::pon_config(config);
//los par<61>metros son:
token = strtok(config, OliviaDef::GeneralDef::EjecGeoParamSep);
//avanza al siguiente token, el primero indica "\CONFIGURACION"
token = strtok(NULL, OliviaDef::GeneralDef::EjecGeoParamSep);
while (token != NULL)
{
if(strstr(token,OliviaDef::GeneralDef::GR_kgM))
{
if(!olv->dame_param(token, &kg_max))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_dens))
{
if(!olv->dame_param(token, &dens_frac))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_camp_uds))
{
if(!olv->dame_param(token, camps_r.campo_uds,sizeof(camps_r.campo_uds)))
break;
if (strlen(camps_r.campo_uds) > OLV_MAX_COL_SHP)//10 porque el shp solo pasa con 10 caracteres en los nombres de columna
camps_r.campo_uds[OLV_MAX_COL_SHP] = 0;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_camp_kgrec))
{
if(!olv->dame_param(token, camps_r.campo_kgcont,sizeof(camps_r.campo_kgcont)))
break;
if (strlen(camps_r.campo_kgcont) > OLV_MAX_COL_SHP)//10 porque el shp solo pasa con 10 caracteres en los nombres de columna
camps_r.campo_kgcont[OLV_MAX_COL_SHP] = 0;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_camp_cap))
{
if(!olv->dame_param(token, camps_r.campo_capa,sizeof(camps_r.campo_capa)))
break;
if (strlen(camps_r.campo_capa) > OLV_MAX_COL_SHP)//10 porque el shp solo pasa con 10 caracteres en los nombres de columna
camps_r.campo_capa[OLV_MAX_COL_SHP] = 0;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_kgrecog))
{
if(!olv->dame_param(token, &kg_reco_def))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_tvc))
{
if(!olv->dame_param(token, &t_vaci))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_tdca))
{
if(!olv->dame_param(token, &t_descarg))
break;
t_descarg=t_descarg*60;//porque viene en minutos
}
else if(strstr(token,OliviaDef::GeneralDef::GR_tsal))
{
if(!olv->dame_param(token, &t_sal))
break;
t_sal=t_sal*60;//porque viene en minutos
}
else if(strstr(token,OliviaDef::GeneralDef::GR_anc))
{
if(!olv->dame_param(token, &anch_vehi))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_gir))
{
if(!olv->dame_param(token, &giro_vehi))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_descx))
{
if(!olv->dame_param(token, &coor_plant[0]))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_descy))
{
if(!olv->dame_param(token, &coor_plant[1]))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_carga_cont))
{
if(!olv->dame_param(token, &info_sens.porc_lim))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_sens_modo))
{
if(!olv->dame_param(token, &info_sens.modo_pet))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_sens_url))
{
if(!olv->dame_param(token, info_sens.url,sizeof(info_sens.url)))
break;
for(int i=0;info_sens.url[i]; i++ )
{
if(info_sens.url[i]=='\\')
info_sens.url[i]='/';
}
}
else if(strstr(token,OliviaDef::GeneralDef::GR_sens_id))
{
if(!olv->dame_param(token, info_sens.camps.id,sizeof(info_sens.camps.id)))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_sens_fecha))
{
if(!olv->dame_param(token, info_sens.fecha_ini,sizeof(info_sens.fecha_ini)))
break;
}
else if(strstr(token,OliviaDef::GeneralDef::GR_sens_fechaf))
{
if(!olv->dame_param(token, info_sens.fecha_fin,sizeof(info_sens.fecha_fin)))
break;
}
else if(strstr(token, OliviaDef::GeneralDef::GR_lateral))
{
if(!olv->dame_param(token, &lateral))
break;
}
else
{
token = strtok(NULL, OliviaDef::GeneralDef::EjecGeoParamSep);
continue;
}
token = strtok(NULL, OliviaDef::GeneralDef::EjecGeoParamSep);
j++;
}
strcpy_s(olv->paths.path_res_rut,MAX_PATH,olv->paths.path_data);
strcpy_s(olv->paths.path_res_pt,MAX_PATH,olv->paths.path_data);
inicia_limp();
return j;
}
//*************************************************************************************
/**
* Inicia las tareas de la utilidad de limpieza viaria
*/
BOOL Colv_reco::inicia()
{
//arranca el thread
thr_reco->inicia_th();
//empieza importando
thr_reco->encola(thr_reco->OLV_LIMP_EV_ABRE_DAT,NULL,FALSE);
return TRUE;
}
//*************************************************************************************
void Colv_reco::dame_cost( double ltot, int ia, float *cost, float *cost2 )
{
Colv_limp::dame_cost(ltot,ia,cost,cost2);
//sustituye el caso de que sea contenedor
if((iaso[ia].flgs & OLV_LIMP_FLG_AMB) && (tipo_ambit==OLV_AMB_PUN))
{
*cost=*cost2=(float)(t_tto*iaso[ia].inf_r.uds); //en segundos, el tiempo que tarda en vaciar un contenedor, por el n<>mero de contenedores
}
}
//*************************************************************************************
/**
* Rellena los campos del m<>todo POST para lectura de los sensores
*/
void Colv_reco::rellena_campos_sens()
{
//info para el cuerpo del env<6E>o post
sprintf_s(info_sens.camps.fn,OLV_MAX_CAMP_HTTP,"fn");
sprintf_s(info_sens.camps.id,OLV_MAX_CAMP_HTTP,"id");
sprintf_s(info_sens.camps.usr,OLV_MAX_CAMP_HTTP,"usr");
sprintf_s(info_sens.camps.pwd,OLV_MAX_CAMP_HTTP,"pwd");
sprintf_s(info_sens.camps.startdate,OLV_MAX_CAMP_HTTP,"startdate");
sprintf_s(info_sens.camps.enddate,OLV_MAX_CAMP_HTTP,"enddate");
//el env<6E>o del POST al web service
sprintf_s(info_sens.fn_cont_status,OLV_MAX_URL,"get_container_status");
sprintf_s(info_sens.usr,OLV_MAX_CAMP_HTTP,"VSM");
sprintf_s(info_sens.pwd,OLV_MAX_CAMP_HTTP,"VSM2017");
sprintf_s(info_sens.url,OLV_MAX_URL,"http://localiza.info/Utilidades/APIManager.aspx");
//la respuesta del servicio en JSON
sprintf_s(info_sens.camps_json.histo,OLV_MAX_CAMP_HTTP_LONG,"HistoricalFillingData");
sprintf_s(info_sens.camps_json.id,OLV_MAX_CAMP_HTTP_LONG,"ContainerID");
sprintf_s(info_sens.camps_json.porc,OLV_MAX_CAMP_HTTP_LONG,"FillingPercentage");
sprintf_s(info_sens.camps_json.resp_code,OLV_MAX_CAMP_HTTP_LONG,"ResponseCode");
sprintf_s(info_sens.camps_json.resp_code_err,OLV_MAX_CAMP_HTTP_LONG,"ERROR");
sprintf_s(info_sens.camps_json.resp_data,OLV_MAX_CAMP_HTTP_LONG,"ResponseData");
CTime tt = CTime::GetCurrentTime();
sprintf_s(info_sens.fecha_fin,OLV_MAX_CAMP_HTTP_LONG,"%04d-%02d-%02dT%02d%%%%3A00%02d%%%%3A00%02d",tt.GetYear(),tt.GetMonth(),tt.GetDay(),
tt.GetHour(),tt.GetMinute(),tt.GetSecond());//"2017-10-19T13:44:00");
tt = tt - CTimeSpan(0,1,0,0); //una hora menos
sprintf_s(info_sens.fecha_ini,OLV_MAX_CAMP_HTTP_LONG,"%04d-%02d-%02dT%02d%%%%3A00%02d%%%%3A00%02d",tt.GetYear(),tt.GetMonth(),tt.GetDay(),
tt.GetHour(),tt.GetMinute(),tt.GetSecond());//"2017-10-19T13:44:00");
info_sens.modo_pet=OLV_SENS_PET_UNICO;
info_sens.porc_lim= 0;
if(olv->paths.path_cfg_geo[0])
{
if(!lee_campos_sens_ini(olv->paths.path_cfg_geo))
guarda_campos_sens_ini(olv->paths.path_cfg_geo);
}
}
//*************************************************************************************
BOOL Colv_reco::lee_campos_sens_ini(char *path)
{
Cini_file ini;
int ig;
if(!ini.lee(path))
return FALSE;
ig=ini.get_grupo(OLV_RECO_GRUPO_SENS);
if(ig<0)
return FALSE;//no existe grupo
//leer campos del ini
ini.dame_valor(ig,OLV_RECO_PARAM_FN,info_sens.camps.fn,"fn");
ini.dame_valor(ig,OLV_RECO_PARAM_ID,info_sens.camps.id,"id");
ini.dame_valor(ig,OLV_RECO_PARAM_USR,info_sens.camps.usr,"usr");
ini.dame_valor(ig,OLV_RECO_PARAM_PWD,info_sens.camps.pwd,"pwd");
ini.dame_valor(ig,OLV_RECO_PARAM_STRD,info_sens.camps.startdate,"startdate");
ini.dame_valor(ig,OLV_RECO_PARAM_ENDD,info_sens.camps.enddate,"enddate");
ini.dame_valor(ig,OLV_RECO_PARAM_FN_STAT,info_sens.fn_cont_status,"get_container_status");
ini.dame_valor(ig,OLV_RECO_PARAM_USR_USR,info_sens.usr,"VSM");
ini.dame_valor(ig,OLV_RECO_PARAM_PWD_PWD,info_sens.pwd,"VSM2017");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_ID,info_sens.camps_json.id,"ContainerID");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_HISTO,info_sens.camps_json.histo,"HistoricalFillingData");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_PORC,info_sens.camps_json.porc,"FillingPercentage");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_R_CODE,info_sens.camps_json.resp_code,"ResponseCode");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_R_CODE_ERR,info_sens.camps_json.resp_code_err,"ERROR");
ini.dame_valor(ig,OLV_RECO_PARAM_JS_R_DATA,info_sens.camps_json.resp_data,"ResponseData");
return TRUE;
}
//*************************************************************************************
BOOL Colv_reco::guarda_campos_sens_ini(char *path)
{
Cini_file ini;
int ig =ini.add_grupo(OLV_RECO_GRUPO_SENS);
if(ig<0)
return FALSE;
ini.add(ig,OLV_RECO_PARAM_FN,info_sens.camps.fn);
ini.add(ig,OLV_RECO_PARAM_ID,info_sens.camps.id);
ini.add(ig,OLV_RECO_PARAM_USR,info_sens.camps.usr);
ini.add(ig,OLV_RECO_PARAM_PWD,info_sens.camps.pwd);
ini.add(ig,OLV_RECO_PARAM_STRD,info_sens.camps.startdate);
ini.add(ig,OLV_RECO_PARAM_ENDD,info_sens.camps.enddate);
ini.add(ig,OLV_RECO_PARAM_FN_STAT,info_sens.fn_cont_status);
ini.add(ig,OLV_RECO_PARAM_USR_USR,info_sens.usr);
ini.add(ig,OLV_RECO_PARAM_PWD_PWD,info_sens.pwd);
ini.add(ig,OLV_RECO_PARAM_JS_ID,info_sens.camps_json.id);
ini.add(ig,OLV_RECO_PARAM_JS_HISTO,info_sens.camps_json.histo);
ini.add(ig,OLV_RECO_PARAM_JS_PORC,info_sens.camps_json.porc);
ini.add(ig,OLV_RECO_PARAM_JS_R_CODE,info_sens.camps_json.resp_code);
ini.add(ig,OLV_RECO_PARAM_JS_R_CODE_ERR,info_sens.camps_json.resp_code_err);
ini.add(ig,OLV_RECO_PARAM_JS_R_DATA,info_sens.camps_json.resp_data);
if(!ini.guarda(path))
return FALSE;
return TRUE;
}
//*************************************************************************************
#endif