Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include <postgresql/libpq-fe.h>
- #include <unistd.h>
- #define NSENSORS 5
- #define OUTDOOR 2
- #define HOME 3
- #define GARDEN 1
- const char *conn = "host='db.fe.up.pt' user='sinfe32' password='UgeVMoBA'";
- static PGconn *dbconn;
- long GATE=0,IRRSYS=0,FLOOR=0,LUZ_HOME=0,TEMP_HOME=0;
- float temperatureSensors[NSENSORS];
- float humiditySensors[NSENSORS];
- float lightSensors[NSENSORS];
- float irlightSensors[NSENSORS];
- double voltage(int pos1, int pos2)
- {
- double v;
- v = pos1*16*16+pos2;
- v = (v/4096)*1.5;
- return v;
- }
- double vlight(int pos1, int pos2)
- {
- double v;
- v = pos1*16*16+pos2;
- v = (0.625*pow(10,6)*(v/4096)*1.5)/100;
- return v;
- }
- double infra(int pos1, int pos2)
- {
- double i;
- i = pos1*16*16+pos2;
- i = (0.769*pow(10,5)*(i/4096)*1.5)/100;
- return i;
- }
- double temperature(int pos1, int pos2)
- {
- double t;
- t = pos1*16*16+pos2;
- t = -39.6+0.01*t;
- return t;
- }
- double relhumi(int pos1, int pos2)
- {
- double r;
- r = pos1*16*16+pos2;
- r = -2.0468+.0367*r-1.5955*pow(10,-6)*r*r;
- return r;
- }
- double comphumi(int pos1, int pos2, int temptfunc, int relahumifunc)
- {
- double h;
- h = pos1*16*16+pos2;
- h = (temptfunc-25)*(0.01+0.00008*h)+relahumifunc;
- return h;
- }
- void sql_init(){
- dbconn = PQconnectdb(conn);
- if (PQstatus(dbconn) == CONNECTION_BAD){
- printf("Unable to connect\n");
- exit(-1);
- }
- else{
- printf("Able to connect!\n");
- }
- }
- //void print_db(){
- // char
- //}
- void update_state(int id){
- char q[500];
- sprintf(q,"SELECT sensor,sinal,valor,atuador,estado FROM has.regras WHERE divisoes_id = %d", id);
- PGresult *query = PQexec(dbconn,q);
- for(int i = 0; i < PQntuples(query);i++){
- //printf("sensor: %s sinal: %s valor: %s atuador: %s estado: %s\n", PQgetvalue(query,i,0),PQgetvalue(query,i,1),PQgetvalue(query,i,2),PQgetvalue(query,i,3),PQgetvalue(query,i,4));
- sprintf(q,"UPDATE has.atuadores SET estado = CASE WHEN (SELECT medicao FROM has.sensores WHERE nome=\'%s\') %s %s THEN %s WHEN (SELECT medicao FROM has.sensores WHERE nome=\'%s\') %s %s THEN %s END WHERE nome = \'%s\' ", PQgetvalue(query,i,0),PQgetvalue(query,i,1),PQgetvalue(query,i,2),PQgetvalue(query,i,4),PQgetvalue(query,i,0),PQgetvalue(query,i,1),PQgetvalue(query,i,2),PQgetvalue(query,i,4),PQgetvalue(query,i,3));
- //printf("%s\n",q);
- PQexec(dbconn,q);
- }
- }
- void sql_update(int id){
- char q[500];
- /*sprintf(q,"UPDATE has.atuadores SET estado = %d WHERE nome = \'gate\';",GATE);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.atuadores SET estado = %d WHERE nome = \'floor\';",FLOOR);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.atuadores SET estado = %d WHERE nome = \'luz_home\';",LUZ_HOME);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.atuadores SET estado = %d WHERE nome = \'temp_home\';",TEMP_HOME);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.atuadores SET estado = %d WHERE nome = \'irrsys\';", IRRSYS);
- PQexec(dbconn,q);
- */
- sprintf(q,"UPDATE has.sensores SET medicao= %5f, timestamp = now() WHERE mote_id=%d AND nome=\'temp\'",temperatureSensors[id],id);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.sensores SET medicao= %5f, timestamp = now() WHERE mote_id=%d AND nome=\'luz\'",lightSensors[id],id);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.sensores SET medicao= %5f, timestamp = now() WHERE mote_id=%d AND nome=\'hum\'",humiditySensors[id],id);
- PQexec(dbconn,q);
- sprintf(q,"UPDATE has.sensores SET medicao= %5f, timestamp = now() WHERE mote_id=%d AND nome=\'irr\'",irlightSensors[id],id);
- PQexec(dbconn,q);
- }
- int main(){
- int str[23] = {0};
- char *token;
- char message[255];
- double volt;
- unsigned long id;
- sql_init();
- while(1){
- int i = 0;
- fgets(message, 255, stdin);
- printf("%s\n", message);
- token = strtok(message, " ");
- while(token != NULL)
- {
- str[i] = strtol(token,NULL,16);
- printf("%d ",str[i]);
- token = strtok(NULL, " ");
- i++;
- }
- id = str[5]<<8 | str[6];
- temperatureSensors[id] = temperature(str[16],str[17]);
- humiditySensors[id] = relhumi(str[18],str[19]);
- lightSensors[id] = vlight(str[12],str[13]);
- irlightSensors[id] = infra(str[14],str[15]);
- if(irlightSensors[OUTDOOR]==0) (GATE=1);
- if(irlightSensors[OUTDOOR]==1) (GATE=0);
- if(humiditySensors[GARDEN]>25) (IRRSYS=0);
- if(humiditySensors[GARDEN]<40) (IRRSYS=1);
- if(temperatureSensors[GARDEN]<5) (FLOOR=1);
- if(temperatureSensors[GARDEN]>20) (FLOOR=0);
- if(lightSensors[HOME]<300) (LUZ_HOME=1);
- if(lightSensors[HOME]>500) (LUZ_HOME=0);
- if(temperatureSensors[HOME]<20) (TEMP_HOME=1);
- if(temperatureSensors[HOME]>22) (TEMP_HOME=0);
- printf("\n Temperatura: %fΒΊC\n Humidade rel: %f%% \n Voltage: %fV\n Visible light: %flux \n Infrared light: %flux \n\n", temperatureSensors[id], humiditySensors[id], volt, lightSensors[id],irlightSensors[id]);
- sql_update(id);
- update_state(1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement