Andrew Louw
/
TrackingMBED
MBED Framework with communication to be tested
main.cpp@1:e8c5a9654f5f, 2017-06-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |