SOFT253 ASSIGNMENT

Dependencies:   LPS25H hts221

Fork of SOFT253_Assignment_V4 by lucas kovaci

main.cpp

Committer:
shikong
Date:
2017-05-15
Revision:
50:6f0b82711082
Parent:
49:0dfef3825422
Child:
51:dd88bae2a7e5

File content as of revision 50:6f0b82711082:


#include "mbed.h"
#include "rtos.h"
#include "hts221.h"
#include "LPS25H.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"

Serial pc(USBTX, USBRX);


#define N 120
DigitalOut myled(D7);
Ticker t;
I2C i2c2(I2C_SDA, I2C_SCL);

float tempCelsius = 25.50;
float humi = 55;
int humiMax = 100;
char cmd[20];
char cmd2[20];
char cmdSet[20];
char cmdSet2[20];
char input1[20];
char input2[20];
char inputSet1[20];
char inputSet2[20];
char inputDel1[20];
char inputDel2[20];
char inputState1[20];
char inputState2[20];
char inputStateOFF1[20];
char inputStateOFF2[20];
float tempArray[N];
float humArray[N];
float pressArray[N];
 int sampleSpeed = 15;
uint32_t seconds = 0, minutes=0, hours=0; 

int counters = 0;
int res;
int res2;
int resSet1;
int resSet2;
int resState1;
int resState2;

LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR);
HTS221 humidity(I2C_SDA, I2C_SCL);


void adcISR();
void thread1 (void const *args );
void threadcomun (void const *args);

Thread* t1;
Thread* t2;




typedef struct {      
  float tempVal ;
  float humVal;
  float pressVal;
}message_t; 
    
Mail<message_t, 16> mail_box;


void adcISR()
{
   message_t *message = mail_box.alloc();
   message->tempVal = tempCelsius;
   message->humVal = humi;
   message->pressVal = barometer.pressure();
   myled=1;
   if (counters < 10)
   {
       counters= counters + 1;
   }else 
   {
     counters =10;
   }         
    mail_box.put(message);       
}

void thread1 (void const *args )
{
         
    pc.baud(115200);        
    while(1) 
    {  
        
        osEvent evt = mail_box.get();
        if (evt.status == osEventMail) 
        { 
            for (unsigned int n=(N-1); n>0; n--) 
            { 
                 tempArray[n]= tempArray[n-1];
                 humArray[n]= humArray[n-1];
                 pressArray[n]= pressArray[n-1];
            }
            message_t *message = (message_t*)evt.value.p;
            tempArray[0]= message->tempVal;
            humArray[0] = message->humVal;
            pressArray[0]= message->pressVal;   
             
             mail_box.free(message); 
       }
    }    
}

void threadComun (void const *args)
{  
    pc.baud(115200);
    pc.printf("Temperature,Humidity,Pressure\n");   
    while(1)
    {
        scanf("%s%s",cmd,cmd2);
        strcpy (input1,cmd);   //INPUT 1
        pc.printf("you entered: %s\n\r",input1);
        strcpy (input2,cmd2);
        res = strncmp(input1,"READ",20);
        res2 = strncmp(input2,input2,20);
        int val = atoi(input2);     //Convert String to int
        if(val <=10 && val >=1)
        {
            if(res==0 && res2==0)
            {   
                for (unsigned int n=0; n<val; n++)
                {  
                  pc.printf("Sample %d : %4.2f, %6.1f ,%3.1f\n\r",n,tempArray[n],pressArray[n],humArray[n]);
                }
            }else{
                pc.printf("Invalid INPUT. \n");
            }
        }else //1
            {
                res = strncmp(input1,"READ",20);
                res2 = strncmp(input2,"ALL",20);
               if (res==0 && res2==0)
               {
                    for (unsigned int n=0; n<N; n++)
                   {
                      pc.printf("Sample %d : %4.2f, %6.1f ,%3.1f\n\r",n,tempArray[n],pressArray[n],humArray[n]);
                   }
                        
                }
               else //2
                {   
                    res = strncmp(input1,"DELETE",20);
                    res2 = strncmp(input2,"ALL",20);
                    if(res==0 && res2==0)
                    {
                        //Delete every element.
                        memset(tempArray, 0, sizeof tempArray);  
                        memset(humArray, 0, sizeof humArray);  
                        memset(pressArray, 0, sizeof pressArray);               
                        pc.printf("%d Elements deleted\n",N);
                        counters=0;
                    }else{
                        pc.printf("Invalid INPUT. \n");
                    }
                                   
                }//1
                                 
                                   
            } //1    
        strcpy (inputDel1,cmd); 
        strcpy (inputDel2,cmd2); 
        resSet1 = strncmp(input1,"DELETE",20);
        resSet2 = strncmp(input2,inputDel2,20); 
        int valDel = atoi(inputDel2);      
        int startDel=(counters - valDel);
        if (valDel <=10 && valDel >=1)
        {
            if(resSet1==0 && resSet2==0)
            {                   
                for (unsigned int n=startDel; n<counters; n++) 
                {
                    tempArray[n]=0.00; 
                    humArray[n]=0.00;
                    pressArray[n]=0.00;
                }
                pc.printf("Deleted %d records\n",valDel);
                counters = counters - valDel;
            }else{
                pc.printf("Invalid INPUT. \n");
            }
        } 
        strcpy (inputSet1,cmd);   //INPUT 1
        strcpy (inputSet2,cmd2);
        resSet1 = strncmp(inputSet1,"SETT",20);
        resSet2 = strncmp(inputSet2,inputSet2,20);
        int inputSpeed = atoi(inputSet2);
        if (inputSpeed <=60 && inputSpeed >=0.1)
        {
            if (resSet1==0 && resSet2==0)
            {   
                sampleSpeed = inputSpeed;
                t.attach(&adcISR, sampleSpeed); 
                pc.printf("T UPDATED TO %d\n",sampleSpeed);
                       
                      
            }else{
                pc.printf("Invalid INPUT. \n");
            }
        }
         strcpy (inputState1,cmd);   //INPUT 1
         strcpy (inputState2,cmd2);
         resSet1 = strncmp(inputState1,"STATE",20);
         resSet2 = strncmp(inputState2,"ON",20);
        if (resSet1==0 && resSet2==0)
        {               
            //t.detach();
            // LPC_TIM3->TC = 0;
            t.attach(&adcISR, sampleSpeed);  
            pc.printf("Sampling: ON\n"); 
                   
        }
         strcpy (inputStateOFF1,cmd);   //INPUT 1
         strcpy (inputStateOFF2,cmd2);
         resState1 = strncmp(inputStateOFF1,"STATE",20);
         resState2 = strncmp(inputStateOFF2,"OFF",20);
        
        if (resState1==0 && resState2==0)
        {               
            t.detach();
            // LPC_TIM3->TC = 0;
            // t.attach(&adcISR, 2.0);  
            pc.printf("Sampling: OFF\n"); 
        }                
                
     }//while
}
 
 char answer;
 
int main(void)
{ 
    puts("Loading... \n\n");
    t1 = new Thread(thread1);
    t2 = new Thread(threadComun);
    t.attach(&adcISR,sampleSpeed); // timer of measurements 
    
    while(1) 
    {
       humidity.init();
       humidity.calib();
       humidity.ReadTempHumi(&tempCelsius, &humi);
       barometer.get();
       barometer.pressure();
       barometer.temperature();
       sleep();
       Thread::wait(200); // 200 ms NB 'Thread::wait(int d);' !!! d is in milliseconds! 
       myled = 0; // LED is OFF
       Thread::wait(100); // 100 ms
    }
  
}