CECS 490B RTOS / Mbed 2 deprecated LOC_master_firmware_042416

Dependencies:   mbed-rtos mbed

Committer:
kinetik
Date:
Sun Apr 24 20:15:26 2016 +0000
Revision:
0:da6d7d20a81a
Child:
1:32ac32201889
Master firmware - Prioritize potentiometer 4/24/16

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>
kinetik 0:da6d7d20a81a 7
kinetik 0:da6d7d20a81a 8 /*
kinetik 0:da6d7d20a81a 9 Master firmware
kinetik 0:da6d7d20a81a 10 Description: Baud rate - 115200
kinetik 0:da6d7d20a81a 11
kinetik 0:da6d7d20a81a 12 Priority: (1)Master requests
kinetik 0:da6d7d20a81a 13 (2)Send data to slave
kinetik 0:da6d7d20a81a 14 (3)Confirmation data from slave
kinetik 0:da6d7d20a81a 15
kinetik 0:da6d7d20a81a 16 */
kinetik 0:da6d7d20a81a 17 //RawSerial object_name(PinName tx, PinName rx)
kinetik 0:da6d7d20a81a 18 RawSerial XBEE(p37, p31); //Master to slave communication
kinetik 0:da6d7d20a81a 19
kinetik 0:da6d7d20a81a 20 RawSerial pc(USBTX,USBRX); //UART monitor from pc
kinetik 0:da6d7d20a81a 21 RawSerial wifi(p9, p10); // master to wifi UART
kinetik 0:da6d7d20a81a 22
kinetik 0:da6d7d20a81a 23 AnalogIn m_pot(p15);
kinetik 0:da6d7d20a81a 24
kinetik 0:da6d7d20a81a 25 float m_pot_val = 0.0;
kinetik 0:da6d7d20a81a 26 float s_pot_val = 0.0;
kinetik 0:da6d7d20a81a 27
kinetik 0:da6d7d20a81a 28 PwmOut pwm(p27);
kinetik 0:da6d7d20a81a 29
kinetik 0:da6d7d20a81a 30 bool master_manual = false;
kinetik 0:da6d7d20a81a 31 bool slave_manual = false;
kinetik 0:da6d7d20a81a 32 string received = ""; //from slave
kinetik 0:da6d7d20a81a 33 string sent = ""; //to slave
kinetik 0:da6d7d20a81a 34
kinetik 0:da6d7d20a81a 35 string feather_receive = ""; //data recieved from Feather
kinetik 0:da6d7d20a81a 36 string feather_sent = ""; //data sent to the Feather
kinetik 0:da6d7d20a81a 37
kinetik 0:da6d7d20a81a 38 int convert_val = 0;
kinetik 0:da6d7d20a81a 39 int s_dim_amt = 0;
kinetik 0:da6d7d20a81a 40 int m_dim_amt = 0;
kinetik 0:da6d7d20a81a 41 int s_temp = 0;
kinetik 0:da6d7d20a81a 42 int m_temp = 0;
kinetik 0:da6d7d20a81a 43 float dim_percent = 0.0;
kinetik 0:da6d7d20a81a 44
kinetik 0:da6d7d20a81a 45 int i = 0; //intialize
kinetik 0:da6d7d20a81a 46 int j = 0;
kinetik 0:da6d7d20a81a 47 char box;
kinetik 0:da6d7d20a81a 48
kinetik 0:da6d7d20a81a 49 void wifi_communication_action(void const *args)
kinetik 0:da6d7d20a81a 50 {
kinetik 0:da6d7d20a81a 51 while(1){
kinetik 0:da6d7d20a81a 52 // Data frame[18]: G S | M A | 000 | 000 | S | A | 000 | 000
kinetik 0:da6d7d20a81a 53 // 'GWDM' 0-100 Master Light Level, OR 'GWDS' 0-100 Slave Light Level
kinetik 0:da6d7d20a81a 54 char wifi_message [18] = {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
kinetik 0:da6d7d20a81a 55 string message = ""; // Empty Message String
kinetik 0:da6d7d20a81a 56 int i = 0; // Iterator
kinetik 0:da6d7d20a81a 57
kinetik 0:da6d7d20a81a 58 while(wifi.readable()) { // Receive Webapp Data from Adafruit Feather
kinetik 0:da6d7d20a81a 59 wifi_message[i] = wifi.getc(); // Get each character WiFi Message.
kinetik 0:da6d7d20a81a 60 i = i+1; // Iterate
kinetik 0:da6d7d20a81a 61 osDelay(10); // Delay the OS 10ms WILL MOST LIKELY ADJUST TIMING FOR LAST 10% COMPLETION
kinetik 0:da6d7d20a81a 62 }
kinetik 0:da6d7d20a81a 63
kinetik 0:da6d7d20a81a 64 //message = wifi_message; // Save the character array as a string. USELESS
kinetik 0:da6d7d20a81a 65 pc.printf(wifi_message); //Echo to terminal
kinetik 0:da6d7d20a81a 66 i = 0; // Reset the iterator
kinetik 0:da6d7d20a81a 67 // ------------------------------Data parsing --------------------------------------------------------
kinetik 0:da6d7d20a81a 68
kinetik 0:da6d7d20a81a 69 if ( toupper(wifi_message [0]) == "G" && wifi_message [2] == "M" && wifi_message [10] == "S" )
kinetik 0:da6d7d20a81a 70 {
kinetik 0:da6d7d20a81a 71 m_dim_amt = atoi(wifi_message[4:6]);
kinetik 0:da6d7d20a81a 72 m_temp = atoi(wifi_message[7:9]);
kinetik 0:da6d7d20a81a 73 s_dim_amt = atoi(wifi_message[12:14]);
kinetik 0:da6d7d20a81a 74 s_temp = aoti(wifi_message[15:17]);
kinetik 0:da6d7d20a81a 75
kinetik 0:da6d7d20a81a 76 if (wifi_message [1] == "S") //Print status
kinetik 0:da6d7d20a81a 77 {
kinetik 0:da6d7d20a81a 78 pc.printf(wifi_message); //Echo to terminal
kinetik 0:da6d7d20a81a 79 }
kinetik 0:da6d7d20a81a 80
kinetik 0:da6d7d20a81a 81 else if (wifi_message [1] == "D") //Dim
kinetik 0:da6d7d20a81a 82 {
kinetik 0:da6d7d20a81a 83 m_dim_amt = atoi(wifi_message[4:6]);
kinetik 0:da6d7d20a81a 84 m_temp = atoi(wifi_message[7:9]);
kinetik 0:da6d7d20a81a 85 s_dim_amt = atoi(wifi_message[12:14]);
kinetik 0:da6d7d20a81a 86 s_temp = aoti(wifi_message[15:17]);
kinetik 0:da6d7d20a81a 87
kinetik 0:da6d7d20a81a 88 }
kinetik 0:da6d7d20a81a 89
kinetik 0:da6d7d20a81a 90 }
kinetik 0:da6d7d20a81a 91
kinetik 0:da6d7d20a81a 92 // ----------------------------- Prioritize Wireless/Manual Mode -----------------------------------
kinetik 0:da6d7d20a81a 93
kinetik 0:da6d7d20a81a 94 if ( m_pot.read() > 0.0 )
kinetik 0:da6d7d20a81a 95 {
kinetik 0:da6d7d20a81a 96 if (wifi_message [3] == "0" ) // Check: Manual mode for Master
kinetik 0:da6d7d20a81a 97 {
kinetik 0:da6d7d20a81a 98 master_manual = true;
kinetik 0:da6d7d20a81a 99 m_pot_val = m_pot.read(); //read in value from potentiometer
kinetik 0:da6d7d20a81a 100 pwm.write(m_pot_val); //output potentiometer value to pwm
kinetik 0:da6d7d20a81a 101 }
kinetik 0:da6d7d20a81a 102
kinetik 0:da6d7d20a81a 103 else if (wifi_message [3] == "1" ) //Check: Wireless for master
kinetik 0:da6d7d20a81a 104 {
kinetik 0:da6d7d20a81a 105 pwm.write((float)(m_dim_amt/100)); //Send out dim value from parsed data wirelessly
kinetik 0:da6d7d20a81a 106
kinetik 0:da6d7d20a81a 107 }
kinetik 0:da6d7d20a81a 108 }
kinetik 0:da6d7d20a81a 109
kinetik 0:da6d7d20a81a 110 if ( s_pot.read() > 0.0)
kinetik 0:da6d7d20a81a 111 {
kinetik 0:da6d7d20a81a 112 if (wifi_message [11] == "0") // Check: Manual mode for Slave
kinetik 0:da6d7d20a81a 113 {
kinetik 0:da6d7d20a81a 114 slave_manual = true;
kinetik 0:da6d7d20a81a 115 s_pot_val = s_pot.read();
kinetik 0:da6d7d20a81a 116 pwm.write(s_pot_val);
kinetik 0:da6d7d20a81a 117 }
kinetik 0:da6d7d20a81a 118 else if (wifi_message [11] == "1" ) //Check: Wireless for slave
kinetik 0:da6d7d20a81a 119 {
kinetik 0:da6d7d20a81a 120 pwm.write((float)(s_dim_amt/100)); //Send out dim value from parsed data wirelessly
kinetik 0:da6d7d20a81a 121
kinetik 0:da6d7d20a81a 122 }
kinetik 0:da6d7d20a81a 123 }
kinetik 0:da6d7d20a81a 124
kinetik 0:da6d7d20a81a 125 /*
kinetik 0:da6d7d20a81a 126 if (wifi_message [2] == 'D') { // if Dimming check if slave
kinetik 0:da6d7d20a81a 127 if(wifi_message[3] == 'S') { // if slave print message
kinetik 0:da6d7d20a81a 128 pc.printf(wifi_message);
kinetik 0:da6d7d20a81a 129 } else if (wifi_message[3] == 'M') { // else if master, parse message
kinetik 0:da6d7d20a81a 130 int temp1, temp2, temp3; // temp values convert char to int
kinetik 0:da6d7d20a81a 131 temp1 = (int)wifi_message[4] - 48;//100's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 132 temp2 = (int)wifi_message[5] - 48;//10's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 133 temp3 = (int)wifi_message[6] - 48;//1's place || CHAR '0' IS 48 IN DEC
kinetik 0:da6d7d20a81a 134 M_Dim = (temp1*100)+(temp2*10)+(temp3); // create int value || ABILITY TO GO OVER 100%???
kinetik 0:da6d7d20a81a 135 Dim_amount = (float)M_Dim/100; // get dim percentage
kinetik 0:da6d7d20a81a 136 Master_signal.write(Dim_amount); // write dim level to PWM
kinetik 0:da6d7d20a81a 137 //pc.printf("%0.3f dimval",Dim_amount);
kinetik 0:da6d7d20a81a 138 }
kinetik 0:da6d7d20a81a 139 }
kinetik 0:da6d7d20a81a 140 */
kinetik 0:da6d7d20a81a 141 } //end superloop
kinetik 0:da6d7d20a81a 142 }//end thread
kinetik 0:da6d7d20a81a 143
kinetik 0:da6d7d20a81a 144
kinetik 0:da6d7d20a81a 145 // Send WiFi Status
kinetik 0:da6d7d20a81a 146 void wifi_status_send(void const *args)
kinetik 0:da6d7d20a81a 147 {
kinetik 0:da6d7d20a81a 148 // Send Dim level message from GSM (General Status Master)
kinetik 0:da6d7d20a81a 149 while(1){
kinetik 0:da6d7d20a81a 150 wifi.printf("GSM%03d000S000000",M_Dim);
kinetik 0:da6d7d20a81a 151 // Delay the OS by 3 seconds
kinetik 0:da6d7d20a81a 152 osDelay(3000); // updating status every 3 seconds
kinetik 0:da6d7d20a81a 153 }
kinetik 0:da6d7d20a81a 154 }
kinetik 0:da6d7d20a81a 155
kinetik 0:da6d7d20a81a 156 // Define OS Thread to handle Communication between the master and the slave.
kinetik 0:da6d7d20a81a 157 osThreadDef(wifi_communication_action, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 158 // Define OS Thread for sending Status
kinetik 0:da6d7d20a81a 159 osThreadDef(wifi_status_send, osPriorityNormal, DEFAULT_STACK_SIZE);
kinetik 0:da6d7d20a81a 160
kinetik 0:da6d7d20a81a 161 int main ()
kinetik 0:da6d7d20a81a 162 {
kinetik 0:da6d7d20a81a 163 //Receive message - Slave light receiving message from Master
kinetik 0:da6d7d20a81a 164 while (master_uart4.readable() != 0) //determines if there is a character to read
kinetik 0:da6d7d20a81a 165 {
kinetik 0:da6d7d20a81a 166 char buf;
kinetik 0:da6d7d20a81a 167 buf = master_uart4.getc(); //reads a char from the serial port and places into temp mailbox
kinetik 0:da6d7d20a81a 168 received[i] = buf; //stores the read char
kinetik 0:da6d7d20a81a 169 i++; //traverse through array
kinetik 0:da6d7d20a81a 170 osStatus.wait(0.5); //Check this value ~ 0.5 ms
kinetik 0:da6d7d20a81a 171
kinetik 0:da6d7d20a81a 172 } //Note: May have to reset counter to 0
kinetik 0:da6d7d20a81a 173
kinetik 0:da6d7d20a81a 174
kinetik 0:da6d7d20a81a 175
kinetik 0:da6d7d20a81a 176 }