CECS 490B RTOS / Mbed 2 deprecated LOC_master_firmware_042416

Dependencies:   mbed-rtos mbed

Committer:
lhinh3431
Date:
Mon Apr 25 01:32:33 2016 +0000
Revision:
1:32ac32201889
Parent:
0:da6d7d20a81a
Child:
2:b258510a2573
April 24, 2016_Master_Firmware_rev0.1

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 1:32ac32201889 83
lhinh3431 1:32ac32201889 84 if (toupper(wifi_message [1]) == 'S') //Print status
kinetik 0:da6d7d20a81a 85 {
lhinh3431 1:32ac32201889 86 for(int i = 0; i < 3; i++) // Convert integer array to string
lhinh3431 1:32ac32201889 87 {
lhinh3431 1:32ac32201889 88 mDimStr += data[i+4];
lhinh3431 1:32ac32201889 89 mTempStr += data[i+7];
lhinh3431 1:32ac32201889 90 sDimStr += data[i+12];
lhinh3431 1:32ac32201889 91 sTempStr += data[i+15];
lhinh3431 1:32ac32201889 92 }
lhinh3431 1:32ac32201889 93 pc.printf("Master Dim: %s\n", mDimStr); // Print to terminal, NOTICE: weird warning
lhinh3431 1:32ac32201889 94 pc.printf("Master Temp: %s\n", mTempStr);
lhinh3431 1:32ac32201889 95 pc.printf("Slave Dim: %s\n", sDimStr);
lhinh3431 1:32ac32201889 96 pc.printf("Slave Temp: %s\n", sTempStr);
kinetik 0:da6d7d20a81a 97 }
kinetik 0:da6d7d20a81a 98
lhinh3431 1:32ac32201889 99 else if (toupper(wifi_message [1]) == 'D') //Dim
kinetik 0:da6d7d20a81a 100 {
lhinh3431 1:32ac32201889 101 for(int i = 0; i < 3; i++) // Grab master and slave dim values
lhinh3431 1:32ac32201889 102 {
lhinh3431 1:32ac32201889 103 mDimAmt += data[i];
lhinh3431 1:32ac32201889 104 //mTemp += data[i+3];
lhinh3431 1:32ac32201889 105 sDimAmt += data[i+6];
lhinh3431 1:32ac32201889 106 //sTemp += data[i+9];
lhinh3431 1:32ac32201889 107 }
kinetik 0:da6d7d20a81a 108
lhinh3431 1:32ac32201889 109 }
lhinh3431 1:32ac32201889 110
lhinh3431 1:32ac32201889 111 /* IGNORE THIS
lhinh3431 1:32ac32201889 112 int md1, md2, md3, mt1, mt2, mt3; // Master dim and temp values
lhinh3431 1:32ac32201889 113 int sd1, sd2, sd3, st1, st2, st3; // Slave dim and temp values
lhinh3431 1:32ac32201889 114 md1 = (int)wifi_message[4]-48;
lhinh3431 1:32ac32201889 115 md2 = (int)wifi_message[5]-48;
lhinh3431 1:32ac32201889 116 md3 = (int)wifi_message[6]-48;
lhinh3431 1:32ac32201889 117 mt1 = (int)wifi_message[7]-48;
lhinh3431 1:32ac32201889 118 mt2 = (int)wifi_message[8]-48;
lhinh3431 1:32ac32201889 119 mt3 = (int)wifi_message[9]-48;
lhinh3431 1:32ac32201889 120 sd1 = (int)wifi_message[12]-48;
lhinh3431 1:32ac32201889 121 sd2 = (int)wifi_message[13]-48;
lhinh3431 1:32ac32201889 122 sd3 = (int)wifi_message[14]-48;
lhinh3431 1:32ac32201889 123 st1 = (int)wifi_message[15]-48;
lhinh3431 1:32ac32201889 124 st2 = (int)wifi_message[16]-48;
lhinh3431 1:32ac32201889 125 st3 = (int)wifi_message[17]-48;
lhinh3431 1:32ac32201889 126 */
lhinh3431 1:32ac32201889 127
kinetik 0:da6d7d20a81a 128 }
kinetik 0:da6d7d20a81a 129
kinetik 0:da6d7d20a81a 130 // ----------------------------- Prioritize Wireless/Manual Mode -----------------------------------
kinetik 0:da6d7d20a81a 131
lhinh3431 1:32ac32201889 132 if ( mPot.read() > 0.0 )
kinetik 0:da6d7d20a81a 133 {
lhinh3431 1:32ac32201889 134 if (wifi_message [3] == '0' ) // Check: Manual mode for Master
kinetik 0:da6d7d20a81a 135 {
kinetik 0:da6d7d20a81a 136 master_manual = true;
lhinh3431 1:32ac32201889 137 mPot_val = mPot.read(); //read in value from potentiometer
lhinh3431 1:32ac32201889 138 pwm.write(mPot_val); //output potentiometer value to pwm
kinetik 0:da6d7d20a81a 139 }
kinetik 0:da6d7d20a81a 140
kinetik 0:da6d7d20a81a 141 else if (wifi_message [3] == "1" ) //Check: Wireless for master
kinetik 0:da6d7d20a81a 142 {
lhinh3431 1:32ac32201889 143 pwm.write((float)(mDimAmt/100)); //Send out dim value from parsed data wirelessly
kinetik 0:da6d7d20a81a 144
kinetik 0:da6d7d20a81a 145 }
kinetik 0:da6d7d20a81a 146 }
kinetik 0:da6d7d20a81a 147
lhinh3431 1:32ac32201889 148 if ( sPot.read() > 0.0)
kinetik 0:da6d7d20a81a 149 {
kinetik 0:da6d7d20a81a 150 if (wifi_message [11] == "0") // Check: Manual mode for Slave
kinetik 0:da6d7d20a81a 151 {
kinetik 0:da6d7d20a81a 152 slave_manual = true;
lhinh3431 1:32ac32201889 153 sPot_val = sPot.read();
lhinh3431 1:32ac32201889 154 pwm.write(sPot_val);
kinetik 0:da6d7d20a81a 155 }
kinetik 0:da6d7d20a81a 156 else if (wifi_message [11] == "1" ) //Check: Wireless for slave
kinetik 0:da6d7d20a81a 157 {
lhinh3431 1:32ac32201889 158 pwm.write((float)(sDimAmt/100)); //Send out dim value from parsed data wirelessly
kinetik 0:da6d7d20a81a 159
kinetik 0:da6d7d20a81a 160 }
kinetik 0:da6d7d20a81a 161 }
kinetik 0:da6d7d20a81a 162
kinetik 0:da6d7d20a81a 163 /*
kinetik 0:da6d7d20a81a 164 if (wifi_message [2] == 'D') { // if Dimming check if slave
kinetik 0:da6d7d20a81a 165 if(wifi_message[3] == 'S') { // if slave print message
kinetik 0:da6d7d20a81a 166 pc.printf(wifi_message);
kinetik 0:da6d7d20a81a 167 } else if (wifi_message[3] == 'M') { // else if master, parse message
kinetik 0:da6d7d20a81a 168 int temp1, temp2, temp3; // temp values convert char to int
kinetik 0:da6d7d20a81a 169 temp1 = (int)wifi_message[4] - 48;//100's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 170 temp2 = (int)wifi_message[5] - 48;//10's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 171 temp3 = (int)wifi_message[6] - 48;//1's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 172 M_Dim = (temp1*100)+(temp2*10)+(temp3); // create int value || ABILITY TO GO OVER 100%???
kinetik 0:da6d7d20a81a 173 Dim_amount = (float)M_Dim/100; // get dim percentage
kinetik 0:da6d7d20a81a 174 Master_signal.write(Dim_amount); // write dim level to PWM
kinetik 0:da6d7d20a81a 175 //pc.printf("%0.3f dimval",Dim_amount);
kinetik 0:da6d7d20a81a 176 }
kinetik 0:da6d7d20a81a 177 }
kinetik 0:da6d7d20a81a 178 */
kinetik 0:da6d7d20a81a 179 } //end superloop
kinetik 0:da6d7d20a81a 180 }//end thread
kinetik 0:da6d7d20a81a 181
kinetik 0:da6d7d20a81a 182
kinetik 0:da6d7d20a81a 183 // Send WiFi Status
kinetik 0:da6d7d20a81a 184 void wifi_status_send(void const *args)
kinetik 0:da6d7d20a81a 185 {
kinetik 0:da6d7d20a81a 186 // Send Dim level message from GSM (General Status Master)
kinetik 0:da6d7d20a81a 187 while(1){
kinetik 0:da6d7d20a81a 188 wifi.printf("GSM%03d000S000000",M_Dim);
kinetik 0:da6d7d20a81a 189 // Delay the OS by 3 seconds
kinetik 0:da6d7d20a81a 190 osDelay(3000); // updating status every 3 seconds
kinetik 0:da6d7d20a81a 191 }
kinetik 0:da6d7d20a81a 192 }
kinetik 0:da6d7d20a81a 193
kinetik 0:da6d7d20a81a 194 // Define OS Thread to handle Communication between the master and the slave.
kinetik 0:da6d7d20a81a 195 osThreadDef(wifi_communication_action, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 196 // Define OS Thread for sending Status
kinetik 0:da6d7d20a81a 197 osThreadDef(wifi_status_send, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 198
kinetik 0:da6d7d20a81a 199 int main ()
kinetik 0:da6d7d20a81a 200 {
kinetik 0:da6d7d20a81a 201 //Receive message - Slave light receiving message from Master
kinetik 0:da6d7d20a81a 202 while (master_uart4.readable() != 0) //determines if there is a character to read
kinetik 0:da6d7d20a81a 203 {
kinetik 0:da6d7d20a81a 204 char buf;
kinetik 0:da6d7d20a81a 205 buf = master_uart4.getc(); //reads a char from the serial port and places into temp mailbox
kinetik 0:da6d7d20a81a 206 received[i] = buf; //stores the read char
kinetik 0:da6d7d20a81a 207 i++; //traverse through array
kinetik 0:da6d7d20a81a 208 osStatus.wait(0.5); //Check this value ~ 0.5 ms
kinetik 0:da6d7d20a81a 209
kinetik 0:da6d7d20a81a 210 } //Note: May have to reset counter to 0
kinetik 0:da6d7d20a81a 211
kinetik 0:da6d7d20a81a 212
kinetik 0:da6d7d20a81a 213
kinetik 0:da6d7d20a81a 214 }