Lotfi Baghli / Mbed 2 deprecated Weather_WT440H

Dependencies:   mbed

main.cpp

Committer:
lotfi_baghli
Date:
2013-03-30
Revision:
3:cd558875d654
Parent:
2:5a073ef49b21
Child:
4:df5635a8e10a

File content as of revision 3:cd558875d654:

#include "mbed.h"

DigitalOut myled(LED1);
DigitalOut led2(LED2);
DigitalIn Rx433(p18);
InterruptIn Rx433NotifyChange(p18);
Serial pc(USBTX, USBRX);
Timer T3;

#define TIMEOUT 1000
#define BIT0_LENGTH 2000
#define BIT1_LENGTH 1000
#define VARIATION 500
#define DATA_LENGTH 5
#define SENSOR_COUNT 4
#define NETWORK_COUNT 2
#define MSGLENGTH 36

//#define DEBUG
struct sensor {
    unsigned char humidity;
    signed char   temp_int;
    unsigned char temp_dec;
    signed char   min_int;
    unsigned char min_dec;
    signed char   max_int;
    unsigned char max_dec;
    time_t timestamp;
};
unsigned long T3saved_us;
unsigned char bitcount = 0;
unsigned char bytecount = 0;
unsigned char second_half = 0;
unsigned char data[DATA_LENGTH];
struct sensor measurement[NETWORK_COUNT][SENSOR_COUNT];
unsigned char minmaxday = 0;

unsigned int i,j;

void NCInterrupt()
{
    unsigned char i;
    unsigned char bit;
    unsigned long current = T3.read_us();
    unsigned long diff = current-T3saved_us;
    myled = ! myled;
    j++;
    T3saved_us=current;

    time_t t;

    if ( diff < BIT0_LENGTH + VARIATION && diff > BIT0_LENGTH - VARIATION ) {
        bit = 0;
        second_half = 0;
    } else if ( diff < BIT1_LENGTH + VARIATION && diff > BIT1_LENGTH - VARIATION ) {
        if (second_half) {
            bit = 1;
            second_half = 0;
        } else {
            second_half = 1;
            return;
        }
    } else {
        goto reset;
    }

    data[bitcount/8] = data[bitcount/8]<<1;
    data[bitcount/8] |= bit;
    bitcount++;

    if ( bitcount == 4 ) {
        if ( data[0] != 0x0c )
            goto reset;
        bitcount = 8;
#ifdef DEBUG
        pc.print('#');
#endif
    }

    if ( bitcount >= MSGLENGTH ) {
        unsigned char net, id;
        int t_int;
        unsigned char rh, t_dec;

#ifdef DEBUG
        for (i=0; i<DATA_LENGTH; i++) {
            pc.print(data[i], HEX);
            pc.print(' ');
        }
#endif

        /* Do not store all sensors */

        if ( net <= NETWORK_COUNT ) {
            measurement[net][id].temp_int = t_int;
            measurement[net][id].temp_dec = t_dec;
            measurement[net][id].humidity = rh;

            if ( !measurement[net][id].timestamp ||
                    day(t) != minmaxday ) {
                minmaxday = day(t);
                measurement[net][id].max_int = t_int;
                measurement[net][id].max_dec = t_dec;
                measurement[net][id].min_int = t_int;
                measurement[net][id].min_dec = t_dec;
            }

            if ( t_int > measurement[net][id].max_int ||
                    ( t_int == measurement[net][id].max_int && t_dec > measurement[net][id].max_dec ) ) {
                measurement[net][id].max_int = t_int;
                measurement[net][id].max_dec = t_dec;
            }

            if ( t_int < measurement[net][id].min_int ||
                    ( t_int == measurement[net][id].min_int && t_dec < measurement[net][id].min_dec ) ) {
                measurement[net][id].min_int = t_int;
                measurement[net][id].min_dec = t_dec;
            }


            measurement[net][id].timestamp = t;
        }

        goto reset;
    }
    return;

reset:
    for (i=0; i<DATA_LENGTH; i++)
        data[i] = 0;

    bytecount = 0;
    bitcount = 0;
    second_half = 0;
    return;
}

int main()
{
    i=0;
    T3.start();
    pc.baud(115200);
    Rx433NotifyChange.mode(PullNone);
    Rx433NotifyChange.rise(&NCInterrupt);
    Rx433NotifyChange.fall(&NCInterrupt);
    while(1) {
        led2 = !led2;
        wait(0.5);

//        i=(Rx433==1);
//        pc.printf("rx= %d ", i);
        pc.printf("%d", i);
//        i++;
        /*
                pc.print("Data: NET:");
                net = 0x07 & (data[1]>>4)-1;
                pc.print(net,DEC);
                pc.print(" ID:");
                id = 0x03 & (data[1]>>2);
                pc.print(id, DEC);
                pc.print(" RH:");
                rh = data[2];
                pc.print(rh, DEC);
                pc.print(" T:");
                t_int = data[3]-50;
                pc.print(t_int, DEC);
                t_dec = data[4]>>1;
                pc.print('.');
                pc.print(t_dec,DEC);


                t = now();

                pc.print(" DATE:");
                serialPrintDate(t);

                pc.print(" TIME:");
                serialPrintTime(t);

                pc.print("\r\n");
        */
    }
}