main2.c 11.9 KB
#include <string.h>
#include "libwismart.h"
#include "libwismart_irqs.h" /* implement irq handlers */
#include "lwip/inet.h"
#include "globals.h"
#include "httpClient.h"
#include "callbacks.h"
#include "buffer.h"
#include "i2c.h"
#include "configServer.h"

#define WIFI_MODE               WIFI_MODE_CLIENT
#define NETWORK_SSID_AP         "modularsens"
#define NETWORK_KEY_AP          NULL
#define NETWORK_CHANNEL_AP      1

#define HARD_LIMIT_WAIT_TIME 10*1000 //5*60*1000
#define NUMSENSORS 4

wismart_registryKey_t geo;


void initLibwismart(void)
{
    wismart_hwif_t hwif = libwismart_GetDefaultHWIF();
    libwismart_Init(hwif);
}

uint8_t connected=0;
uint8_t timeout=0;
uint8_t retries=0;

void init_registry(void)
{
    config_params_t config;

    strcpy(config.localization,"none");
    libwismart_RegistryCreateKey(&geo, 1, sizeof(config));
    libwismart_RegistryOpen(1);
    if(!libwismart_RegistryIsValueEmpty(&geo))
    {
        libwismart_RegistryGet(&geo,&config);
    }

    printf("SSID = %s\r\n",config.ssid);
    printf("Wep key = %s\r\n",config.wepkey);
    printf("Passphrase = %s\r\n", config.passphrase);
    printf("User = %s\r\n",config.user);
    printf("Password = %s\r\n",config.password);
    printf("Encryption type = %d\r\n",config.security);
    printf("Geo Localization = %s\r\n", config.localization);

    strcpy(mod.geoloc,config.localization);
    if(config.security == PROFILE_SECURITY_OPEN)
    {
        printf("open detected\r\n");
        libwismart_WiFiConnect(config.ssid,NULL,wifi_connect_result_cb);
    }
    else if(config.security == PROFILE_SECURITY_WPA_WPA2)
    {
        if(!strcmp(config.user,""))
        {
            printf("wpa detected\r\n");
            libwismart_WiFiConnect(config.ssid,config.passphrase,wifi_connect_result_cb);
        }
        else
        {
            printf("wpa Enterprise detected\r\n");
            struct wpa_param wpa;
            wpa.eap_method = WISMART_EAP_METHOD_TTLS;
            wpa.u.ttls.identity = config.user;
            wpa.u.ttls.password = config.password;
			wpa.u.ttls.ca_cert=NULL;
            libwismart_WiFiConnectEnterprise(config.ssid, &wpa, wifi_connect_result_cb);
        }
    }
    else
    {
        printf("wep detected\r\n");
        //Is WEP
        libwismart_WiFiConnect(config.ssid,config.wepkey,wifi_connect_result_cb);
    }
	while(connected == 0 && timeout != 1  )
    {chThdSleepMilliseconds(500);}

}

void send_data()
{
    int j;
    for(j=0;j<TOTAL_SENSORS;j++)
    {
        printf(" enviant buffer %d\r\n",j);
        
        // fem servir 085 de prova, però haurem de fer servir sensor_id[j]
        int ok=send(buffers[j],&ind[j],&sizes[j], mod.ID, sensors[j]);

        if(ok==JSON_COMM_ERROR)
        {
            printf("wismart is not connected\r\n");
        }
        else if( ok==JSON_OTHER_ERROR){
            printf("some error ocurred\r\n");
        }
        else if(ok ==JSON_POST_OK){
            printf(" send OK \r\n");
        }
    }
}

void put_buffers(char** buffers,uint32_t ind[],uint32_t sizes[],char* valueSensors[]){
int i;
    for(i=0;i<TOTAL_SENSORS;i++){
        put_message(valueSensors[i], buffers[i] ,&ind[i],&sizes[i]);
    }

}

int main(void)
{
    initLibwismart();
    libwismart_PowerSave_Enable();
    libwismart_PowerSave_HigherProfile(TRUE);
    libwismart_RegisterDhcpCB(dhcp_connect_result_cb);
    libwismart_WiFiInit();
    libwismart_SetScanRunsForConnTimeout(4); //Edit a 4
	libwismart_EnableBsdSocketAPI();

    //Escanea los sensores -> retorna un vector con las direcciones en cada posición del vector, si la posición del vector retorna un cero -> no existe el sensor
    uint8_t sensors[TOTAL_SENSORS];
    char* valueSensors[TOTAL_SENSORS];
    I2C_scan(sensors);

    
    //unsigned int time = getNTPTime();
    unsigned int time = getSecsSince1900();

    unsigned int timestamp = 0;
    unsigned int delay = getSystemTime();
    unsigned int delay2 = 0;
    sleep_thread(SHORT_PERIOD - time%SHORT_PERIOD);

    uint32_t ind[4]={0};
    char** buffers[4];
    uint32_t sizes[4]={0};

    init_registry();
    
    if(timeout==1)
    {
        printf("Creating AP\r\n");
        //corroborar los parametros del AP
        configServer_start(1);
        libwismart_WiFi_SoftAP_Start(NETWORK_SSID_AP,NETWORK_CHANNEL_AP,NULL,softapMode_apStartedCb, softapMode_clientIndicationCb);
        for(;;)
        {
            chThdSleepMilliseconds(1000);
        }
    
    int i  = 1;
    while(1){
        time += getElapsedTime(delay);
        printf("time (absolute):\t%d\r\ntime mod LONG_PERIOD:\t%d\r\ntime mod SHORT_PERIOD:\t%d\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD);

        delay = getSystemTime();
        /* Collect data from sensors */
        //collect_data(/*a_rawData*/);
        collect_data(valueSensors, sensors);
        

        time += getElapsedTime(delay);
        printf("time (absolute):\t%d\r\ntime mod LONG_PERIOD:\t%d\r\ntime mod SHORT_PERIOD:\t%d\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD);
        
        delay = getSystemTime();
        //cada mitja hora
        if (i == LONG_PERIOD/SHORT_PERIOD ){
            /* Wi-Fi connect */
            wifi_connect();
            /* Send data to server, empty the buffer */
            send_data();
            //time = getNTPTime();
            time = getSecsSince1900();
            printf("time (absolute):\t%d\r\ntime mod LONG_PERIOD:\t%d\r\ntime mod SHORT_PERIOD:\t%d\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD);
            i = 0;
        }
        delay2 = getElapsedTime(delay);
        
        delay = getSystemTime();
        timestamp = time - delay2;
        printf("timestamp (absolute):\t%d\r\ntimestamp mod LONG_PERIOD:\t%d\r\ntimestamp mod SHORT_PERIOD:\t%d\r\n",timestamp,timestamp%LONG_PERIOD,timestamp%SHORT_PERIOD);
        
        /* Add data to the buffer with timestamp*/
        put_buffers(buffers,ind,sizes,valueSensors);
        printf("mirant memoria\r\n");
        int res=check_memory();
        if(res==SOFT_REACHED){
            printf("--------------soft limit-------------\r\n");
            int j;
            for(j=0;j<TOTAL_SENSORS;j++)
            {
                printf(" enviant buffer %d\r\n",j);
                
                // fem servir 085 de prova, però haurem de fer servir sensor_id[j]
                int ok=send(buffers[j],&ind[j],&sizes[j], mod.ID, sensor_id[j]);

                if(ok==JSON_COMM_ERROR)
                {
                    printf("wismart is not connected\r\n");
                }
                else if( ok==JSON_OTHER_ERROR){
                    printf("some error ocurred\r\n");
                }
                else if(ok ==JSON_POST_OK){
                    printf(" send OK \r\n");
                }
            }
        }
        else if(res==HARD_REACHED){
            printf("--------------hard limit-------------\r\n");
            
            // fem servir 085 de prova, però haurem de fer servir sensor_id[0]
            while( send(buffers[0],&ind[0],&sizes[0], mod.ID, sensors[j]) != JSON_POST_OK )
            {
                // El servidor no ens sap dir si tenim permisos o no sense registrar una mostra.
                // Intentem enviar un buffer sencer, a veure si ja podem buidar.
                // No podem enviar només una mostra perquè json és rígid en aquest sentit.
            
                printf("hard_reached and unable to sentd.\r\nLa biblia en vers: i Jesús digué: Aixeca't, Llàtzer!!\r\n");
                chThdSleepMilliseconds(HARD_LIMIT_WAIT_TIME);
            }
            int j;
            for(j=1;j<TOTAL_SENSORS;j++)
            {
                printf(" enviant buffer %d\r\n",j);
                
                // fem servir 085 de prova, però haurem de fer servir sensor_id[j]
                int ok=send(buffers[j],&ind[j],&sizes[j], mod.ID, sensors[j]);
                if(ok==JSON_COMM_ERROR)
                {
                    printf("wismart is not connected\r\n");
                }
                else if( ok==JSON_OTHER_ERROR){
                    printf("some error ocurred\r\n");
                }
                else if(ok ==JSON_POST_OK){
                    printf(" send OK \r\n");
                }
            }
        }
        //a_cookedData = format_data(a_rawData, timestamp);

        time += getElapsedTime(delay);
        printf("time (absolute):\t%d\r\ntime mod LONG_PERIOD:\t%d\r\ntime mod SHORT_PERIOD:\t%d\r\n",time,time%LONG_PERIOD,time%SHORT_PERIOD);
        
        delay = getSystemTime();
        sleep_thread(SHORT_PERIOD - time%SHORT_PERIOD);
        i++;
    }



    


//A partir de aquí se debe integrar arriba, preferiblemente con funciones María
    uint32_t ind[4]={0};
    char** buffers[4];
    uint32_t sizes[4]={0};
	char* sensor_id[4];
    int i;
    
    
   init_registry();
    
    if(timeout==1)
    {
        printf("Creating AP\r\n");
        //corroborar los parametros del AP
        configServer_start(1);
        libwismart_WiFi_SoftAP_Start(NETWORK_SSID_AP,NETWORK_CHANNEL_AP,NULL,softapMode_apStartedCb, softapMode_clientIndicationCb);
        for(;;)
        {
            chThdSleepMilliseconds(1000);
        }
    }
    for(;;)
    {
        // i2c gets the data and combines it with the time stamp
            char* data="message,0";
            char* data2="message,1";
            char* data3="message,2";
            for(i=0;i<NUMSENSORS;i++){

                printf("------------------BUFFER %d ----------------------\r\n",i);
                printf("index=%d\r\n",ind[i]);
				
				// 3 missatges de prova a cada buffer
                buffers[i]=put_message(data, buffers[i] ,&ind[i],&sizes[i]);
                buffers[i]=put_message(data2, buffers[i] ,&ind[i],&sizes[i]);
                buffers[i]=put_message(data3, buffers[i] ,&ind[i],&sizes[i]);
                printf("mirant memoria\r\n");
                int res=check_memory();
                /*if(res==SOFT_REACHED){
                    printf("--------------soft limit-------------\r\n");
					int j;
					for(j=0;j<NUMSENSORS;j++)
					{
						printf(" enviant buffer %d\r\n",j);
						
						// fem servir 085 de prova, però haurem de fer servir sensor_id[j]
						int ok=send(buffers[j],&ind[j],&sizes[j], "bmp", "085");
						if(ok==JSON_COMM_ERROR)
						{
							printf("wismart is not connected\r\n");
						}
						else if( ok==JSON_OTHER_ERROR){
							printf("some error ocurred\r\n");
						}
						else if(ok ==JSON_POST_OK){
							printf(" send OK \r\n");
						}
					}
                }
                else if(res==HARD_REACHED){
					printf("--------------hard limit-------------\r\n");
                    
					// fem servir 085 de prova, però haurem de fer servir sensor_id[0]
					while( send(buffers[0],&ind[0],&sizes[0], "bmp", "085") != JSON_POST_OK )
					{
						// El servidor no ens sap dir si tenim permisos o no sense registrar una mostra.
						// Intentem enviar un buffer sencer, a veure si ja podem buidar.
						// No podem enviar només una mostra perquè json és rígid en aquest sentit.
					
						printf("hard_reached and unable to sentd.\r\nLa biblia en vers: i Jesús digué: Aixeca't, Llàtzer!!\r\n");
						chThdSleepMilliseconds(HARD_LIMIT_WAIT_TIME);
					}
					int j;
					for(j=1;j<NUMSENSORS;j++)
					{
						printf(" enviant buffer %d\r\n",j);
						
						// fem servir 085 de prova, però haurem de fer servir sensor_id[j]
						int ok=send(buffers[j],&ind[j],&sizes[j], "bmp", "085");
						if(ok==JSON_COMM_ERROR)
						{
							printf("wismart is not connected\r\n");
						}
						else if( ok==JSON_OTHER_ERROR){
							printf("some error ocurred\r\n");
						}
						else if(ok ==JSON_POST_OK){
							printf(" send OK \r\n");
						}
					}
                }*/
            }
        //chThdSleepMilliseconds(100);
    }
}