MBED Framework with communication to be tested

Dependencies:   mbed

Committer:
AndrewLouw
Date:
Thu Jun 15 14:53:00 2017 +0000
Revision:
1:e8c5a9654f5f
Parent:
0:a32d085719df
Child:
2:64443528f6bb
Most shell functions done;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndrewLouw 0:a32d085719df 1 #include "mbed.h"
AndrewLouw 0:a32d085719df 2 #include "PINNAMES.h"
AndrewLouw 0:a32d085719df 3 #include "SPICOMMANDS.h"
AndrewLouw 0:a32d085719df 4 #include "PROTOTYPES.h"
AndrewLouw 0:a32d085719df 5 #include "CAN_Data.h"
AndrewLouw 0:a32d085719df 6 #include "CAN_IDs.h"
AndrewLouw 0:a32d085719df 7 using namespace CAN_IDs;
AndrewLouw 0:a32d085719df 8
AndrewLouw 0:a32d085719df 9 #define CAN_BUFFER_SIZE 6
AndrewLouw 0:a32d085719df 10
AndrewLouw 0:a32d085719df 11 CANMessage msg;
AndrewLouw 0:a32d085719df 12 CANMessage buffer[CAN_BUFFER_SIZE];
AndrewLouw 0:a32d085719df 13 bool safeToRead[CAN_BUFFER_SIZE];
AndrewLouw 0:a32d085719df 14 bool safeToWrite[CAN_BUFFER_SIZE];
AndrewLouw 0:a32d085719df 15
AndrewLouw 0:a32d085719df 16
AndrewLouw 0:a32d085719df 17 int main() {
AndrewLouw 0:a32d085719df 18
AndrewLouw 0:a32d085719df 19 //main loop variables
AndrewLouw 0:a32d085719df 20 bool Shutdown;
AndrewLouw 0:a32d085719df 21 OpModesym OpMode= Setup; //OpMode variable
AndrewLouw 0:a32d085719df 22 Errorsym ErrorFlag = False; //Error flag
AndrewLouw 0:a32d085719df 23
AndrewLouw 0:a32d085719df 24 //angle limits
AndrewLouw 0:a32d085719df 25 const double Upperlimit_Can_on = 0;
AndrewLouw 0:a32d085719df 26 const double Upperlimit_Can_off = 0;
AndrewLouw 0:a32d085719df 27 const double Lowerlimit_Can_on = 100;
AndrewLouw 0:a32d085719df 28 const double Lowerlimit_Can_off = 100;
AndrewLouw 0:a32d085719df 29
AndrewLouw 0:a32d085719df 30 //allocate memorry for data
AndrewLouw 0:a32d085719df 31 float LDR1; //LDR1's value
AndrewLouw 0:a32d085719df 32 float LDR2; //LDR2's value
AndrewLouw 1:e8c5a9654f5f 33
AndrewLouw 1:e8c5a9654f5f 34 float MPPT [5];
AndrewLouw 1:e8c5a9654f5f 35 #define bat_volt MPPT[0]
AndrewLouw 1:e8c5a9654f5f 36 #define bat_current MPPT[1]
AndrewLouw 1:e8c5a9654f5f 37 #define bat_temp MPPT[2]
AndrewLouw 1:e8c5a9654f5f 38 #define bat_status MPPT[3]
AndrewLouw 1:e8c5a9654f5f 39 #define PV_volt MPPT[4]
AndrewLouw 1:e8c5a9654f5f 40
AndrewLouw 0:a32d085719df 41 double panel_locations [6]; //the array for actual/desired location of each panel
AndrewLouw 0:a32d085719df 42
AndrewLouw 0:a32d085719df 43 //main loop.
AndrewLouw 0:a32d085719df 44 while(1){
AndrewLouw 0:a32d085719df 45 if(ErrorFlag==False){
AndrewLouw 0:a32d085719df 46 switch (OpMode){
AndrewLouw 0:a32d085719df 47 case Setup:
AndrewLouw 0:a32d085719df 48 //setup SPI
AndrewLouw 0:a32d085719df 49 SlaveSelect=1;
AndrewLouw 0:a32d085719df 50 spi.format(8,3);
AndrewLouw 0:a32d085719df 51 spi.frequency(1000000);
AndrewLouw 0:a32d085719df 52 SlaveSelect=0;
AndrewLouw 0:a32d085719df 53
AndrewLouw 0:a32d085719df 54 //setup CAN
AndrewLouw 0:a32d085719df 55 for(int i=0; i<CAN_BUFFER_SIZE; i++) {
AndrewLouw 0:a32d085719df 56 buffer[i].id = BLANK_ID;
AndrewLouw 0:a32d085719df 57 //buffer[i]= createMotorDriveMsg(0.0, 20000.0);
AndrewLouw 0:a32d085719df 58 //buffer[i].id = BMS_BASE_ID + BATTERY_VI_ID;
AndrewLouw 0:a32d085719df 59 //printf("%d",buffer[i].id);
AndrewLouw 0:a32d085719df 60 safeToRead[i] = true;
AndrewLouw 0:a32d085719df 61 safeToWrite[i]= true;
AndrewLouw 0:a32d085719df 62 }
AndrewLouw 0:a32d085719df 63 can.frequency(CAN_BIT_RATE); //set transmission rate to agreed bit rate (ELEC-006)
AndrewLouw 0:a32d085719df 64 can.reset(); // (FUNC-018)
AndrewLouw 0:a32d085719df 65 can.attach(&interruptHandler, CAN::RxIrq);
AndrewLouw 0:a32d085719df 66
AndrewLouw 0:a32d085719df 67 //start in correct mode
AndrewLouw 0:a32d085719df 68 OpMode = readswitches();
AndrewLouw 0:a32d085719df 69 StatusLED = 1;
AndrewLouw 0:a32d085719df 70 break;
AndrewLouw 0:a32d085719df 71
AndrewLouw 0:a32d085719df 72 case Canopy_on:
AndrewLouw 0:a32d085719df 73 checkLDR(LDR1,LDR2);
AndrewLouw 0:a32d085719df 74 checkMPPT(MPPT);
AndrewLouw 0:a32d085719df 75 if(shouldmove(MPPT,LDR1,LDR2,Upperlimit_Can_on,Lowerlimit_Can_on,panel_locations)){
AndrewLouw 0:a32d085719df 76 sendlocations(panel_locations);
AndrewLouw 0:a32d085719df 77 }
AndrewLouw 0:a32d085719df 78 else{
AndrewLouw 1:e8c5a9654f5f 79 wait(120);
AndrewLouw 0:a32d085719df 80 }
AndrewLouw 0:a32d085719df 81 OpMode = readswitches();
AndrewLouw 0:a32d085719df 82 break;
AndrewLouw 0:a32d085719df 83
AndrewLouw 0:a32d085719df 84 case Canopy_off:
AndrewLouw 0:a32d085719df 85 checkLDR(LDR1,LDR2);
AndrewLouw 0:a32d085719df 86 checkMPPT(MPPT);
AndrewLouw 0:a32d085719df 87 if(shouldmove(MPPT,LDR1,LDR2,Upperlimit_Can_off,Lowerlimit_Can_off,panel_locations)){
AndrewLouw 0:a32d085719df 88 sendlocations(panel_locations);
AndrewLouw 0:a32d085719df 89 }
AndrewLouw 0:a32d085719df 90 else{
AndrewLouw 1:e8c5a9654f5f 91 wait(120);
AndrewLouw 0:a32d085719df 92 }
AndrewLouw 0:a32d085719df 93 OpMode = readswitches();
AndrewLouw 0:a32d085719df 94 break;
AndrewLouw 0:a32d085719df 95
AndrewLouw 0:a32d085719df 96 case Manual:
AndrewLouw 1:e8c5a9654f5f 97 //calibration mode - finds upper and lower limits for each panel for the current setup (canopy up oor down)
AndrewLouw 1:e8c5a9654f5f 98
AndrewLouw 1:e8c5a9654f5f 99 while(MANUAL_SW){//release the button
AndrewLouw 1:e8c5a9654f5f 100 }
AndrewLouw 1:e8c5a9654f5f 101
AndrewLouw 1:e8c5a9654f5f 102 //panels should be moved to lower limit
AndrewLouw 1:e8c5a9654f5f 103 while(!MANUAL_SW){//then the switch should be pressed again
AndrewLouw 1:e8c5a9654f5f 104 }
AndrewLouw 1:e8c5a9654f5f 105
AndrewLouw 1:e8c5a9654f5f 106 //TODO
AndrewLouw 1:e8c5a9654f5f 107 //panel locations will be read and values stored as lower limit
AndrewLouw 1:e8c5a9654f5f 108
AndrewLouw 1:e8c5a9654f5f 109
AndrewLouw 1:e8c5a9654f5f 110 while(MANUAL_SW){//release the button
AndrewLouw 1:e8c5a9654f5f 111 }
AndrewLouw 1:e8c5a9654f5f 112
AndrewLouw 1:e8c5a9654f5f 113 //then panels should be moved to the upper limit
AndrewLouw 1:e8c5a9654f5f 114 while(!MANUAL_SW){//then the switch should be pressed again
AndrewLouw 1:e8c5a9654f5f 115 }
AndrewLouw 1:e8c5a9654f5f 116
AndrewLouw 1:e8c5a9654f5f 117 //TODO
AndrewLouw 1:e8c5a9654f5f 118 //panel locations will be read and values stored as upper limit
AndrewLouw 1:e8c5a9654f5f 119
AndrewLouw 1:e8c5a9654f5f 120
AndrewLouw 1:e8c5a9654f5f 121 while(MANUAL_SW){//release the button
AndrewLouw 1:e8c5a9654f5f 122 }
AndrewLouw 1:e8c5a9654f5f 123
AndrewLouw 1:e8c5a9654f5f 124
AndrewLouw 1:e8c5a9654f5f 125
AndrewLouw 1:e8c5a9654f5f 126
AndrewLouw 1:e8c5a9654f5f 127
AndrewLouw 1:e8c5a9654f5f 128
AndrewLouw 0:a32d085719df 129 break;
AndrewLouw 0:a32d085719df 130
AndrewLouw 0:a32d085719df 131
AndrewLouw 0:a32d085719df 132 case Error:
AndrewLouw 0:a32d085719df 133 ErrorFlag = Switch_Error;
AndrewLouw 0:a32d085719df 134 break;
AndrewLouw 0:a32d085719df 135
AndrewLouw 0:a32d085719df 136 default:
AndrewLouw 0:a32d085719df 137 OpMode = Error;
AndrewLouw 0:a32d085719df 138 break;
AndrewLouw 0:a32d085719df 139 }
AndrewLouw 0:a32d085719df 140
AndrewLouw 0:a32d085719df 141 }
AndrewLouw 0:a32d085719df 142 else{ //do this if shutting down
AndrewLouw 0:a32d085719df 143 switch (ErrorFlag){
AndrewLouw 0:a32d085719df 144 case False:
AndrewLouw 0:a32d085719df 145 OpMode= Setup;
AndrewLouw 0:a32d085719df 146 break;
AndrewLouw 0:a32d085719df 147
AndrewLouw 0:a32d085719df 148 case Switch_Error:
AndrewLouw 0:a32d085719df 149 OpMode = Canopy_on;
AndrewLouw 0:a32d085719df 150 break;
AndrewLouw 0:a32d085719df 151
AndrewLouw 0:a32d085719df 152 default:
AndrewLouw 0:a32d085719df 153 Shutdown = true;
AndrewLouw 0:a32d085719df 154 break;
AndrewLouw 0:a32d085719df 155 }
AndrewLouw 0:a32d085719df 156 }
AndrewLouw 0:a32d085719df 157 if(Shutdown){
AndrewLouw 0:a32d085719df 158 break;
AndrewLouw 0:a32d085719df 159 }
AndrewLouw 0:a32d085719df 160 }
AndrewLouw 0:a32d085719df 161 }
AndrewLouw 0:a32d085719df 162
AndrewLouw 0:a32d085719df 163 OpModesym readswitches(){ //read canopy switches
AndrewLouw 0:a32d085719df 164 if(MANUAL_SW){
AndrewLouw 0:a32d085719df 165 return Manual;
AndrewLouw 0:a32d085719df 166 }
AndrewLouw 0:a32d085719df 167 else{
AndrewLouw 0:a32d085719df 168 if(CANOPY_SW){
AndrewLouw 0:a32d085719df 169 return Canopy_on;
AndrewLouw 0:a32d085719df 170 }
AndrewLouw 0:a32d085719df 171 else{
AndrewLouw 0:a32d085719df 172 return Canopy_off;
AndrewLouw 0:a32d085719df 173 }
AndrewLouw 0:a32d085719df 174 }
AndrewLouw 0:a32d085719df 175 }
AndrewLouw 0:a32d085719df 176 void checkLDR(float &LDR1,float &LDR2){ //get the LDR values
AndrewLouw 0:a32d085719df 177 LDR1 = LDR_SENSE1;
AndrewLouw 0:a32d085719df 178 LDR2 = LDR_SENSE1;
AndrewLouw 0:a32d085719df 179 }
AndrewLouw 1:e8c5a9654f5f 180
AndrewLouw 1:e8c5a9654f5f 181 void checkMPPT(float *MPPT){ //get the MPPT values
AndrewLouw 1:e8c5a9654f5f 182 for (int i=CAN_BUFFER_SIZE - 1;i>=0;i--){
AndrewLouw 1:e8c5a9654f5f 183 if(buffer[i].id == MPPT_CMD && safeToRead[i]) {
AndrewLouw 1:e8c5a9654f5f 184 safeToWrite[i]=false;
AndrewLouw 1:e8c5a9654f5f 185 bat_volt = (buffer[i].data[0]<<8 | buffer[i].data[1])*0.01;
AndrewLouw 1:e8c5a9654f5f 186 bat_current = (buffer[i].data[2]<<8 | buffer[i].data[3])*0.01;
AndrewLouw 1:e8c5a9654f5f 187 bat_temp = buffer[i].data[4];
AndrewLouw 1:e8c5a9654f5f 188 bat_status = buffer[i].data[5];
AndrewLouw 1:e8c5a9654f5f 189 PV_volt = (buffer[i].data[6]<<8 | buffer[i].data[7])*0.01;
AndrewLouw 1:e8c5a9654f5f 190 buffer[i].id = BLANK_ID;
AndrewLouw 1:e8c5a9654f5f 191 return;
AndrewLouw 1:e8c5a9654f5f 192 }
AndrewLouw 1:e8c5a9654f5f 193 }
AndrewLouw 0:a32d085719df 194 }
AndrewLouw 0:a32d085719df 195
AndrewLouw 1:e8c5a9654f5f 196 bool shouldmove(float *MPPT,float LDR1,float LDR2,double Upperlimit,double Lowelimit,double *panel_locations){ //checks if the motors should move based on current location and sensor data
AndrewLouw 0:a32d085719df 197 //TODO
AndrewLouw 1:e8c5a9654f5f 198 //need to use "getlocations"
AndrewLouw 0:a32d085719df 199 }
AndrewLouw 0:a32d085719df 200
AndrewLouw 0:a32d085719df 201 void getlocations(double Upperlimit, double Lowerlimit,double *panel_locations){ //update panel locations from actual to desired
AndrewLouw 0:a32d085719df 202 //TODO
AndrewLouw 1:e8c5a9654f5f 203 //update panellocations
AndrewLouw 0:a32d085719df 204 }
AndrewLouw 0:a32d085719df 205
AndrewLouw 0:a32d085719df 206 void sendlocations(double *panel_locations){ //transmit the desired locations
AndrewLouw 1:e8c5a9654f5f 207 for(int i=1; i<=6; i++) {
AndrewLouw 1:e8c5a9654f5f 208 SlaveSelect = 0;
AndrewLouw 1:e8c5a9654f5f 209 spi.write((uint8_t) (i));
AndrewLouw 1:e8c5a9654f5f 210 wait_ms(1);
AndrewLouw 1:e8c5a9654f5f 211 spi.write(toEncoder(panel_locations[i-1]));
AndrewLouw 1:e8c5a9654f5f 212 SlaveSelect = 1;
AndrewLouw 1:e8c5a9654f5f 213 }
AndrewLouw 0:a32d085719df 214 }
AndrewLouw 0:a32d085719df 215
AndrewLouw 1:e8c5a9654f5f 216 uint8_t toEncoder(double angle){ //convert angle to encoder value
AndrewLouw 0:a32d085719df 217 //TODO
AndrewLouw 0:a32d085719df 218 }
AndrewLouw 0:a32d085719df 219
AndrewLouw 0:a32d085719df 220 void interruptHandler()
AndrewLouw 0:a32d085719df 221 {
AndrewLouw 0:a32d085719df 222 //CANMessage msg;
AndrewLouw 0:a32d085719df 223 can.read(msg);
AndrewLouw 0:a32d085719df 224 //printf("id %d incoming \r\n", msg.id);
AndrewLouw 0:a32d085719df 225 if(msg.id==MPPT_CMD) {
AndrewLouw 0:a32d085719df 226 for(int i=0; i<CAN_BUFFER_SIZE; i++) {
AndrewLouw 0:a32d085719df 227 if((buffer[i].id == msg.id || buffer[i].id==BLANK_ID) && safeToWrite[i]) {
AndrewLouw 0:a32d085719df 228 //printf("id %d added to buffer \r\n", msg.id);
AndrewLouw 0:a32d085719df 229 safeToRead[i] = false;
AndrewLouw 0:a32d085719df 230 buffer[i] = msg;
AndrewLouw 0:a32d085719df 231 safeToRead[i]=true;
AndrewLouw 0:a32d085719df 232 //return required to prevent horrible bug
AndrewLouw 0:a32d085719df 233 return;
AndrewLouw 0:a32d085719df 234 }
AndrewLouw 0:a32d085719df 235 }
AndrewLouw 0:a32d085719df 236 }
AndrewLouw 0:a32d085719df 237 }