for testing

Dependencies:   C12832 FXOS8700Q LM75B eCompass_FPU_Lib mbed-rtos mbed

Revision:
0:091b62984a92
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 24 21:04:12 2016 +0000
@@ -0,0 +1,294 @@
+/*
+* Author - Aruna Duraisingam - ad543 
+* Date - 20 Feb 2016
+* The below program is developed beased on IOT assessment 3 requirements.
+* The below program reads temperature for ever 5 sesonds 
+* and when the temperature goes higher than 26 degree celcius the progam shuts down the 
+* processor for 5 seconds and comes back again. The processor can also be make active when a
+* switch is pressed.
+*/
+
+#include "mbed.h"                       /* stock MBED API */
+#include "LM75B.h"                      /* Lib for the temperature sensor */
+#include "C12832.h"                      /* Lib for LCD Display */
+#include "FXOS8700Q.h"                      /* Lib for on-board Accelerometer/Magnetometer */
+#include "eCompass_Lib.h"
+#include "rtos.h"
+#include "math.h"                      
+
+/**************** Declaration *********************/
+
+Serial host (USBTX, USBRX);             /* to-host UART via OpenSDAv2 */
+
+
+LM75B sens_temp (D14, D15);               /* temperature sensor */
+PwmOut speaker(D6); /* speaker */
+
+DigitalOut led_red(LED_RED);
+DigitalOut led_green(LED_GREEN);
+C12832 lcd_display (D11, D13, D12, D7, D10);   /* LCD on the shield (128x32) */
+Ticker blinker;
+AnalogIn pot1 (A0); // Potentiometer
+
+eCompass compass;
+
+
+// JoyStick
+DigitalIn up(A2);
+DigitalIn down(A3);
+DigitalIn left(A4);
+DigitalIn right(A5);
+
+//Accelerometer/magnetometer
+
+I2C i2c(PTE25, PTE24);
+//FXOS8700Q fxos(i2c, FXOS8700CQ_SLAVE_ADDR1);
+FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1);    // Configured for the FRDM-K64F with onboard sensors
+FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1);
+
+extern axis6_t axis6;
+
+MotionSensorDataCounts mag_raw;
+MotionSensorDataCounts acc_raw;
+
+InterruptIn wakeup_switch (PTC6);             /* interrupts for the two on-board switches */
+InterruptIn temp_conversion_switch (PTA4);
+
+/* option trigger/flag (integer value) . possible values 1,2,3 - what to display in LCD 
+option 1 - read temperature and display in LCD in celcius/fareinheit
+option 2 - Simple ball game using accelerometer reading
+option 3 - Magentometer showing direction.
+*/
+static volatile int joystick_option_flag;   
+        
+
+static volatile int temp_conversion_switch_trig;        /* 0- gives reading in celcius and 1 in farenheit.*/
+
+static volatile float threshold_temperature = 29.0; /* given in degree celcius*/
+static volatile bool isActive = true;
+static volatile bool activate_blink = false;
+
+// login
+static char username[10] ;
+static char password[10] ;
+static char * tempstring ;
+static bool validateUser = false;
+
+/*****************************Methods***************************/
+
+void hal_map( MotionSensorDataCounts * acc_raw, MotionSensorDataCounts * mag_raw)
+{
+int16_t t;
+// swap and negate X & Y axis
+t = acc_raw->x;
+acc_raw->x = acc_raw->y * -1;
+acc_raw->y = t * -1;
+// swap mag X & Y axis
+t = mag_raw->x;
+mag_raw->x = mag_raw->y;
+mag_raw->y = t;
+// negate mag Z axis
+mag_raw->z *= -1;
+}
+
+//Toggles the temperature conversion switch  trigger
+void conversion_switch_interrupt (void)
+{
+    temp_conversion_switch_trig = !temp_conversion_switch_trig;
+}
+
+// reactivate the processor and starts execution
+void wakeup_switch_interrupt (void)
+{
+    led_green=1;    
+    activate_blink = false;
+    isActive = true;
+    lcd_display.cls();
+}
+
+// When the temperature is above threshold limit,  it sets an alaram for 3 seconds and sleep
+void setAlarm (void)
+{
+    led_red = 0;
+    speaker.period(1.0/500.0); // 500hz period
+    speaker =0.5; //50% duty cycle - max volume
+    wait(1.5f);
+    speaker=0.0; // turn off audio
+    led_red = !led_red; // toggle a led    
+}
+
+void makeProcessorSleep(void){
+    isActive = false;
+    activate_blink = true;
+    sleep();
+}
+
+void blink() {
+    if(activate_blink)
+        led_green=!led_green;
+}
+
+void initialize() {
+       
+    temp_conversion_switch_trig =1; 
+    joystick_option_flag = 1; // intially 
+    led_red = 1;
+    led_green = 1;
+}
+
+void displayTemperature(float temp)
+{
+    if (temp_conversion_switch_trig) {
+                    lcd_display.printf ("Temperature %.2f C", temp);                        
+                    }
+                else{
+                    float f = (temp*9/5)+32;
+                    lcd_display.printf ("Temperature %.2f F", f);                 
+                    } 
+}
+
+void displayGame(void)
+{
+    
+}
+
+void displayDirection(void)
+{
+    lcd_display.cls();
+    acc.getAxis( acc_raw);
+        mag.getAxis( mag_raw);
+        compass.run( acc_raw, mag_raw); // calculate the eCompass
+         int yaw =axis6.yaw;
+         
+        if((yaw >=338 && yaw <360) || (yaw>=0 && yaw < 23)) lcd_display.printf("%d degree North\r\n", yaw);
+        else if((yaw >=24 && yaw <67)) lcd_display.printf("%d degree Nort East", yaw); 
+        else if((yaw >=68 && yaw <112)) lcd_display.printf("%d degree East", yaw); 
+        else if(yaw >=113 && yaw <158) lcd_display.printf("%d degree South East", yaw); 
+        else if(yaw >=159 && yaw <203) lcd_display.printf("%d degree South", yaw); 
+        else if(yaw >=204 && yaw <247) lcd_display.printf("%d degree South West", yaw); 
+        else if(yaw >=248 && yaw <292) lcd_display.printf("%d degree West", yaw); 
+        else lcd_display.printf("%d degree North West\r\n", yaw);        
+}
+
+
+char* readString(void){
+     tempstring = (char*) malloc(10 * sizeof(char));
+     int i =0;
+     bool status = true;
+     while(status) {
+        char ch = host.getc();
+       if(ch != '\r')
+       {
+            lcd_display.printf("%c", ch);
+            tempstring[i]= ch;
+            i++;
+        }
+        else
+        {        
+            //lcd_display.printf("Entered enter!");
+            printf("\n");
+            status =false;
+        }
+        
+        
+    }
+    
+    tempstring[i] = '\0';
+    return tempstring;
+ }
+ 
+ void getUserNameText(void){
+     host.printf("Please enter username (Max 10 characters): \r\n");
+     strcpy(username , readString());
+}
+ 
+ void login(void){
+     
+      host.printf("Please enter username (Max 10 characters): \r\n");
+      strcpy(username , readString());  
+      
+      
+      host.printf("Please enter password (Max 10 Characters):\r\n");
+      strcpy(password , readString());      
+       
+       host.printf("Username :%s , Password : %s \r\n", username, password);      
+     }
+
+/************** Start - Main Method **************************/
+int main (void)
+    {
+        host.baud (38400); 
+        login();
+       
+       if(strcmp (username,"default") == 0  && strcmp (password,"default") == 0)
+       {
+            validateUser = true;
+            free(username);
+            free(password);  
+        }
+        else{
+            host.printf("Invalid login\r\n"); 
+            login();
+           }
+        
+        initialize();
+        
+        wakeup_switch.mode (PullUp);
+        wakeup_switch.fall (&wakeup_switch_interrupt);
+        
+        temp_conversion_switch.mode (PullUp);
+        temp_conversion_switch.fall (&conversion_switch_interrupt); 
+        
+        up.mode(PullUp);  
+        left.mode(PullUp); 
+        right.mode(PullUp); 
+        down.mode(PullUp);      
+        
+        blinker.attach(&blink, 1); 
+        
+        acc.enable();
+        mag.enable();
+
+        acc.getAxis( acc_raw);
+        mag.getAxis( mag_raw);
+             
+        while(isActive){
+           host.printf ("validateUser %d", validateUser);
+           if(!validateUser) sleep();
+           else{               
+                   lcd_display.locate (1, 10);
+                   lcd_display.cls();
+                   
+                    float curr_temp = sens_temp.read ();
+                    
+                    if(up)  joystick_option_flag = 1;
+                    else if(left)joystick_option_flag = 2;
+                    else if(right)joystick_option_flag = 3;            
+                    
+                    host.printf ("option joystick: %d \r\n", joystick_option_flag);
+                    
+                    switch (joystick_option_flag) {
+                    case 1:      
+                        displayTemperature(curr_temp);               
+                        break;
+                    case 2:
+                        displayGame();
+                        break;
+                    case 3:
+                        displayDirection(); 
+                        break; 
+                    default:
+                        displayTemperature(curr_temp);               
+                    }            
+                   
+                    if(curr_temp > threshold_temperature)
+                    {
+                       setAlarm();  
+                       lcd_display.printf ("In Sleep Mode. Temperature: %.2f C\r\n", curr_temp);         
+                       makeProcessorSleep();                   
+                    }      
+                    
+                    wait (1.0f);  
+                }
+        }
+    }
\ No newline at end of file