CECS 490B RTOS / Mbed 2 deprecated LOC_master_firmware_042416

Dependencies:   mbed-rtos mbed

Committer:
lhinh3431
Date:
Mon Apr 25 03:25:20 2016 +0000
Revision:
3:34f37e33016d
Parent:
2:b258510a2573
April 24, 2016 20:25 REV0.3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kinetik 0:da6d7d20a81a 1 #include "mbed.h"
kinetik 0:da6d7d20a81a 2 #include "cmsis_os.h"
kinetik 0:da6d7d20a81a 3 #include <stdlib.h>
kinetik 0:da6d7d20a81a 4 #include <stdio.h>
kinetik 0:da6d7d20a81a 5 #include <iostream>
kinetik 0:da6d7d20a81a 6 #include <string>
lhinh3431 1:32ac32201889 7 #include <ctype.h>
kinetik 0:da6d7d20a81a 8
kinetik 0:da6d7d20a81a 9 /*
kinetik 0:da6d7d20a81a 10 Master firmware
kinetik 0:da6d7d20a81a 11 Description: Baud rate - 115200
kinetik 0:da6d7d20a81a 12
kinetik 0:da6d7d20a81a 13 Priority: (1)Master requests
kinetik 0:da6d7d20a81a 14 (2)Send data to slave
kinetik 0:da6d7d20a81a 15 (3)Confirmation data from slave
kinetik 0:da6d7d20a81a 16
kinetik 0:da6d7d20a81a 17 */
kinetik 0:da6d7d20a81a 18 //RawSerial object_name(PinName tx, PinName rx)
kinetik 0:da6d7d20a81a 19 RawSerial XBEE(p37, p31); //Master to slave communication
kinetik 0:da6d7d20a81a 20
kinetik 0:da6d7d20a81a 21 RawSerial pc(USBTX,USBRX); //UART monitor from pc
kinetik 0:da6d7d20a81a 22 RawSerial wifi(p9, p10); // master to wifi UART
kinetik 0:da6d7d20a81a 23
lhinh3431 1:32ac32201889 24 AnalogIn mPot(p15);
kinetik 0:da6d7d20a81a 25
lhinh3431 1:32ac32201889 26 float mPot_val = 0.0;
lhinh3431 1:32ac32201889 27 float sPot_val = 0.0;
kinetik 0:da6d7d20a81a 28
kinetik 0:da6d7d20a81a 29 PwmOut pwm(p27);
kinetik 0:da6d7d20a81a 30
kinetik 0:da6d7d20a81a 31 bool master_manual = false;
kinetik 0:da6d7d20a81a 32 bool slave_manual = false;
kinetik 0:da6d7d20a81a 33 string received = ""; //from slave
kinetik 0:da6d7d20a81a 34 string sent = ""; //to slave
kinetik 0:da6d7d20a81a 35
kinetik 0:da6d7d20a81a 36 string feather_receive = ""; //data recieved from Feather
kinetik 0:da6d7d20a81a 37 string feather_sent = ""; //data sent to the Feather
kinetik 0:da6d7d20a81a 38
lhinh3431 1:32ac32201889 39 string mDimStr = "";
lhinh3431 1:32ac32201889 40 string mTempStr = "";
lhinh3431 1:32ac32201889 41 string sTempStr = "";
lhinh3431 1:32ac32201889 42 string sDimStr = "";
lhinh3431 1:32ac32201889 43
kinetik 0:da6d7d20a81a 44 int convert_val = 0;
lhinh3431 1:32ac32201889 45 int sDimAmt = 0;
lhinh3431 1:32ac32201889 46 int mDimAmt = 0;
lhinh3431 1:32ac32201889 47 int sTemp = 0;
lhinh3431 1:32ac32201889 48 int mTemp = 0;
kinetik 0:da6d7d20a81a 49 float dim_percent = 0.0;
kinetik 0:da6d7d20a81a 50
kinetik 0:da6d7d20a81a 51 int i = 0; //intialize
kinetik 0:da6d7d20a81a 52 int j = 0;
kinetik 0:da6d7d20a81a 53 char box;
kinetik 0:da6d7d20a81a 54
kinetik 0:da6d7d20a81a 55 void wifi_communication_action(void const *args)
kinetik 0:da6d7d20a81a 56 {
kinetik 0:da6d7d20a81a 57 while(1){
kinetik 0:da6d7d20a81a 58 // Data frame[18]: G S | M A | 000 | 000 | S | A | 000 | 000
kinetik 0:da6d7d20a81a 59 // 'GWDM' 0-100 Master Light Level, OR 'GWDS' 0-100 Slave Light Level
lhinh3431 1:32ac32201889 60 char wifi_message [18] = {};
kinetik 0:da6d7d20a81a 61 string message = ""; // Empty Message String
kinetik 0:da6d7d20a81a 62 int i = 0; // Iterator
kinetik 0:da6d7d20a81a 63
kinetik 0:da6d7d20a81a 64 while(wifi.readable()) { // Receive Webapp Data from Adafruit Feather
kinetik 0:da6d7d20a81a 65 wifi_message[i] = wifi.getc(); // Get each character WiFi Message.
kinetik 0:da6d7d20a81a 66 i = i+1; // Iterate
kinetik 0:da6d7d20a81a 67 osDelay(10); // Delay the OS 10ms WILL MOST LIKELY ADJUST TIMING FOR LAST 10% COMPLETION
kinetik 0:da6d7d20a81a 68 }
kinetik 0:da6d7d20a81a 69
kinetik 0:da6d7d20a81a 70 //message = wifi_message; // Save the character array as a string. USELESS
kinetik 0:da6d7d20a81a 71 pc.printf(wifi_message); //Echo to terminal
kinetik 0:da6d7d20a81a 72 i = 0; // Reset the iterator
kinetik 0:da6d7d20a81a 73 // ------------------------------Data parsing --------------------------------------------------------
kinetik 0:da6d7d20a81a 74
lhinh3431 1:32ac32201889 75 if ( toupper(wifi_message [0]) == 'G' && toupper(wifi_message[2]) == 'M' && toupper(wifi_message[10]) == 'S')
kinetik 0:da6d7d20a81a 76 {
lhinh3431 1:32ac32201889 77 int data [12] = {};
lhinh3431 1:32ac32201889 78 for(int i = 0; i < 7; i++) // Parsing master and slave dim and temp values as int array
lhinh3431 1:32ac32201889 79 {
lhinh3431 1:32ac32201889 80 data[i] = (int)wifi_message[i+4]-48; // first 6 values are in char, subtracting 48 gives raw int
lhinh3431 1:32ac32201889 81 data[i+6] = (int)wifi_message[i+12]-48; // second 6 values are for slave values
lhinh3431 1:32ac32201889 82 }
lhinh3431 2:b258510a2573 83 for(int i = 0; i < 3; i++) // Convert integer array to string
lhinh3431 2:b258510a2573 84 {
lhinh3431 3:34f37e33016d 85 mDimStr += data[i];
lhinh3431 3:34f37e33016d 86 mTempStr += data[i+3];
lhinh3431 3:34f37e33016d 87 sDimStr += data[i+6];
lhinh3431 3:34f37e33016d 88 sTempStr += data[i+9];
lhinh3431 2:b258510a2573 89 }
lhinh3431 2:b258510a2573 90
lhinh3431 2:b258510a2573 91 if(data[0] > 1 || data[6] > 1) // Logic check for dim amount for both master and slave
lhinh3431 2:b258510a2573 92 wifi.printf("Somehow... you are dimming over 100%...");
lhinh3431 2:b258510a2573 93 else
lhinh3431 2:b258510a2573 94 {
lhinh3431 2:b258510a2573 95 mDimAmt = (data[0]*100)+(data[1]*10)+(data[2]); // Data 0:2 is the 3 digit percentile for master
lhinh3431 2:b258510a2573 96 sDimAmt = (data[6]*100)+(data[7]*10)+(data[8]); // data 6:8 is the 3 digit percentile for slave
lhinh3431 2:b258510a2573 97 }
lhinh3431 1:32ac32201889 98
lhinh3431 1:32ac32201889 99 if (toupper(wifi_message [1]) == 'S') //Print status
kinetik 0:da6d7d20a81a 100 {
lhinh3431 2:b258510a2573 101 wifi.printf("Master Dim: %s\n", mDimStr); // Print to terminal, NOTICE: weird warning
lhinh3431 2:b258510a2573 102 wifi.printf("Master Temp: %s\n", mTempStr);
lhinh3431 2:b258510a2573 103 wifi.printf("Slave Dim: %s\n", sDimStr);
lhinh3431 2:b258510a2573 104 wifi.printf("Slave Temp: %s\n", sTempStr);
kinetik 0:da6d7d20a81a 105 }
kinetik 0:da6d7d20a81a 106
lhinh3431 1:32ac32201889 107 else if (toupper(wifi_message [1]) == 'D') //Dim
kinetik 0:da6d7d20a81a 108 {
lhinh3431 2:b258510a2573 109 // ----------------------------- Prioritize Wireless/Manual Mode -----------------------------------
lhinh3431 2:b258510a2573 110
lhinh3431 2:b258510a2573 111 if ( mPot.read() > 0.0 || wifi_message[3] == '0') // If the pot is at any value or in physical mode
lhinh3431 2:b258510a2573 112 {
lhinh3431 2:b258510a2573 113 master_manual = true;
lhinh3431 2:b258510a2573 114 mPot_val = mPot.read(); //read in value from potentiometer
lhinh3431 2:b258510a2573 115 pwm.write(mPot_val); //output potentiometer value to pwm
lhinh3431 2:b258510a2573 116 }
lhinh3431 2:b258510a2573 117
lhinh3431 2:b258510a2573 118 else if (wifi_message[3] == '1' ) //Check: Wireless for master
lhinh3431 2:b258510a2573 119 {
lhinh3431 2:b258510a2573 120 pwm.write((float)(mDimAmt/100)); //Send out dim value from parsed data wirelessly
lhinh3431 2:b258510a2573 121
lhinh3431 2:b258510a2573 122 }
lhinh3431 2:b258510a2573 123
lhinh3431 2:b258510a2573 124 if ( sPot.read() > 0.0 || wifi_message[11] == '0')
lhinh3431 2:b258510a2573 125 {
lhinh3431 2:b258510a2573 126 slave_manual = true;
lhinh3431 2:b258510a2573 127 sPot_val = sPot.read();
lhinh3431 2:b258510a2573 128 pwm.write(sPot_val);
lhinh3431 2:b258510a2573 129 }
lhinh3431 2:b258510a2573 130 else if (wifi_message [11] == '1' ) //Check: Wireless for slave
lhinh3431 2:b258510a2573 131 {
lhinh3431 2:b258510a2573 132 pwm.write((float)(sDimAmt/100)); //Send out dim value from parsed data wirelessly
lhinh3431 2:b258510a2573 133
lhinh3431 2:b258510a2573 134 }
lhinh3431 1:32ac32201889 135 }
lhinh3431 1:32ac32201889 136
lhinh3431 1:32ac32201889 137 /* IGNORE THIS
lhinh3431 1:32ac32201889 138 int md1, md2, md3, mt1, mt2, mt3; // Master dim and temp values
lhinh3431 1:32ac32201889 139 int sd1, sd2, sd3, st1, st2, st3; // Slave dim and temp values
lhinh3431 1:32ac32201889 140 md1 = (int)wifi_message[4]-48;
lhinh3431 1:32ac32201889 141 md2 = (int)wifi_message[5]-48;
lhinh3431 1:32ac32201889 142 md3 = (int)wifi_message[6]-48;
lhinh3431 1:32ac32201889 143 mt1 = (int)wifi_message[7]-48;
lhinh3431 1:32ac32201889 144 mt2 = (int)wifi_message[8]-48;
lhinh3431 1:32ac32201889 145 mt3 = (int)wifi_message[9]-48;
lhinh3431 1:32ac32201889 146 sd1 = (int)wifi_message[12]-48;
lhinh3431 1:32ac32201889 147 sd2 = (int)wifi_message[13]-48;
lhinh3431 1:32ac32201889 148 sd3 = (int)wifi_message[14]-48;
lhinh3431 1:32ac32201889 149 st1 = (int)wifi_message[15]-48;
lhinh3431 1:32ac32201889 150 st2 = (int)wifi_message[16]-48;
lhinh3431 1:32ac32201889 151 st3 = (int)wifi_message[17]-48;
lhinh3431 1:32ac32201889 152 */
lhinh3431 1:32ac32201889 153
kinetik 0:da6d7d20a81a 154 }
kinetik 0:da6d7d20a81a 155
lhinh3431 2:b258510a2573 156
kinetik 0:da6d7d20a81a 157
kinetik 0:da6d7d20a81a 158 /*
kinetik 0:da6d7d20a81a 159 if (wifi_message [2] == 'D') { // if Dimming check if slave
kinetik 0:da6d7d20a81a 160 if(wifi_message[3] == 'S') { // if slave print message
kinetik 0:da6d7d20a81a 161 pc.printf(wifi_message);
kinetik 0:da6d7d20a81a 162 } else if (wifi_message[3] == 'M') { // else if master, parse message
kinetik 0:da6d7d20a81a 163 int temp1, temp2, temp3; // temp values convert char to int
kinetik 0:da6d7d20a81a 164 temp1 = (int)wifi_message[4] - 48;//100's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 165 temp2 = (int)wifi_message[5] - 48;//10's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 166 temp3 = (int)wifi_message[6] - 48;//1's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 167 M_Dim = (temp1*100)+(temp2*10)+(temp3); // create int value || ABILITY TO GO OVER 100%???
kinetik 0:da6d7d20a81a 168 Dim_amount = (float)M_Dim/100; // get dim percentage
kinetik 0:da6d7d20a81a 169 Master_signal.write(Dim_amount); // write dim level to PWM
kinetik 0:da6d7d20a81a 170 //pc.printf("%0.3f dimval",Dim_amount);
kinetik 0:da6d7d20a81a 171 }
kinetik 0:da6d7d20a81a 172 }
kinetik 0:da6d7d20a81a 173 */
kinetik 0:da6d7d20a81a 174 } //end superloop
kinetik 0:da6d7d20a81a 175 }//end thread
kinetik 0:da6d7d20a81a 176
kinetik 0:da6d7d20a81a 177
kinetik 0:da6d7d20a81a 178 // Send WiFi Status
kinetik 0:da6d7d20a81a 179 void wifi_status_send(void const *args)
kinetik 0:da6d7d20a81a 180 {
kinetik 0:da6d7d20a81a 181 // Send Dim level message from GSM (General Status Master)
kinetik 0:da6d7d20a81a 182 while(1){
lhinh3431 2:b258510a2573 183 wifi.printf("GSM%03d000S000000",mDimAmt);
kinetik 0:da6d7d20a81a 184 // Delay the OS by 3 seconds
kinetik 0:da6d7d20a81a 185 osDelay(3000); // updating status every 3 seconds
kinetik 0:da6d7d20a81a 186 }
kinetik 0:da6d7d20a81a 187 }
kinetik 0:da6d7d20a81a 188
kinetik 0:da6d7d20a81a 189 // Define OS Thread to handle Communication between the master and the slave.
kinetik 0:da6d7d20a81a 190 osThreadDef(wifi_communication_action, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 191 // Define OS Thread for sending Status
kinetik 0:da6d7d20a81a 192 osThreadDef(wifi_status_send, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 193
kinetik 0:da6d7d20a81a 194 int main ()
kinetik 0:da6d7d20a81a 195 {
kinetik 0:da6d7d20a81a 196 //Receive message - Slave light receiving message from Master
kinetik 0:da6d7d20a81a 197 while (master_uart4.readable() != 0) //determines if there is a character to read
kinetik 0:da6d7d20a81a 198 {
kinetik 0:da6d7d20a81a 199 char buf;
kinetik 0:da6d7d20a81a 200 buf = master_uart4.getc(); //reads a char from the serial port and places into temp mailbox
kinetik 0:da6d7d20a81a 201 received[i] = buf; //stores the read char
kinetik 0:da6d7d20a81a 202 i++; //traverse through array
kinetik 0:da6d7d20a81a 203 osStatus.wait(0.5); //Check this value ~ 0.5 ms
kinetik 0:da6d7d20a81a 204
kinetik 0:da6d7d20a81a 205 } //Note: May have to reset counter to 0
kinetik 0:da6d7d20a81a 206
kinetik 0:da6d7d20a81a 207
kinetik 0:da6d7d20a81a 208
kinetik 0:da6d7d20a81a 209 }