CECS 490B RTOS / Mbed 2 deprecated message_decoder

Dependencies:   mbed-rtos mbed

Fork of Master_Slave_Firmware by CECS 490B RTOS

Committer:
kinetik
Date:
Fri Apr 22 00:43:45 2016 +0000
Revision:
1:9d4063b3036f
master firmware rev1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kinetik 1:9d4063b3036f 1 #include "mbed.h"
kinetik 1:9d4063b3036f 2 #include "cmsis_os.h"
kinetik 1:9d4063b3036f 3 #include <iostream>
kinetik 1:9d4063b3036f 4 #include <string>
kinetik 1:9d4063b3036f 5
kinetik 1:9d4063b3036f 6 /*
kinetik 1:9d4063b3036f 7 Master firmware
kinetik 1:9d4063b3036f 8 Description: Baud rate - 115200
kinetik 1:9d4063b3036f 9
kinetik 1:9d4063b3036f 10 Priority: (1)Master requests
kinetik 1:9d4063b3036f 11 (2)Send data to slave
kinetik 1:9d4063b3036f 12 (3)Confirmation data from slave
kinetik 1:9d4063b3036f 13
kinetik 1:9d4063b3036f 14 */
kinetik 1:9d4063b3036f 15 //RawSerial object_name(PinName tx, PinName rx)
kinetik 1:9d4063b3036f 16 RawSerial master_uart4(p37, p31);
kinetik 1:9d4063b3036f 17
kinetik 1:9d4063b3036f 18 PwmOut master_pwmout(p27);
kinetik 1:9d4063b3036f 19
kinetik 1:9d4063b3036f 20 bool master_manual = false;
kinetik 1:9d4063b3036f 21 bool slave_manual = false;
kinetik 1:9d4063b3036f 22 string received = ""; //from slave
kinetik 1:9d4063b3036f 23 string sent = ""; //to slave
kinetik 1:9d4063b3036f 24
kinetik 1:9d4063b3036f 25 string feather_receive = ""; //data recieved from Feather
kinetik 1:9d4063b3036f 26 string feather_sent = ""; //data sent to the Feather
kinetik 1:9d4063b3036f 27
kinetik 1:9d4063b3036f 28 int convert_val = 0;
kinetik 1:9d4063b3036f 29 int s_dim_amt = 0;
kinetik 1:9d4063b3036f 30 float dim_percent = 0.0;
kinetik 1:9d4063b3036f 31
kinetik 1:9d4063b3036f 32 int i = 0; //intialize
kinetik 1:9d4063b3036f 33 int j = 0;
kinetik 1:9d4063b3036f 34 char box;
kinetik 1:9d4063b3036f 35
kinetik 1:9d4063b3036f 36 void wifi_communication_action(void const *args)
kinetik 1:9d4063b3036f 37 {
kinetik 1:9d4063b3036f 38 while(1){
kinetik 1:9d4063b3036f 39 // Data frame[18]: G S | M A | 000 | 000 | S | A | 000 | 000
kinetik 1:9d4063b3036f 40 // 'GWDM' 0-100 Master Light Level, OR 'GWDS' 0-100 Slave Light Level
kinetik 1:9d4063b3036f 41 char wifi_message [18] = {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
kinetik 1:9d4063b3036f 42 string message = ""; // Empty Message String
kinetik 1:9d4063b3036f 43 int i = 0; // Iterator
kinetik 1:9d4063b3036f 44
kinetik 1:9d4063b3036f 45 while(wifi.readable()) { // Receive Webapp Data from Adafruit Feather
kinetik 1:9d4063b3036f 46 wifi_message[i] = wifi.getc(); // Get each character WiFi Message.
kinetik 1:9d4063b3036f 47 i = i+1; // Iterate.
kinetik 1:9d4063b3036f 48 osDelay(10); // Delay the OS 10ms WILL MOST LIKELY ADJUST TIMING FOR LAST 10% COMPLETION
kinetik 1:9d4063b3036f 49 }
kinetik 1:9d4063b3036f 50
kinetik 1:9d4063b3036f 51 message = wifi_message; // Save the character array as a string. USELESS
kinetik 1:9d4063b3036f 52 pc.printf(wifi_message);
kinetik 1:9d4063b3036f 53 i = 0; // Reset the iterator.
kinetik 1:9d4063b3036f 54 // ------------------------------Data process --------------------------------------------------------
kinetik 1:9d4063b3036f 55 if (wifi_message [3] == 0 ) // Check: Manual mode for Master
kinetik 1:9d4063b3036f 56 master_manual = true;
kinetik 1:9d4063b3036f 57 if (wifi_message [11] == 0) // Check: Manual mode for Slave
kinetik 1:9d4063b3036f 58 slave_manual = true;
kinetik 1:9d4063b3036f 59
kinetik 1:9d4063b3036f 60 if (wifi_message [2] == 'D') { // if Dimming check if slave
kinetik 1:9d4063b3036f 61 if(wifi_message[3] == 'S') { // if slave print message
kinetik 1:9d4063b3036f 62 pc.printf(wifi_message);
kinetik 1:9d4063b3036f 63 } else if (wifi_message[3] == 'M') { // else if master, parse message
kinetik 1:9d4063b3036f 64 int temp1, temp2, temp3; // temp values convert char to int
kinetik 1:9d4063b3036f 65 temp1 = (int)wifi_message[4] - 48;//100's place || CHAR '0' IS 48 IN DEC
kinetik 1:9d4063b3036f 66 temp2 = (int)wifi_message[5] - 48;//10's place || CHAR '0' IS 48 IN DEC
kinetik 1:9d4063b3036f 67 temp3 = (int)wifi_message[6] - 48;//1's place || CHAR '0' IS 48 IN DEC
kinetik 1:9d4063b3036f 68 M_Dim = (temp1*100)+(temp2*10)+(temp3); // create int value || ABILITY TO GO OVER 100%???
kinetik 1:9d4063b3036f 69 Dim_amount = (float)M_Dim/100; // get dim percentage
kinetik 1:9d4063b3036f 70 Master_signal.write(Dim_amount); // write dim level to PWM
kinetik 1:9d4063b3036f 71 //pc.printf("%0.3f dimval",Dim_amount);
kinetik 1:9d4063b3036f 72 }
kinetik 1:9d4063b3036f 73 }
kinetik 1:9d4063b3036f 74 }
kinetik 1:9d4063b3036f 75 }
kinetik 1:9d4063b3036f 76
kinetik 1:9d4063b3036f 77 void wifi_data_parse (void const *args)
kinetik 1:9d4063b3036f 78
kinetik 1:9d4063b3036f 79 // Send WiFi Status
kinetik 1:9d4063b3036f 80 void wifi_status_send(void const *args)
kinetik 1:9d4063b3036f 81 {
kinetik 1:9d4063b3036f 82 // Send Dim level message from GSM (General Status Master)
kinetik 1:9d4063b3036f 83 while(1){
kinetik 1:9d4063b3036f 84 wifi.printf("GSM%03d000S000000",M_Dim);
kinetik 1:9d4063b3036f 85 // Delay the OS by 3 seconds
kinetik 1:9d4063b3036f 86 osDelay(3000); // updating status every 3 seconds
kinetik 1:9d4063b3036f 87 }
kinetik 1:9d4063b3036f 88 }
kinetik 1:9d4063b3036f 89
kinetik 1:9d4063b3036f 90 // Define OS Thread to handle Communication between the master and the slave.
kinetik 1:9d4063b3036f 91 osThreadDef(wifi_communication_action, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 1:9d4063b3036f 92 // Define OS Thread for sending Status
kinetik 1:9d4063b3036f 93 osThreadDef(wifi_status_send, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 1:9d4063b3036f 94
kinetik 1:9d4063b3036f 95 int main ()
kinetik 1:9d4063b3036f 96 {
kinetik 1:9d4063b3036f 97 //Receive message - Slave light receiving message from Master
kinetik 1:9d4063b3036f 98 while (master_uart4.readable() != 0) //determines if there is a character to read
kinetik 1:9d4063b3036f 99 {
kinetik 1:9d4063b3036f 100 char buf;
kinetik 1:9d4063b3036f 101 buf = master_uart4.getc(); //reads a char from the serial port and places into temp mailbox
kinetik 1:9d4063b3036f 102 received[i] = buf; //stores the read char
kinetik 1:9d4063b3036f 103 i++; //traverse through array
kinetik 1:9d4063b3036f 104 osStatus.wait(0.5); //Check this value ~ 0.5 ms
kinetik 1:9d4063b3036f 105
kinetik 1:9d4063b3036f 106 } //Note: May have to reset counter to 0
kinetik 1:9d4063b3036f 107
kinetik 1:9d4063b3036f 108
kinetik 1:9d4063b3036f 109
kinetik 1:9d4063b3036f 110 // --------------------------- G-Code -----------------------------------------
kinetik 1:9d4063b3036f 111
kinetik 1:9d4063b3036f 112 switch (received [0:1])
kinetik 1:9d4063b3036f 113 {
kinetik 1:9d4063b3036f 114 case (GD): // Master DIM
kinetik 1:9d4063b3036f 115 convert_val = atoi(received[2:4]);
kinetik 1:9d4063b3036f 116 dim_percent = (convert_val)/100; //percentage range: [0.0-1.0]
kinetik 1:9d4063b3036f 117 master_pwmout(dim_percent); //output to PWM
kinetik 1:9d4063b3036f 118 break;
kinetik 1:9d4063b3036f 119
kinetik 1:9d4063b3036f 120 case (GP): // Master Power ON/OFF
kinetik 1:9d4063b3036f 121 convert_val = atoi(received[2:4]);
kinetik 1:9d4063b3036f 122 dim_percent = (convert_val)/100; //percentage range: [0.0-1.0]
kinetik 1:9d4063b3036f 123 master_pwmout(dim_percent); //output to PWM
kinetik 1:9d4063b3036f 124 break;
kinetik 1:9d4063b3036f 125
kinetik 1:9d4063b3036f 126 default:
kinetik 1:9d4063b3036f 127
kinetik 1:9d4063b3036f 128 }
kinetik 1:9d4063b3036f 129
kinetik 1:9d4063b3036f 130 switch (received [0:2]) //use a flag to confirm each case?
kinetik 1:9d4063b3036f 131 {
kinetik 1:9d4063b3036f 132 case (RDS): //Request dimming of slave
kinetik 1:9d4063b3036f 133 s_dim_amt = atoi(received[3:5]);
kinetik 1:9d4063b3036f 134 while (master_uart4.writeable() != 0)
kinetik 1:9d4063b3036f 135 {
kinetik 1:9d4063b3036f 136 master_uart4.putc('G');
kinetik 1:9d4063b3036f 137 master_uart4.putc('D');
kinetik 1:9d4063b3036f 138 master_uart4.puts(received[3:5]); //string received parsed for dim amount
kinetik 1:9d4063b3036f 139 //create a thread that waits for an event - namely confirmation from slave
kinetik 1:9d4063b3036f 140 }
kinetik 1:9d4063b3036f 141 break;
kinetik 1:9d4063b3036f 142
kinetik 1:9d4063b3036f 143 case (RPS): //Request power ON/OFF of slave
kinetik 1:9d4063b3036f 144 while (master_uart4.writeable() != 0)
kinetik 1:9d4063b3036f 145 {
kinetik 1:9d4063b3036f 146 master_uart4.putc('G');
kinetik 1:9d4063b3036f 147 master_uart4.putc('P');
kinetik 1:9d4063b3036f 148 master_uart4.puts(received[3:5]); //string received parsed for power on/off
kinetik 1:9d4063b3036f 149 //create a thread that waits for an event - namely confirmation from slave
kinetik 1:9d4063b3036f 150 }
kinetik 1:9d4063b3036f 151 break;
kinetik 1:9d4063b3036f 152
kinetik 1:9d4063b3036f 153 case (CDS): //Confirmation of dimming of slave
kinetik 1:9d4063b3036f 154
kinetik 1:9d4063b3036f 155 break;
kinetik 1:9d4063b3036f 156
kinetik 1:9d4063b3036f 157 case (CPS): //Confirmation of ON/OFF of slave
kinetik 1:9d4063b3036f 158
kinetik 1:9d4063b3036f 159 break;
kinetik 1:9d4063b3036f 160
kinetik 1:9d4063b3036f 161 default:
kinetik 1:9d4063b3036f 162
kinetik 1:9d4063b3036f 163
kinetik 1:9d4063b3036f 164 }
kinetik 1:9d4063b3036f 165 if (received[0:1] == "GD") // if there is a dimming request: G -start character, D - dim
kinetik 1:9d4063b3036f 166 {
kinetik 1:9d4063b3036f 167 convert_val = atoi(received[2:4]);
kinetik 1:9d4063b3036f 168 GD = true;
kinetik 1:9d4063b3036f 169 }
kinetik 1:9d4063b3036f 170
kinetik 1:9d4063b3036f 171
kinetik 1:9d4063b3036f 172 else GD = false;
kinetik 1:9d4063b3036f 173
kinetik 1:9d4063b3036f 174 if (received[0:1] == "GP")
kinetik 1:9d4063b3036f 175 {
kinetik 1:9d4063b3036f 176 if (received[2:4] == "000") // Slave light OFF
kinetik 1:9d4063b3036f 177 {
kinetik 1:9d4063b3036f 178 convert_val = atoi(received[2:4]);
kinetik 1:9d4063b3036f 179 break;
kinetik 1:9d4063b3036f 180 //break and jump to action thread
kinetik 1:9d4063b3036f 181 }
kinetik 1:9d4063b3036f 182
kinetik 1:9d4063b3036f 183 else if (received[2:4] == "100") // Slave light FULL ON
kinetik 1:9d4063b3036f 184 {
kinetik 1:9d4063b3036f 185 convert_val = atoi(received[2:4]);
kinetik 1:9d4063b3036f 186 break;
kinetik 1:9d4063b3036f 187 //break and jump to action thread
kinetik 1:9d4063b3036f 188 }
kinetik 1:9d4063b3036f 189
kinetik 1:9d4063b3036f 190 else GP = false;
kinetik 1:9d4063b3036f 191
kinetik 1:9d4063b3036f 192 }
kinetik 1:9d4063b3036f 193
kinetik 1:9d4063b3036f 194 //action thread here
kinetik 1:9d4063b3036f 195 if (GD == true || GP == true)
kinetik 1:9d4063b3036f 196 {
kinetik 1:9d4063b3036f 197 dim_percent = (convert_val)/100; //percentage range: [0.0-1.0]
kinetik 1:9d4063b3036f 198 master_pwmout(dim_percent); //output to PWM
kinetik 1:9d4063b3036f 199 //printf("GED%i", +convert_val);
kinetik 1:9d4063b3036f 200
kinetik 1:9d4063b3036f 201 //Send request to Slave light ------------------------------------
kinetik 1:9d4063b3036f 202 //Use putc() or printf
kinetik 1:9d4063b3036f 203
kinetik 1:9d4063b3036f 204 while (uart4.writeable() != 0) // Maybe split up the cases here?
kinetik 1:9d4063b3036f 205 {
kinetik 1:9d4063b3036f 206 char buf_confirm;
kinetik 1:9d4063b3036f 207 buf_confirm = uart4.putc(received[j]);
kinetik 1:9d4063b3036f 208 sent[j] = received[j]; //optional store for printing later
kinetik 1:9d4063b3036f 209 j++
kinetik 1:9d4063b3036f 210
kinetik 1:9d4063b3036f 211 }
kinetik 1:9d4063b3036f 212
kinetik 1:9d4063b3036f 213 }
kinetik 1:9d4063b3036f 214
kinetik 1:9d4063b3036f 215
kinetik 1:9d4063b3036f 216
kinetik 1:9d4063b3036f 217
kinetik 1:9d4063b3036f 218
kinetik 1:9d4063b3036f 219 }