main2.c 9.73 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"
#include "timer-loop.h"
#include "ntp.h"
#include "sensors.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

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;
uint8_t sensors_length=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(char** buffers[], uint32_t ind[], uint32_t sizes[], uint8_t sensors[])
{
    int j;
    for(j=0;j<sensors_length;j++)
    {   
        printf(" enviant buffer %d\r\n",j);
        
        // fem servir 085 de prova, però haurem de fer servir sensor_id[j]
        char id[3];
        sprintf(id,"%x",sensors[j]);
        int ok=send(buffers[j],&ind[j],&sizes[j], mod.ID, id);

        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** cooked, uint8_t* sensors){
    int i;
    for(i=0;i<sensors_length;i++){ 
        put_message(cooked[i], buffers[i] ,&ind[i],&sizes[i]);
        chHeapFree(cooked[i]);
    }

}
char** timestamp_datas(char* value[],unsigned long timestamp, uint8_t* sensors){
    char** cooked_data;
    cooked_data = (char**) chHeapAlloc(NULL,sensors_length * sizeof(char*));
    Date t=getDate(timestamp);
    int i;
    for(i=0;i<sensors_length;i++){
        
        cooked_data[i]=timestamp_data(value[i], t);
        chHeapFree(value[i]);
        
    }
    return cooked_data;
}


void wifi_connect(void)
{
    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);
        }
    }
}

void wifi_disconnect(void){
    uint8_t res=libwismart_WiFiDisconnect();
     if(res)
        printf("WIFI_DISCONNECT_SUCCESS\r\n");
     else
        printf("WIFI_DISCONNECT_FAILURE\r\n");
}

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];
    memset (sensors, 0, TOTAL_SENSORS);

    char* valueSensors[TOTAL_SENSORS];
    memset (valueSensors, 0, TOTAL_SENSORS);

    I2C_scan(sensors);
    sensors_length=strlen(sensors);
    //registrar sensores
    //Esta funcion esta mas arriba para no repetir código luego -- Imanol
    wifi_connect();
    //unsigned int time = getNTPTime();
    unsigned int time = getSecsSince1900();
    //desconectarwifi
    wifi_disconnect();

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

    uint32_t ind[sensors_length]={0};
    char** buffers[sensors_length];
    uint32_t sizes[sensors_length]={0};
    //char* cooked_data[TOTAL_SENSORS];
    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*/);
        collectData(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(buffers, ind, sizes, sensors);
            //time = getNTPTime();
            time = getSecsSince1900();
            //desconectar wifi
            wifi_disconnect();
            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*/
        
        //a_cookedData = format_data(a_rawData, timestamp);
        char** values=timestamp_datas(valueSensors,timestamp,sensors);
        put_buffers(buffers,ind,sizes,values,sensors);

        printf("mirant memoria\r\n");
        int res=check_memory();
        if(res==SOFT_REACHED){
            printf("--------------soft limit-------------\r\n");
            wifi_connect();
            send_data(buffers, ind, sizes, sensors);
            //disconect_wifi()
            wifi_disconnect();
        }
        else if(res==HARD_REACHED){
            printf("--------------hard limit-------------\r\n");
            wifi_connect();
            // fem servir 085 de prova, però haurem de fer servir sensor_id[0]
            char id_0[3];
            sprintf(id_0,"%x",sensors[0]);
            while( send(buffers[0],&ind[0],&sizes[0], mod.ID, id_0) != 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<sensors_length;j++)
            {   
                
                printf(" enviant buffer %d\r\n",j);
                // fem servir 085 de prova, però haurem de fer servir sensor_id[j]
                char id[3];
                sprintf(id,"%x",sensors[j]);
                int ok=send(buffers[j],&ind[j],&sizes[j], mod.ID, id);
                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");
                } 
                
            }
            wifi_disconnect();
        }
        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++;
    }  
}