377 lines
12 KiB
C++
377 lines
12 KiB
C++
#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 |