Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:34f37e33016d, 2016-04-25 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |