Initial commit

Dependencies:   MODSERIAL Terminal TextLCD mbed

main.cpp

Committer:
anmar
Date:
2014-12-05
Revision:
1:a6b0e0ce3e7a
Parent:
0:0903545c0460

File content as of revision 1:a6b0e0ce3e7a:

/* 
* Anders Markland, Knightec AB
* 2013-11-15
*
*
*/

#include "mbed.h"

#include "Terminal.h"
#include "MODSERIAL.h"
#include "TextLCD.h"
#include "defines.h"
#include "mytimer.h"
//#include "presence.h"
//#include "thermal.h"



#define C_ae (0xE4)
#define C_aa (0xE5)
#define C_oe (0xF6)

#define C_AE (0xC4)
#define C_AA (0xC5)
#define C_OE (0xD6)


#define L_ae (0x84)
#define L_aa (0x94)
#define L_oe (0xF6)

#define L_AE (0x8E)
#define L_AA (0x8F)
#define l_OE (0x99)



Terminal *term; 
DigitalInOut reset(p9);
DigitalOut led1(LED1);  
DigitalOut led2(LED2);  
DigitalOut led3(LED3);  
DigitalOut led4(LED4);  

//Presence *presence;
//I2C i2c(p28, p27);
//I2C *i2c;


SPI spi_lcd(p5, NC, p7); // MOSI, MISO, SCLK
TextLCD lcd(&spi_lcd, p15, p8, TextLCD::LCD16x2); // SPI bus, CS pin, LCD Type ok

int presence = 0;

int seconds_since_movement = 0;
int last_inactive_period = 0;
int seconds_since_last_update = 0;

MODSERIAL radio(p9, p10); // tx, rx
//Serial uart(p13, p14);

int receiver = 0;

double  dt[16];
double  d_PTAT;


void pad(char *ptr, int l);

int D6T_getvalue();
int D6T_checkPEC( uint8_t buf[] , int pPEC ); 
void measure(); 
uint8_t calc_crc( uint8_t data );
char readbuff[35]; 
int tPTAT; 
int tP[16]; 
int tPEC; 
int time_since_ping;

uint8_t showoutput = 0;

 
 
// bool newline_detected = false;
 
// Called everytime a new character goes into
// the RX buffer. Test that character for \n
// Note, rxGetLastChar() gets the last char that
// we received but it does NOT remove it from
// the RX buffer.
/*void rxCallback(MODSERIAL_IRQ_INFO *q) {
    MODSERIAL *serial = q->serial;
    if ( serial->rxGetLastChar() == '\n') {
        newline_detected = true;
    }
}*/
  
 
 
Ticker flipper;
Ticker msflip;
Ticker sflip;

uint16_t msticks;
uint8_t print_tick;
 
void flip() 
{
    time_since_ping++;
    
    if ( receiver )
        if ( time_since_ping > 10 )
        {
            led2 = 1;
            led3 = 1;
            led4 = 1;
        }
        else 
        {
            led2 = 0;
            led3 = 0;
            led4 = 0;
        }
}
 
void ms()
{
    msticks++; 
} 
 
 
void s()
{
    seconds_since_last_update++; 
    print_tick++;
} 
 
 
enum StateType { Init, PresenceDetected, LastPresenceDetected, CommunicationFault } displayState;
 
 
 
 
/* 

------------------
" Scaniasatellit "
" bemannad       "
------------------ 

------------------
" Inaktivitet    "
" 00:03:22       "
------------------ 
  
------------------
" Fel:           "
" Kommunikation  "
------------------ 
*/

 
 
void showPresence(int s)
{
    time_t seconds = s;
    char str[32];
    char buf[30];


    struct tm *timeinfo;
    timeinfo  = localtime(&seconds);


    
    strftime(str, 32, "%T", localtime(&seconds));
    
    
    //lcd.cls();
    lcd.locate(0,0);
    
    char pr[10];
     
    if ( presence )
    {
        strcpy(pr, "Ja");
        sprintf(buf, " N%crvaro: %s", L_ae, pr);
        pad(buf, 16);
        lcd.printf("%s", buf);
    
        if ( s > 30 )
        {
            sprintf(buf, " %dd %s", timeinfo->tm_yday,  str);
        }
        else
        {
            strcpy(buf, " ");
        }
        pad(buf, 16);
        lcd.printf("%s", buf);
        
    }
    else
    {
        if ( s > 180 * 60 )         // No movement for 3 hours --> probably false trigger
            strcpy(pr, "Nej");
        else
            strcpy(pr, "?");    
        sprintf(buf, " N%crvaro: %s", L_ae, pr);
        pad(buf, 16);
        lcd.printf("%s", buf);
      
        
        sprintf(buf, " %dd %s", timeinfo->tm_yday,  str);
        pad(buf, 16);
        lcd.printf("%s", buf);
    }
}
 
void showAbsence(int s)
{
    time_t seconds = s;
    char str[32];

    strftime(str, 32, "%T", localtime(&seconds));
    
    lcd.cls();    
    //int inactiveTime;
    lcd.printf(" Inaktivitet   ");
    lcd.printf(" [%c] %s", presence?'X':' ', str);
}
 
void showError()
{
    lcd.cls();
    lcd.printf(" Fel:          ");
    lcd.printf(" Kommunikation "); 
} 


void pad(char *ptr, int l)
{
    int len = strlen (ptr);
    while ( len < l )
    {
        ptr[len++] = ' ';
        ptr[len] = '\0';
    }    
}

 
  
int main() 
{
    int last_elapsed_time = 0;
    
    displayState = Init;

    //set_time(0);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
    
    receiver = 1;   //DEBUG
    
    term = new Terminal(USBTX, USBRX);
    //presence = new Presence(term);
   
    flipper.attach(&flip, 1.0);
    msflip.attach_us(&ms, 1000);
    sflip.attach(&s, 1);
 
    
    term->baud(115200);

    radio.baud(9600);
    //radio.attach(&rxCallback, MODSERIAL::RxIrq);

    //uart.baud(9600);

    term->cls();
    term->locate(0, 0);
    term->foreground(RED);
    term->printf("\n\rConnected to presence detector...\n\r");
    //term->printf("\nPress 'o' to activate output\n\n\r");

    term->foreground(WHITE);
    term->printf("Delay\r\n");
 
    //lcd.cls();
      

    lcd.printf("Hello"); 
 
    char buffer[32];
    time_t seconds = time(NULL);
  
  
    strftime(buffer, 32, "%F %T\n", localtime(&seconds));
    term->printf("Current time %s", buffer);    
     
    
    while (1) 
    {
        char ch;
        char buffer[50];
        int pos = 0;
        char rx;
        
        msticks = 0;
        /*while ( uart.readable() )
        {
           term->printf("%c", uart.getc());    
        } */
        
        if ( radio.readable() )
        {
            while ( msticks < 100 )
            {
                if ( radio.readable() )
                {
                    rx = radio.getc();
                    if ( rx == '!' )                    // Look for start of package
                    {
                        pos = 0;
                    }
                    //term->printf("%c", rx);
                    buffer[pos++] = rx;
                            
                    if ( rx == '\n' || pos > 40 )       // Prevent garbage from causing buffer overflow
                    {
                        buffer[pos] = '\0';
                        break;
                    }
                    //term->printf(",");
                }
            } 
        }
        
    
        if ( buffer[0] == '!' && (buffer[1] == 'M' || buffer[1] == 'P') && buffer[9] == '\n' ) //&& strlen(buffer) == 10 )
        {                                       // format: "!M00000pp\n"    Where "00000" are number of second since last movement and 'pp' is the ASCII hex coded xor parity byte
            uint8_t p = 0;
            char *ptr;
            int parity;
            char text[10];
            
            
            if ( buffer[1] == 'P' ) 
            {
                presence = 1;    
            }
            else
            {
                presence = 0;    
            }
            
            for ( uint8_t x = 0; x < 7; x++ )
            {
                p ^= buffer[x];  
            }
              
            ptr = buffer + 7;
            sscanf(ptr, "%x", &parity);
            
            //printf("%d %d\r\n", p, parity);
             
            if ( p == parity )
            {
                strncpy(text, buffer + 2, 5);
                text[5] = '\0';
                
                sscanf(text, "%d", &seconds_since_movement);
                seconds_since_last_update = 0;
                
                /*if ( seconds_since_movement < 10 )
                {
                    //printf("\xe2\x88\x9e\n");
                    if ( displayState != PresenceDetected )
                    {
                        displayState = PresenceDetected;
                        //printf("\r\nN%crvaro detekterad                 \r\n", C_ae);
                        //printf("%d\r\n", last_elapsed_time);
                    }
                }    
                else   
                {
                    displayState = LastPresenceDetected;
                   // printf("Seconds since last movement: %d    \r", seconds_since_movement);
                } */
            }    
        }
        /*else if ( !strcmp(buffer, "!P1\n") )
        {                                       // format: "!P1\n"    Confirmed presence
            seconds_since_last_update = 0;
            seconds_since_movement = 0;
        } */
           
        memset(buffer, '\0',10);                // Clear buffer until next packet is received
    
    //Presence, LastPresenceDetected, CommunicationFault } displayState;
    
        if ( print_tick )
        {
            time_t seconds = time(NULL);
            char str[32];
            strftime(str, 32, "[%F %T]", localtime(&seconds));
            
            
            showPresence(seconds_since_movement);
            
            if ( seconds_since_movement )
            {
                //showAbsence(seconds_since_movement);
                if ( displayState != LastPresenceDetected )
                {
                    term->printf("%s D%crr %cppnad/st%cngd\r\n", str, C_oe, C_oe, C_ae);
                    displayState = LastPresenceDetected;
                    //showAbsence();
                }
                if ( seconds_since_movement > last_inactive_period )
                {
                    last_inactive_period = seconds_since_movement;
                }
            }
            else
            {
//                showPresence(seconds_since_movement);
                
                if ( displayState != PresenceDetected )
                {
                    term->printf("Idle: %d\r\n", last_inactive_period);
                    term->printf("%s N%crvaro detekterad\r\n", str, C_ae);
                    
                    displayState = PresenceDetected;
                    last_inactive_period = 0;
                }
            }
            
            if ( seconds_since_movement < last_elapsed_time )
            {
                //printf("%s %d\r\n", str, last_elapsed_time);
            }
            
            //printf("%d %d\r\n", seconds_since_movement, last_elapsed_time);
            
            last_elapsed_time = seconds_since_movement;
            if ( seconds_since_last_update > 10 )
            {
                //if ( displayState != CommunicationFault )
                {
                    displayState = CommunicationFault;
                    term->printf("%s Kommunikationsfel %d\r\n", str, seconds_since_last_update);
                }
            }
            print_tick = 0;
        }        
        
        
        if ( term->readable())
        {
            ch = term->getc();
    
            switch(ch)
            {
case 'r':
                reset.output();
                break;            

case 't': 
                int y;
                int m;
                int d;
                int h;
                int mi;
                int s;
                char buf[100];
                char *ptr;
                term->printf("Enter new time: YYYY-MM-DD-HH-MM-SS\r\n");
                term->scanf("%s", buf); 
                sscanf(buf, "%4d-%2d-%2d-%2d-%2d-%2d", &y, &m, &d, &h, &mi, &s);
                
/*                term->printf("Entered string: %s\r\n", buf);
                term->printf("%4d-%2d-%2d %2d:%2d:%2d", y, m, d, h, mi, s); */
                             
                
              
                time_t rawtime;
                struct tm * timeinfo;
                //int year, month ,day;
                const char * weekday[] = { "Sunday", "Monday",
                                             "Tuesday", "Wednesday",
                                             "Thursday", "Friday", "Saturday"};
                
                /* get current timeinfo and modify it to the user's choice */
                time ( &rawtime );
                timeinfo = localtime ( &rawtime );
                timeinfo->tm_year = y - 1900;
                timeinfo->tm_mon = m - 1;
                timeinfo->tm_mday = d;
                  
                timeinfo->tm_hour = h;
                timeinfo->tm_min = mi; 
                timeinfo->tm_sec = s; 
                  
                
                /* call mktime: timeinfo->tm_wday will be set */
                set_time(mktime ( timeinfo ));


                time_t seconds = time(NULL);
                char str[32];
                strftime(str, 32, "[%F %T]", localtime(&seconds));
                term->printf("New time: %s\r\n", str);
                
                break;
case 'o':
                printf("Toggle output\r\n");
                showoutput = !showoutput;
                term->cls();
    
                break;
                
default:
                break;        
            }
        }    
        
//        led1 = !led1;
        
        if ( showoutput )
        {
            /*clear_screen++;
            if ( clear_screen > 50 )
            {
                term->cls();
                clear_screen = 0;
            }*/
            /*term->locate(0, 0);
            
            term->printf("Sensor output:\r\n");
            term->printf("--------------------------------------------------\r\n");            */         
            //presence->thermal->measure();
                        
            for ( int x = 0; x < 4; x++ )
            {
                for ( int y = 0; y  < 4; y++ )
                {
                    
/*                    term->foreground(RED); 
                    term->foreground(YELLOW); 
                    term->foreground(GREEN);                        
                    term->printf("%1.3fV    ", voltage);
                    term->foreground(WHITE);*/
                }
            //    term->printf("\r\n");
            }
        }
       
        //wait(0.2);        
    }
}