3rd Repo, trying to figure this out.

Dependencies:   LPS25H hts221

Fork of SOFT253_Template_Weather_OS_54 by Stage-1 Students SoCEM

main.cpp

Committer:
FairyMental
Date:
2017-04-06
Revision:
45:9a33f2bc2b4e
Parent:
44:b523c9a9dd97
Child:
46:0de1f3c7d118

File content as of revision 45:9a33f2bc2b4e:


#include "mbed.h"
#include "rtos.h"
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include "hts221.h"
#include "LPS25H.h"
#include "LinkedList.h"
#include <iostream>

#define SIGNAL_doMeasure 1
#define SWITCH1_RELEASE 90
 
void thread1();
 
DigitalOut myled(LED1);
I2C i2c2(I2C_SDA, I2C_SCL);
LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR);
HTS221 measurer(I2C_SDA, I2C_SCL);
DigitalIn  onBoardSwitch(USER_BUTTON);
 
//Threads
Thread *produceThread;
Thread *measureThread;
Thread *consumeThread;

int count= 0;

//Mail queue
Mail<Measure, 16> mail_box;
 
LinkedList *listBuffer;
 
// Call this on precise intervals
void MeasureThread() {

    while(true)
    {   
        Thread::signal_wait(SIGNAL_doMeasure);
        //Read sample - make a copy
        float temperature = 0 , humidity = 0,pressure = 0;
    
  
    
        //Allocate a block from the memory pool
        Measure *measure = mail_box.alloc();
        if (measure == NULL) 
        {
           //Out of memory
           printf("Out of memory\n\r");
           return;   
        }
    
        //Fill in the data
        measurer.ReadTempHumi(&temperature,&humidity);
        barometer.get();
        pressure = barometer.pressure();

    
        measure->temperature = temperature;
        measure->humidity = humidity;
        measure->pressure = pressure;

        //Write to queue
        osStatus stat = mail_box.put(measure);    //Note we are sending the "pointer"
    
        //Check if succesful
        if (stat == osErrorResource) {
            printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat);   
            mail_box.free(measure);
            return;
        }
    }
}
 
//Normal priority thread (consumer)
void ProducerThread() 
{      
    while (true) {
        //Block on the queue
        osEvent evt = mail_box.get();
        
        //Check status
        if (evt.status == osEventMail) {
            Measure *measure = (Measure*)evt.value.p;  //This is the pointer (address)
            //Make a copy
         //   printf("Consumer: %fC |  %f% % |  %f \r\n", measure->temperature, measure->humidity,measure->pressure);
            
            Measure msr(measure->temperature, measure->humidity,measure->pressure);
            listBuffer->addValueEnd(msr);
            //We are done with this, so give back the memory to the pool
            mail_box.free(measure);
            
            //Echo to the terminal
            
        } else {
            printf("ERROR: %x\n\r", evt.status);   
        }  
        
    } //end while
}
int CompareCommands(char command[],char targetcommand[], int size)
{
       int i;
       for(i = 0; i < size; i ++)
       {
            if(command[i] != targetcommand[i])
                return -1;
                
        }
        return 1;
}
void ConsumeThread()
{
    char charCmd;
    char command[40];
    int crtChar = 0;
    printf("\r\nAwaiting command:\r\n");   
    while(1)
    {
        
        charCmd = NULL;
        charCmd = getchar();
        if(charCmd != NULL)
        {
            if (charCmd == 127 && crtChar > 0 ) // If Backspace is pressed
            {
                printf("%c",charCmd);
                command[--crtChar] = '\0';   
            }
            else if(charCmd != 13 && charCmd != 127) // If NOT enter AND NOT Backspace is pressed
            {
                command[crtChar++] = charCmd;
                printf("%c",charCmd);
            }
            else if(charCmd == 13) // If Enter is pressed
            {
                printf("\r\n\r\nCommand entered: %s\r\n", command);
                
                // this thing that follows splits a string into multiple strings, just like String.Split(char[] delimiters)
                // here we will check for commands and parameters :)
                char *charPos;
                charPos = strtok(command," -,");
                if(CompareCommands(charPos, "list",4) == 1)
                {
                    charPos = strtok(NULL," -,");
                    if(CompareCommands(charPos, "all",3) == 1)
                    {
                        printf("\r\n Printing all measures performed so far: \r\n");
                        listBuffer->ListAll();   
                        printf("\r\n D O N E ! \r\n");
                    }
                    else if(strtol(charPos,NULL,10) != 0)
                    {
                        listBuffer->ListX(atoi(charPos));   
                        printf("\r\n D O N E ! \r\n");
                    }
                }
                else if (CompareCommands(charPos,"delete",6) == 1)
                {
                    charPos = strtok(NULL," -,");
                    if(CompareCommands(charPos,"all",3) == 1)
                    {
                        printf("\r\n Deleting all measures performed so far: \r\n");
                        listBuffer->DeleteAll();
                        printf("\r\n D O N E ! \r\n");
                    }
                    else if (strtol(charPos,NULL,10) != 0)
                    {
                        listBuffer->DeleteX(atoi(charPos));
                        printf("\r\n D O N E ! \r\n");
                    }
                       
                }
                else if (CompareCommands(charPos,"status",6) == 1)
                {
                    printf("\r\n STATUS: \r\n # of measures: %i \r\n SAMPLING: ON \r\n Current Date: \r\n Current Time: \r\n", listBuffer->GetSize());   
                }
              //  printf("%s \r\n", charPos);
              //  charPos = strtok(NULL," -,");
                
                
                printf("Awaiting command: \r\n");
                int i = 0;
                for(i =0 ; i < crtChar; i++)
                    command[i] = ' ';
                command[0] = 0;
                crtChar = 0;
            }
        }
    }
}


 void SendSignalDoMeasure()
 {
    measureThread->signal_set(SIGNAL_doMeasure);    
}
 
// Main thread
int main() {
           
    //Initialize stuff
    measurer.init();
    measurer.calib();
    listBuffer = new LinkedList();
    
    //Start message
    printf("Welcome\r\n");           
   
    //Hook up timer interrupt   
    Ticker timer; 
    timer.attach(&SendSignalDoMeasure, 2.0);
               
    //Threads
    produceThread = new Thread();
    produceThread->start(ProducerThread); 
    measureThread = new Thread();
    measureThread->start(MeasureThread);
    consumeThread = new Thread();
    consumeThread->start(ConsumeThread);
    
    printf("Main Thread\n");
    while(1) 
    {
        Thread::wait(3000);
   //     float temp,humi;
   //     measurer.ReadTempHumi(&temp, &humi);
   //     barometer.get();
   //     t2->signal_set(SIGNAL_doMeasure);
   //     printf("Main Thread Measures: %fC %f %f \r\n", temp, humi,barometer.pressure());

      }
}