ROM Comm / Mbed 2 deprecated espar_mini_control_CAN

Dependencies:   mbed mbed-STM32F103C8T6

Committer:
lorded
Date:
Wed Jun 10 22:31:30 2020 +0000
Revision:
8:2b0d18ebbba9
Child:
9:6126b83608be
initial canbus controller commit.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lorded 8:2b0d18ebbba9 1 #include "mbed.h"
lorded 8:2b0d18ebbba9 2 #include "heatcontrol.h"
lorded 8:2b0d18ebbba9 3 #include "globals.h" // includes CAN2
lorded 8:2b0d18ebbba9 4 #include "espar_can.h"
lorded 8:2b0d18ebbba9 5 /******************************************************
lorded 8:2b0d18ebbba9 6 * Constants
lorded 8:2b0d18ebbba9 7 ******************************************************/
lorded 8:2b0d18ebbba9 8 //#define EASYSTARTFORMAT 1
lorded 8:2b0d18ebbba9 9 #define LIN_BAUD 1200
lorded 8:2b0d18ebbba9 10
lorded 8:2b0d18ebbba9 11 extern void DebugWrite(const char * str);
lorded 8:2b0d18ebbba9 12 extern char printbuff[256];
lorded 8:2b0d18ebbba9 13
lorded 8:2b0d18ebbba9 14 extern unsigned long lifetimer;
lorded 8:2b0d18ebbba9 15
lorded 8:2b0d18ebbba9 16 #define NOREPORTING 0
lorded 8:2b0d18ebbba9 17 #define HEATERCALLEDON 1
lorded 8:2b0d18ebbba9 18
lorded 8:2b0d18ebbba9 19 char heaterDetected = 0;
lorded 8:2b0d18ebbba9 20
lorded 8:2b0d18ebbba9 21 //const uint16_t HEATER1ID = 0x0054;
lorded 8:2b0d18ebbba9 22 //const uint16_t CTRLCHANNEL = 0x07A0;
lorded 8:2b0d18ebbba9 23 //#define EASYSTARTFORMAT
lorded 8:2b0d18ebbba9 24 #ifdef EASYSTARTFORMAT
lorded 8:2b0d18ebbba9 25 const uint16_t HEATER1ID = 0x0054; // 0x009C heater 1
lorded 8:2b0d18ebbba9 26 const uint16_t CTRLCHANNEL = 0x07A0;
lorded 8:2b0d18ebbba9 27 const uint16_t CTRLRESPONSE = 0x073C;// heater1 0x073C, response 0x073D heater 2
lorded 8:2b0d18ebbba9 28
lorded 8:2b0d18ebbba9 29 const uint16_t HEATER2ID = 0x0057;// 0x009C heater 1
lorded 8:2b0d18ebbba9 30 const uint16_t CTRLCHANNEL2 = 0x07A1;
lorded 8:2b0d18ebbba9 31 const uint16_t CTRLRESPONSE2 = 0x073D;// heater1 0x073C, response 0x073D heater 2
lorded 8:2b0d18ebbba9 32
lorded 8:2b0d18ebbba9 33 #else
lorded 8:2b0d18ebbba9 34 const uint16_t HEATER1ID = 0x009C; // 0x009C heater 1
lorded 8:2b0d18ebbba9 35 const uint16_t CTRLCHANNEL = 0x07A0;
lorded 8:2b0d18ebbba9 36 const uint16_t CTRLRESPONSE = 0x073C; // heater1 0x073C, response 0x073D heater 2
lorded 8:2b0d18ebbba9 37
lorded 8:2b0d18ebbba9 38 const uint16_t HEATER2ID = 0x00F3; // 0x009C heater 1
lorded 8:2b0d18ebbba9 39 const uint16_t CTRLCHANNEL2 = 0x07A1;
lorded 8:2b0d18ebbba9 40 const uint16_t CTRLRESPONSE2 = 0x073D; // heater1 0x073C, response 0x073D heater 2
lorded 8:2b0d18ebbba9 41
lorded 8:2b0d18ebbba9 42 #endif
lorded 8:2b0d18ebbba9 43
lorded 8:2b0d18ebbba9 44 /******************************************************
lorded 8:2b0d18ebbba9 45 * Enumerations
lorded 8:2b0d18ebbba9 46 ******************************************************/
lorded 8:2b0d18ebbba9 47
lorded 8:2b0d18ebbba9 48 /******************************************************
lorded 8:2b0d18ebbba9 49 * Type Definitions
lorded 8:2b0d18ebbba9 50 ******************************************************/
lorded 8:2b0d18ebbba9 51
lorded 8:2b0d18ebbba9 52 /******************************************************
lorded 8:2b0d18ebbba9 53 * Structures
lorded 8:2b0d18ebbba9 54 ******************************************************/
lorded 8:2b0d18ebbba9 55 extern struct sSystemSettings Settings; // structure to hold system settings //
lorded 8:2b0d18ebbba9 56 /******************************************************
lorded 8:2b0d18ebbba9 57 * Function Declarations
lorded 8:2b0d18ebbba9 58 ******************************************************/
lorded 8:2b0d18ebbba9 59 void printCAN(CANMessage *canMsg);
lorded 8:2b0d18ebbba9 60 void printCANTx(CANMessage *canMsg);
lorded 8:2b0d18ebbba9 61
lorded 8:2b0d18ebbba9 62 void printPacketBuffer(unsigned int length, struct sHeatVars *s);
lorded 8:2b0d18ebbba9 63 void parseLINBuffer(struct sHeatVars *s);
lorded 8:2b0d18ebbba9 64 void readLINBuffer(struct sHeatVars *s);
lorded 8:2b0d18ebbba9 65 unsigned char fromHexAscii(char ascii);
lorded 8:2b0d18ebbba9 66 extern void resetTimerAsync(struct sHeatVars *s);
lorded 8:2b0d18ebbba9 67 extern void resetTimer(struct sHeatVars *s);
lorded 8:2b0d18ebbba9 68 int doFindExpectedResponse(CANMessage* msg, const uint16_t expectedID, const char* expectedResponse, int charsInMatch);
lorded 8:2b0d18ebbba9 69 /******************************************************
lorded 8:2b0d18ebbba9 70 * Variable Definitions
lorded 8:2b0d18ebbba9 71 ******************************************************/
lorded 8:2b0d18ebbba9 72
lorded 8:2b0d18ebbba9 73 // local vars
lorded 8:2b0d18ebbba9 74 // external timer variables to use for timing (ie 1 minute, etc.)
lorded 8:2b0d18ebbba9 75 extern volatile unsigned char idletimer;
lorded 8:2b0d18ebbba9 76 extern void DebugWrite(const char* str);
lorded 8:2b0d18ebbba9 77 struct sHeatVars heaterState[2];
lorded 8:2b0d18ebbba9 78
lorded 8:2b0d18ebbba9 79 char otherControllerDetected = 0;
lorded 8:2b0d18ebbba9 80 /******************************************************
lorded 8:2b0d18ebbba9 81 * Function Definitions
lorded 8:2b0d18ebbba9 82 ******************************************************/
lorded 8:2b0d18ebbba9 83
lorded 8:2b0d18ebbba9 84 /*
lorded 8:2b0d18ebbba9 85 * 0-ID,0054:00 00 FE FF FE FF 00 00
lorded 8:2b0d18ebbba9 86
lorded 8:2b0d18ebbba9 87 0-ID,0625:25 00 B5 54 C0 BB E4 01
lorded 8:2b0d18ebbba9 88
lorded 8:2b0d18ebbba9 89 0-ID,0054:00 00 FE FF FE FF 00 00
lorded 8:2b0d18ebbba9 90
lorded 8:2b0d18ebbba9 91 0-ID,0057:00 00 FE FF FE FF 00 00
lorded 8:2b0d18ebbba9 92
lorded 8:2b0d18ebbba9 93 0-ID,0625:25 00 B5 54 C0 BB E4 01
lorded 8:2b0d18ebbba9 94
lorded 8:2b0d18ebbba9 95 0-ID,02C4:03 00 04 00 18 03 00 00
lorded 8:2b0d18ebbba9 96
lorded 8:2b0d18ebbba9 97 0-ID,02C6:F4 01 84 03 00 00 00 00
lorded 8:2b0d18ebbba9 98
lorded 8:2b0d18ebbba9 99 0-ID,0625:25 00 B5 54 C0 BB E4 01
lorded 8:2b0d18ebbba9 100
lorded 8:2b0d18ebbba9 101 0-ID,02C6:F4 01 84 03 00 00 00 00
lorded 8:2b0d18ebbba9 102
lorded 8:2b0d18ebbba9 103 0-ID,073C:02 7E 00 02 7B 00 02 11
lorded 8:2b0d18ebbba9 104
lorded 8:2b0d18ebbba9 105 0-ID,02C6:F4 01 84 03 00 00 00 00
lorded 8:2b0d18ebbba9 106
lorded 8:2b0d18ebbba9 107 0-ID,0625:25 00 B5 54 C0 BB E4 01
lorded 8:2b0d18ebbba9 108
lorded 8:2b0d18ebbba9 109 0-ID,02C6:F4 01 84 03 00 00 00 00
lorded 8:2b0d18ebbba9 110
lorded 8:2b0d18ebbba9 111 * */
lorded 8:2b0d18ebbba9 112
lorded 8:2b0d18ebbba9 113 void initHeaterState(struct sHeatVars *s)
lorded 8:2b0d18ebbba9 114 {
lorded 8:2b0d18ebbba9 115 s->internalAltitude = 0;
lorded 8:2b0d18ebbba9 116 s->battV = 0;
lorded 8:2b0d18ebbba9 117 s->primeFuelPumpCount = 0;
lorded 8:2b0d18ebbba9 118 s->heatCallDetected = WICED_FALSE;
lorded 8:2b0d18ebbba9 119 s->heaterTemp = -9999;
lorded 8:2b0d18ebbba9 120 s->initTimer = 3; // 3s before we do anything other than "I'm here"
lorded 8:2b0d18ebbba9 121 s->tasksequence = 0;
lorded 8:2b0d18ebbba9 122 s->currentError = 0xff;
lorded 8:2b0d18ebbba9 123 s->heatOn = 0; // default 0
lorded 8:2b0d18ebbba9 124 //unsigned char errorHistory[8];
lorded 8:2b0d18ebbba9 125 s->errorChangeFlag = 0;
lorded 8:2b0d18ebbba9 126 s->heatcontrolstate = 0; // default 0
lorded 8:2b0d18ebbba9 127 s->lastRequest = 0; // default = 0;
lorded 8:2b0d18ebbba9 128 s->lastResponse = 0; //default = 0;
lorded 8:2b0d18ebbba9 129 s->noResponseCount = 0; //default = 0;
lorded 8:2b0d18ebbba9 130 s->retryHC = 0; // = 0;
lorded 8:2b0d18ebbba9 131 s->heatrunning = 0; // = 0;
lorded 8:2b0d18ebbba9 132 s->reset_fault_codes = WICED_FALSE; // WICED_FALSE
lorded 8:2b0d18ebbba9 133 s->isAnalogHeater = WICED_FALSE;
lorded 8:2b0d18ebbba9 134 s->heattime = 0;
lorded 8:2b0d18ebbba9 135 s->heatresettime = RESETHEATTIME;
lorded 8:2b0d18ebbba9 136 s->reportflag = 0;
lorded 8:2b0d18ebbba9 137 s->preheattime = 0;
lorded 8:2b0d18ebbba9 138 s->heaterSetpointChange = 0;
lorded 8:2b0d18ebbba9 139 s->primeFuelPump = WICED_FALSE;
lorded 8:2b0d18ebbba9 140 s->OBAltitude = WICED_FALSE;
lorded 8:2b0d18ebbba9 141 s->altitudeMode = WICED_TRUE;
lorded 8:2b0d18ebbba9 142 }
lorded 8:2b0d18ebbba9 143 // do checksum calc
lorded 8:2b0d18ebbba9 144 int testChecksum(unsigned int length, struct sHeatVars *s)
lorded 8:2b0d18ebbba9 145 {
lorded 8:2b0d18ebbba9 146 unsigned int checksum = 0;
lorded 8:2b0d18ebbba9 147 int i;
lorded 8:2b0d18ebbba9 148 for (i = s->working; i < (s->working + length + 3); i++)
lorded 8:2b0d18ebbba9 149 {
lorded 8:2b0d18ebbba9 150 checksum += s->linbuff[i];
lorded 8:2b0d18ebbba9 151 }
lorded 8:2b0d18ebbba9 152 // convert the last 2 bytes to checksum
lorded 8:2b0d18ebbba9 153 if ((checksum % 256) == (fromHexAscii(s->linbuff[s->working + length + 3]) * 16 + fromHexAscii(s->linbuff[s->working + length + 4])))
lorded 8:2b0d18ebbba9 154 {
lorded 8:2b0d18ebbba9 155 return 1;
lorded 8:2b0d18ebbba9 156 }
lorded 8:2b0d18ebbba9 157 return 0;
lorded 8:2b0d18ebbba9 158 }
lorded 8:2b0d18ebbba9 159
lorded 8:2b0d18ebbba9 160 void InitCAN()
lorded 8:2b0d18ebbba9 161 {
lorded 8:2b0d18ebbba9 162 otherControllerDetected = 0;
lorded 8:2b0d18ebbba9 163 DebugWrite("Init can\r\n");
lorded 8:2b0d18ebbba9 164 int result;
lorded 8:2b0d18ebbba9 165 // can is just there.
lorded 8:2b0d18ebbba9 166 }
lorded 8:2b0d18ebbba9 167
lorded 8:2b0d18ebbba9 168 void setHeatSetpoint(struct sHeatVars* s, int setpoint)
lorded 8:2b0d18ebbba9 169 {
lorded 8:2b0d18ebbba9 170 printf("setting setpoint of %d\r\n", setpoint);
lorded 8:2b0d18ebbba9 171 if ((setpoint > 50) && (setpoint <= 380))
lorded 8:2b0d18ebbba9 172 {
lorded 8:2b0d18ebbba9 173 s->heaterSetpointChange = setpoint;
lorded 8:2b0d18ebbba9 174 }
lorded 8:2b0d18ebbba9 175 }
lorded 8:2b0d18ebbba9 176 void primeFuelPump(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 177 {
lorded 8:2b0d18ebbba9 178 s->primeFuelPump = WICED_TRUE;
lorded 8:2b0d18ebbba9 179 }
lorded 8:2b0d18ebbba9 180 void resetFaultCodes(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 181 {
lorded 8:2b0d18ebbba9 182 //printf("Reset Fault codes on\r\n");
lorded 8:2b0d18ebbba9 183 s->reset_fault_codes = WICED_TRUE;
lorded 8:2b0d18ebbba9 184 }
lorded 8:2b0d18ebbba9 185 void set_heat_con(struct sHeatVars* s, heatcall on_off)
lorded 8:2b0d18ebbba9 186 {
lorded 8:2b0d18ebbba9 187 resetTimerAsync(s);
lorded 8:2b0d18ebbba9 188 if (on_off == HEATCALLINIT)
lorded 8:2b0d18ebbba9 189 {
lorded 8:2b0d18ebbba9 190 s->heatOn = HEATCALLINIT;
lorded 8:2b0d18ebbba9 191 //heattime = 100; //60*Settings.DefaultHeaterRuntime;
lorded 8:2b0d18ebbba9 192 s->heattime = 24*60*60;
lorded 8:2b0d18ebbba9 193 s->heatresettime = RESETHEATTIME;
lorded 8:2b0d18ebbba9 194
lorded 8:2b0d18ebbba9 195 s->preheattime = 0;
lorded 8:2b0d18ebbba9 196 //printf("Init heater, preheat %lu\n", preheattime);
lorded 8:2b0d18ebbba9 197 }
lorded 8:2b0d18ebbba9 198 else if (on_off == HEATCALLOFF)
lorded 8:2b0d18ebbba9 199 {
lorded 8:2b0d18ebbba9 200 s->heatOn = HEATCALLOFF;
lorded 8:2b0d18ebbba9 201 s->heattime = 0;
lorded 8:2b0d18ebbba9 202 s->heatresettime = RESETHEATTIME;
lorded 8:2b0d18ebbba9 203 s->preheattime = 0;
lorded 8:2b0d18ebbba9 204 ///printf("Turning heater OFF\n");
lorded 8:2b0d18ebbba9 205 }
lorded 8:2b0d18ebbba9 206 else if (on_off == HEATCALLON)
lorded 8:2b0d18ebbba9 207 {
lorded 8:2b0d18ebbba9 208 // skip preheat
lorded 8:2b0d18ebbba9 209 s->heatOn = HEATCALLON;
lorded 8:2b0d18ebbba9 210 s->heattime = 24*60*60;
lorded 8:2b0d18ebbba9 211 s->heatresettime = RESETHEATTIME;
lorded 8:2b0d18ebbba9 212 s->preheattime = 0;
lorded 8:2b0d18ebbba9 213 //printf("Turning heater ON (skip preheat)\n");
lorded 8:2b0d18ebbba9 214 }
lorded 8:2b0d18ebbba9 215 else
lorded 8:2b0d18ebbba9 216 {
lorded 8:2b0d18ebbba9 217 //printf("\n unknown command\n");
lorded 8:2b0d18ebbba9 218 }
lorded 8:2b0d18ebbba9 219 }
lorded 8:2b0d18ebbba9 220
lorded 8:2b0d18ebbba9 221 void WakeHeater(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 222 {
lorded 8:2b0d18ebbba9 223 if (s->heatcontrolstate == 0)
lorded 8:2b0d18ebbba9 224 {
lorded 8:2b0d18ebbba9 225 //InitDigHeater();
lorded 8:2b0d18ebbba9 226 s->retryHC = 0;
lorded 8:2b0d18ebbba9 227 s->heatcontrolstate = 1;
lorded 8:2b0d18ebbba9 228 }
lorded 8:2b0d18ebbba9 229 }
lorded 8:2b0d18ebbba9 230
lorded 8:2b0d18ebbba9 231 void sendCANCommand(uint16_t id, const char*data, int length)
lorded 8:2b0d18ebbba9 232 {
lorded 8:2b0d18ebbba9 233 //return; // listen mode
lorded 8:2b0d18ebbba9 234 uint8_t TransmitMailbox = 0;
lorded 8:2b0d18ebbba9 235
lorded 8:2b0d18ebbba9 236 CANMessage TxMessage(id, data, 8);
lorded 8:2b0d18ebbba9 237 can2.write(TxMessage);
lorded 8:2b0d18ebbba9 238
lorded 8:2b0d18ebbba9 239 }
lorded 8:2b0d18ebbba9 240
lorded 8:2b0d18ebbba9 241 void sendRepeatMode(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 242 {
lorded 8:2b0d18ebbba9 243 const char wake[8] =
lorded 8:2b0d18ebbba9 244 { 0x0F, 0x11, 0xC9, 0x22, 0x00, 0x20, 0x60, 0x00 };
lorded 8:2b0d18ebbba9 245 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 246 {
lorded 8:2b0d18ebbba9 247 sendCANCommand(0x060F, wake, 8);
lorded 8:2b0d18ebbba9 248 }
lorded 8:2b0d18ebbba9 249 //else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 250 //{
lorded 8:2b0d18ebbba9 251 // sendCANCommand(CTRLCHANNEL2, wake, 8);
lorded 8:2b0d18ebbba9 252 //}
lorded 8:2b0d18ebbba9 253 }
lorded 8:2b0d18ebbba9 254 void sendWakeCommand(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 255 {
lorded 8:2b0d18ebbba9 256 //DebugWrite("Wake command\r\n");
lorded 8:2b0d18ebbba9 257 // "3e is "tester present"
lorded 8:2b0d18ebbba9 258 const char wake[8] =
lorded 8:2b0d18ebbba9 259 { 0x02, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 260 //{0x0F, 0x10, 0x03, 0x00, 0x20, 0x60, 0x00, 0x00};
lorded 8:2b0d18ebbba9 261 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 262 {
lorded 8:2b0d18ebbba9 263 sendCANCommand(CTRLCHANNEL, wake, 8);
lorded 8:2b0d18ebbba9 264 }
lorded 8:2b0d18ebbba9 265 else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 266 {
lorded 8:2b0d18ebbba9 267 sendCANCommand(CTRLCHANNEL2, wake, 8);
lorded 8:2b0d18ebbba9 268 }
lorded 8:2b0d18ebbba9 269
lorded 8:2b0d18ebbba9 270 //const char wake2[8] = {0x0F, 0x10, 0x03, 0x00, 0x20, 0x60, 0x00, 0x00};
lorded 8:2b0d18ebbba9 271 //sendCANCommand(CTRLCHANNEL2, wake2, 8);
lorded 8:2b0d18ebbba9 272 }
lorded 8:2b0d18ebbba9 273 void sendHeatOffCommand(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 274 {
lorded 8:2b0d18ebbba9 275 //DebugWrite("Heat Off command\r\n");
lorded 8:2b0d18ebbba9 276 const char heatoncmd[8] =
lorded 8:2b0d18ebbba9 277 #ifdef EASYSTARTFORMAT
lorded 8:2b0d18ebbba9 278 { 0x00, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00};
lorded 8:2b0d18ebbba9 279 #else
lorded 8:2b0d18ebbba9 280 { 0x05, 0x00, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 281 #endif
lorded 8:2b0d18ebbba9 282 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 283 {
lorded 8:2b0d18ebbba9 284 sendCANCommand(HEATER1ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 285 }
lorded 8:2b0d18ebbba9 286 else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 287 {
lorded 8:2b0d18ebbba9 288 sendCANCommand(HEATER2ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 289 }
lorded 8:2b0d18ebbba9 290 }
lorded 8:2b0d18ebbba9 291 void sendHeatVentConmmand(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 292 {
lorded 8:2b0d18ebbba9 293 DebugWrite("SENDHEATVENT\r\n");
lorded 8:2b0d18ebbba9 294 const char heatoncmd[8] =
lorded 8:2b0d18ebbba9 295 { 0x01, 0x02, 0xFE, 0xFF, 0xF8, 0x02, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 296 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 297 {
lorded 8:2b0d18ebbba9 298 sendCANCommand(HEATER1ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 299 }
lorded 8:2b0d18ebbba9 300 else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 301 {
lorded 8:2b0d18ebbba9 302 sendCANCommand(HEATER2ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 303 }
lorded 8:2b0d18ebbba9 304 }
lorded 8:2b0d18ebbba9 305
lorded 8:2b0d18ebbba9 306 void sendHeatOnCommand(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 307 {
lorded 8:2b0d18ebbba9 308 DebugWrite("SENDHEATON\r\n");
lorded 8:2b0d18ebbba9 309 char heatoncmd[8] =
lorded 8:2b0d18ebbba9 310 #ifdef EASYSTARTFORMAT
lorded 8:2b0d18ebbba9 311 { 0x01, 0x01, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00}; // works?
lorded 8:2b0d18ebbba9 312 #else
lorded 8:2b0d18ebbba9 313 { 0x07, 0x01, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00 }; // works?
lorded 8:2b0d18ebbba9 314 #endif
lorded 8:2b0d18ebbba9 315 //{ 0x07, 0x01, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 316
lorded 8:2b0d18ebbba9 317 uint16_t setpointbytes = 65534;
lorded 8:2b0d18ebbba9 318 char *usetpoint = (char*) &setpointbytes;
lorded 8:2b0d18ebbba9 319 // heater 2 has setpoint in 2/3... heater1 in 3/4??????
lorded 8:2b0d18ebbba9 320 heatoncmd[2] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 321 heatoncmd[3] = usetpoint[1];
lorded 8:2b0d18ebbba9 322 heatoncmd[4] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 323 heatoncmd[5] = usetpoint[1];
lorded 8:2b0d18ebbba9 324 //{ 0x07, 0x01, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00 }; // "mode is "preheating"?
lorded 8:2b0d18ebbba9 325 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 326 {
lorded 8:2b0d18ebbba9 327 //need to reintroduce this...
lorded 8:2b0d18ebbba9 328 if ((s->OBAltitude == WICED_FALSE))
lorded 8:2b0d18ebbba9 329 {
lorded 8:2b0d18ebbba9 330 char mysteryCommand[8] =
lorded 8:2b0d18ebbba9 331 { 0x0F, 0x00, 0xC9, 0x22, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 332 sendCANCommand(0x060D, mysteryCommand, 8);
lorded 8:2b0d18ebbba9 333 }
lorded 8:2b0d18ebbba9 334
lorded 8:2b0d18ebbba9 335 sendCANCommand(HEATER1ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 336 }
lorded 8:2b0d18ebbba9 337 else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 338 {
lorded 8:2b0d18ebbba9 339 sendCANCommand(HEATER2ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 340 }
lorded 8:2b0d18ebbba9 341 }
lorded 8:2b0d18ebbba9 342 void sendAltitudeMode(struct sHeatVars *s)
lorded 8:2b0d18ebbba9 343 {
lorded 8:2b0d18ebbba9 344 if (s->OBAltitude == WICED_TRUE)
lorded 8:2b0d18ebbba9 345 {
lorded 8:2b0d18ebbba9 346 return; // don't send if altitude mode on board.
lorded 8:2b0d18ebbba9 347 }
lorded 8:2b0d18ebbba9 348
lorded 8:2b0d18ebbba9 349 char highAltitudeCmd[8] =
lorded 8:2b0d18ebbba9 350 { 0x4c, 0x1d, 0, 0, 0, 0, 0, 0 };
lorded 8:2b0d18ebbba9 351
lorded 8:2b0d18ebbba9 352 // no idea what this is for?
lorded 8:2b0d18ebbba9 353 //5000 60D 205935687 0008 0D 11 C9 22 00 20 60 00
lorded 8:2b0d18ebbba9 354 //#ifdef EASYSTARTFORMAT
lorded 8:2b0d18ebbba9 355
lorded 8:2b0d18ebbba9 356 //#endif
lorded 8:2b0d18ebbba9 357 // 4C,1D - 7500 for high altitude
lorded 8:2b0d18ebbba9 358 // 10,27 - 10000 for low altitude
lorded 8:2b0d18ebbba9 359
lorded 8:2b0d18ebbba9 360 //uint16_t setpointbytes = 6800;
lorded 8:2b0d18ebbba9 361 uint16_t setpointbytes = 6800;
lorded 8:2b0d18ebbba9 362 if (s->internalAltitude > 0)
lorded 8:2b0d18ebbba9 363 {
lorded 8:2b0d18ebbba9 364 setpointbytes = (s->internalAltitude * 10);
lorded 8:2b0d18ebbba9 365 //sprintf(printbuff, "-- Internal alt\r\n %d\r\n", s->internalAltitude);
lorded 8:2b0d18ebbba9 366 //DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 367 }
lorded 8:2b0d18ebbba9 368 else
lorded 8:2b0d18ebbba9 369 {
lorded 8:2b0d18ebbba9 370 setpointbytes = 6800;
lorded 8:2b0d18ebbba9 371 }
lorded 8:2b0d18ebbba9 372 char *usetpoint = (char*) &setpointbytes;
lorded 8:2b0d18ebbba9 373 highAltitudeCmd[0] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 374 highAltitudeCmd[1] = usetpoint[1];
lorded 8:2b0d18ebbba9 375 char lowAltitudeCmd[8] =
lorded 8:2b0d18ebbba9 376 { 0x10, 0x27, 0, 0, 0, 0, 0, 0 };
lorded 8:2b0d18ebbba9 377
lorded 8:2b0d18ebbba9 378 if (s->internalAltitude > 0)
lorded 8:2b0d18ebbba9 379 {
lorded 8:2b0d18ebbba9 380 setpointbytes = (s->internalAltitude * 10);
lorded 8:2b0d18ebbba9 381 // sprintf(printbuff, "-- Internal alt %d\r\n", s->internalAltitude);
lorded 8:2b0d18ebbba9 382 // DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 383 }
lorded 8:2b0d18ebbba9 384 else
lorded 8:2b0d18ebbba9 385 {
lorded 8:2b0d18ebbba9 386 setpointbytes = 10000;
lorded 8:2b0d18ebbba9 387 }
lorded 8:2b0d18ebbba9 388
lorded 8:2b0d18ebbba9 389 lowAltitudeCmd[0] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 390 lowAltitudeCmd[1] = usetpoint[1];
lorded 8:2b0d18ebbba9 391
lorded 8:2b0d18ebbba9 392 if (s->heaternum == 1)
lorded 8:2b0d18ebbba9 393 {
lorded 8:2b0d18ebbba9 394 if (s->altitudeMode == WICED_TRUE)
lorded 8:2b0d18ebbba9 395 {
lorded 8:2b0d18ebbba9 396
lorded 8:2b0d18ebbba9 397 sendCANCommand(0x0055, highAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 398 // sendCANCommand(0x0056, highAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 399 sendCANCommand(HEATER1ID + 1, highAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 400 }
lorded 8:2b0d18ebbba9 401 else
lorded 8:2b0d18ebbba9 402 {
lorded 8:2b0d18ebbba9 403 sendCANCommand(0x0055, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 404 // sendCANCommand(0x0056, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 405 sendCANCommand(HEATER1ID + 1, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 406 }
lorded 8:2b0d18ebbba9 407
lorded 8:2b0d18ebbba9 408 }
lorded 8:2b0d18ebbba9 409 /*
lorded 8:2b0d18ebbba9 410 else if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 411 {
lorded 8:2b0d18ebbba9 412 if (s->altitudeMode == WICED_TRUE)
lorded 8:2b0d18ebbba9 413 {
lorded 8:2b0d18ebbba9 414 sendCANCommand(HEATER2ID + 1, highAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 415 sendCANCommand(0x0055, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 416 sendCANCommand(0x0056, highAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 417 }
lorded 8:2b0d18ebbba9 418 else
lorded 8:2b0d18ebbba9 419 {
lorded 8:2b0d18ebbba9 420 sendCANCommand(HEATER2ID + 1, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 421 sendCANCommand(0x0055, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 422 sendCANCommand(0x0056, lowAltitudeCmd, 8);
lorded 8:2b0d18ebbba9 423 }
lorded 8:2b0d18ebbba9 424
lorded 8:2b0d18ebbba9 425 }
lorded 8:2b0d18ebbba9 426 */
lorded 8:2b0d18ebbba9 427 }
lorded 8:2b0d18ebbba9 428 void sendHeatOnCommandSetpoint(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 429 {
lorded 8:2b0d18ebbba9 430 DebugWrite("SENDHEATONSETPOINT\r\n");
lorded 8:2b0d18ebbba9 431 sprintf(printbuff, "Setpoint is %d", s->setpoint);
lorded 8:2b0d18ebbba9 432 DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 433 char heatoncmd[8] =
lorded 8:2b0d18ebbba9 434 //{ 0x01, 0x04, 0xFE, 0xFF, 0xFE, 0xFF, 0x00, 0x00 }; // "mode is "setpoint with temp"?
lorded 8:2b0d18ebbba9 435 { 0x07, 0x04, 0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0x00 }; // "mode is "setpoint with temp"?
lorded 8:2b0d18ebbba9 436
lorded 8:2b0d18ebbba9 437 uint16_t setpointbytes = 65534;
lorded 8:2b0d18ebbba9 438 char *usetpoint = (char*) &setpointbytes;
lorded 8:2b0d18ebbba9 439 // heater 2 has setpoint in 2/3... heater1 in 3/4??????
lorded 8:2b0d18ebbba9 440 heatoncmd[2] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 441 heatoncmd[3] = usetpoint[1];
lorded 8:2b0d18ebbba9 442 heatoncmd[4] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 443 heatoncmd[5] = usetpoint[1];
lorded 8:2b0d18ebbba9 444
lorded 8:2b0d18ebbba9 445 setpointbytes = s->setpoint;
lorded 8:2b0d18ebbba9 446 usetpoint = (char*) &setpointbytes;
lorded 8:2b0d18ebbba9 447 // heater 2 has setpoint in 2/3... heater1 in 3/4??????
lorded 8:2b0d18ebbba9 448 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 449 {
lorded 8:2b0d18ebbba9 450 heatoncmd[2] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 451 heatoncmd[3] = usetpoint[1];
lorded 8:2b0d18ebbba9 452 //heatoncmd[4] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 453 //heatoncmd[5] = usetpoint[1];
lorded 8:2b0d18ebbba9 454 sendCANCommand(HEATER2ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 455 }
lorded 8:2b0d18ebbba9 456 else
lorded 8:2b0d18ebbba9 457 {
lorded 8:2b0d18ebbba9 458 heatoncmd[4] = usetpoint[0]; // LSB in slot 2
lorded 8:2b0d18ebbba9 459 heatoncmd[5] = usetpoint[1];
lorded 8:2b0d18ebbba9 460 sendCANCommand(HEATER1ID, heatoncmd, 8);
lorded 8:2b0d18ebbba9 461 }
lorded 8:2b0d18ebbba9 462
lorded 8:2b0d18ebbba9 463 }
lorded 8:2b0d18ebbba9 464 void doOtherResetSequence(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 465 {
lorded 8:2b0d18ebbba9 466 //DebugWrite("**************\r\n");
lorded 8:2b0d18ebbba9 467 CANMessage msg;
lorded 8:2b0d18ebbba9 468
lorded 8:2b0d18ebbba9 469 DebugWrite("Send wake\r\n");
lorded 8:2b0d18ebbba9 470 sendWakeCommand(s);
lorded 8:2b0d18ebbba9 471
lorded 8:2b0d18ebbba9 472 int id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 473 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 474 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 475 {
lorded 8:2b0d18ebbba9 476 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 477 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 478 }
lorded 8:2b0d18ebbba9 479 char switchToSession[8] =
lorded 8:2b0d18ebbba9 480 { 0x10, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 481 sendCANCommand(id, switchToSession, 8);
lorded 8:2b0d18ebbba9 482 DebugWrite("Switch To Session\r\n");
lorded 8:2b0d18ebbba9 483 if (doFindExpectedResponse(&msg, resp, NULL, 0) > 0)
lorded 8:2b0d18ebbba9 484 {
lorded 8:2b0d18ebbba9 485 DebugWrite("Got a response!\r\n");
lorded 8:2b0d18ebbba9 486 printCAN(&msg);
lorded 8:2b0d18ebbba9 487 //return;
lorded 8:2b0d18ebbba9 488 }
lorded 8:2b0d18ebbba9 489 else
lorded 8:2b0d18ebbba9 490 {
lorded 8:2b0d18ebbba9 491
lorded 8:2b0d18ebbba9 492 }
lorded 8:2b0d18ebbba9 493 // request seed
lorded 8:2b0d18ebbba9 494
lorded 8:2b0d18ebbba9 495 //DebugWrite("**************\r\n");
lorded 8:2b0d18ebbba9 496 }
lorded 8:2b0d18ebbba9 497 void doPrimeSequence(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 498 {
lorded 8:2b0d18ebbba9 499 int extrabyte = 0;
lorded 8:2b0d18ebbba9 500 int count;
lorded 8:2b0d18ebbba9 501 sendWakeCommand(s);
lorded 8:2b0d18ebbba9 502
lorded 8:2b0d18ebbba9 503 CANMessage msg;
lorded 8:2b0d18ebbba9 504 int id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 505 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 506 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 507 {
lorded 8:2b0d18ebbba9 508 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 509 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 510 }
lorded 8:2b0d18ebbba9 511
lorded 8:2b0d18ebbba9 512 char pump[8] =
lorded 8:2b0d18ebbba9 513 { 0x07, 0x31, 0x01, 0xF0, 0x00, 0x64, 0x00, 0x05 };
lorded 8:2b0d18ebbba9 514 char pump2[8] =
lorded 8:2b0d18ebbba9 515 { 0x04, 0x31, 0x03, 0xF0, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 516
lorded 8:2b0d18ebbba9 517 // read data F1F2 identifiers...
lorded 8:2b0d18ebbba9 518 char reset1[8] =
lorded 8:2b0d18ebbba9 519 { 0x03, 0x22, 0xF1, 0xF2, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 520 char res1[5] =
lorded 8:2b0d18ebbba9 521 { 0x10, 0x09, 0x62, 0xF1, 0xF2 };
lorded 8:2b0d18ebbba9 522
lorded 8:2b0d18ebbba9 523 // not sure
lorded 8:2b0d18ebbba9 524 char reset2[8] =
lorded 8:2b0d18ebbba9 525 { 0x30, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 526 char res2[5] =
lorded 8:2b0d18ebbba9 527 { 0x21, 0x00, 0x00, 0x60, 0xF2 };
lorded 8:2b0d18ebbba9 528
lorded 8:2b0d18ebbba9 529 // security access
lorded 8:2b0d18ebbba9 530 char reset3[8] =
lorded 8:2b0d18ebbba9 531 { 0x02, 0x27, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 532 // security response
lorded 8:2b0d18ebbba9 533 char res3[4] =
lorded 8:2b0d18ebbba9 534 { 0x06, 0x67, 0x63, 0x00 };
lorded 8:2b0d18ebbba9 535
lorded 8:2b0d18ebbba9 536 char reset3a[8] =
lorded 8:2b0d18ebbba9 537 { 0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 538 char res3a[3] =
lorded 8:2b0d18ebbba9 539 { 0x06, 0x50, 0x01 };
lorded 8:2b0d18ebbba9 540
lorded 8:2b0d18ebbba9 541 // change to session '60'
lorded 8:2b0d18ebbba9 542 char reset3b[8] =
lorded 8:2b0d18ebbba9 543 { 0x02, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 544 char res3b[3] =
lorded 8:2b0d18ebbba9 545 { 0x06, 0x50, 0x60 };
lorded 8:2b0d18ebbba9 546
lorded 8:2b0d18ebbba9 547 // scurity access
lorded 8:2b0d18ebbba9 548 char reset4a[8] =
lorded 8:2b0d18ebbba9 549 { 0x06, 0x27, 0x64, 0x00, 0x00, 0x10, 0x60, 0x00 };
lorded 8:2b0d18ebbba9 550 char res4a[4] =
lorded 8:2b0d18ebbba9 551 { 0x02, 0x67, 0x64, 0x00 };
lorded 8:2b0d18ebbba9 552 count = 0;
lorded 8:2b0d18ebbba9 553 DebugWrite("***RESET1\r\n");
lorded 8:2b0d18ebbba9 554 sendCANCommand(id, reset1, 8);
lorded 8:2b0d18ebbba9 555 while (count++ < 20)
lorded 8:2b0d18ebbba9 556 {
lorded 8:2b0d18ebbba9 557 if (doFindExpectedResponse(&msg, resp, res1, 3) > 0)
lorded 8:2b0d18ebbba9 558 {
lorded 8:2b0d18ebbba9 559 printf("1!\r\n");
lorded 8:2b0d18ebbba9 560 break;
lorded 8:2b0d18ebbba9 561 }
lorded 8:2b0d18ebbba9 562 else
lorded 8:2b0d18ebbba9 563 {
lorded 8:2b0d18ebbba9 564 if (msg.id == 0x073)
lorded 8:2b0d18ebbba9 565 {
lorded 8:2b0d18ebbba9 566 DebugWrite("Got-");
lorded 8:2b0d18ebbba9 567 printCAN(&msg);
lorded 8:2b0d18ebbba9 568 }
lorded 8:2b0d18ebbba9 569 }
lorded 8:2b0d18ebbba9 570 }
lorded 8:2b0d18ebbba9 571 if (count >= 20)
lorded 8:2b0d18ebbba9 572 {
lorded 8:2b0d18ebbba9 573 DebugWrite("FAILED(1)\r\n");
lorded 8:2b0d18ebbba9 574 return;
lorded 8:2b0d18ebbba9 575 }
lorded 8:2b0d18ebbba9 576 count = 0;
lorded 8:2b0d18ebbba9 577 sendCANCommand(id, reset2, 8);
lorded 8:2b0d18ebbba9 578 DebugWrite("***RESET2\r\n");
lorded 8:2b0d18ebbba9 579 while (count++ < 20)
lorded 8:2b0d18ebbba9 580 {
lorded 8:2b0d18ebbba9 581 if (doFindExpectedResponse(&msg, resp, res2, 3) > 0)
lorded 8:2b0d18ebbba9 582 {
lorded 8:2b0d18ebbba9 583 DebugWrite("2!\r\n");
lorded 8:2b0d18ebbba9 584 break;
lorded 8:2b0d18ebbba9 585 }
lorded 8:2b0d18ebbba9 586 else
lorded 8:2b0d18ebbba9 587 {
lorded 8:2b0d18ebbba9 588
lorded 8:2b0d18ebbba9 589 }
lorded 8:2b0d18ebbba9 590 }
lorded 8:2b0d18ebbba9 591 if (count >= 20)
lorded 8:2b0d18ebbba9 592 {
lorded 8:2b0d18ebbba9 593 DebugWrite("FAILED(2)\r\n");
lorded 8:2b0d18ebbba9 594 return;
lorded 8:2b0d18ebbba9 595 }
lorded 8:2b0d18ebbba9 596
lorded 8:2b0d18ebbba9 597 // check msg byte 4, if 01, additional commands
lorded 8:2b0d18ebbba9 598 extrabyte = msg.data[3];
lorded 8:2b0d18ebbba9 599 if (extrabyte > 0)
lorded 8:2b0d18ebbba9 600 {
lorded 8:2b0d18ebbba9 601 count = 0;
lorded 8:2b0d18ebbba9 602 sendCANCommand(id, reset3a, 8);
lorded 8:2b0d18ebbba9 603 while (count++ < 20)
lorded 8:2b0d18ebbba9 604 {
lorded 8:2b0d18ebbba9 605 if (doFindExpectedResponse(&msg, resp, res3a, 3) > 0)
lorded 8:2b0d18ebbba9 606 {
lorded 8:2b0d18ebbba9 607 DebugWrite("3a!\r\n");
lorded 8:2b0d18ebbba9 608 break;
lorded 8:2b0d18ebbba9 609 }
lorded 8:2b0d18ebbba9 610 else
lorded 8:2b0d18ebbba9 611 {
lorded 8:2b0d18ebbba9 612
lorded 8:2b0d18ebbba9 613 }
lorded 8:2b0d18ebbba9 614 }
lorded 8:2b0d18ebbba9 615 if (count >= 20)
lorded 8:2b0d18ebbba9 616 {
lorded 8:2b0d18ebbba9 617 DebugWrite("FAILED(3)\r\n");
lorded 8:2b0d18ebbba9 618 return;
lorded 8:2b0d18ebbba9 619 }
lorded 8:2b0d18ebbba9 620 count = 0;
lorded 8:2b0d18ebbba9 621 sendCANCommand(id, reset3b, 8);
lorded 8:2b0d18ebbba9 622 while (count++ < 20)
lorded 8:2b0d18ebbba9 623 {
lorded 8:2b0d18ebbba9 624 if (doFindExpectedResponse(&msg, resp, res3b, 3) > 0)
lorded 8:2b0d18ebbba9 625 {
lorded 8:2b0d18ebbba9 626 DebugWrite("3b!\r\n");
lorded 8:2b0d18ebbba9 627 break;
lorded 8:2b0d18ebbba9 628 }
lorded 8:2b0d18ebbba9 629 else
lorded 8:2b0d18ebbba9 630 {
lorded 8:2b0d18ebbba9 631
lorded 8:2b0d18ebbba9 632 }
lorded 8:2b0d18ebbba9 633 }
lorded 8:2b0d18ebbba9 634 if (count >= 20)
lorded 8:2b0d18ebbba9 635 {
lorded 8:2b0d18ebbba9 636 DebugWrite("FAILED(4)\r\n");
lorded 8:2b0d18ebbba9 637 return;
lorded 8:2b0d18ebbba9 638 }
lorded 8:2b0d18ebbba9 639 }
lorded 8:2b0d18ebbba9 640
lorded 8:2b0d18ebbba9 641 count = 0;
lorded 8:2b0d18ebbba9 642 sendCANCommand(id, reset3, 8);
lorded 8:2b0d18ebbba9 643 while (count++ < 20)
lorded 8:2b0d18ebbba9 644 {
lorded 8:2b0d18ebbba9 645 if (doFindExpectedResponse(&msg, resp, res3, 3) > 0)
lorded 8:2b0d18ebbba9 646 {
lorded 8:2b0d18ebbba9 647 DebugWrite("3!\r\n");
lorded 8:2b0d18ebbba9 648 break;
lorded 8:2b0d18ebbba9 649 }
lorded 8:2b0d18ebbba9 650 else
lorded 8:2b0d18ebbba9 651 {
lorded 8:2b0d18ebbba9 652
lorded 8:2b0d18ebbba9 653 }
lorded 8:2b0d18ebbba9 654 }
lorded 8:2b0d18ebbba9 655 if (count >= 20)
lorded 8:2b0d18ebbba9 656 {
lorded 8:2b0d18ebbba9 657 DebugWrite("FAILED(5)\r\n");
lorded 8:2b0d18ebbba9 658 return;
lorded 8:2b0d18ebbba9 659 }
lorded 8:2b0d18ebbba9 660 if (extrabyte > 0)
lorded 8:2b0d18ebbba9 661 {
lorded 8:2b0d18ebbba9 662 count = 0;
lorded 8:2b0d18ebbba9 663 sendCANCommand(id, reset4a, 8);
lorded 8:2b0d18ebbba9 664 while (count++ < 20)
lorded 8:2b0d18ebbba9 665 {
lorded 8:2b0d18ebbba9 666 if (doFindExpectedResponse(&msg, resp, res4a, 3) > 0)
lorded 8:2b0d18ebbba9 667 {
lorded 8:2b0d18ebbba9 668 DebugWrite("4a!\r\n");
lorded 8:2b0d18ebbba9 669 break;
lorded 8:2b0d18ebbba9 670 }
lorded 8:2b0d18ebbba9 671 else
lorded 8:2b0d18ebbba9 672 {
lorded 8:2b0d18ebbba9 673
lorded 8:2b0d18ebbba9 674 }
lorded 8:2b0d18ebbba9 675 }
lorded 8:2b0d18ebbba9 676 if (count >= 20)
lorded 8:2b0d18ebbba9 677 {
lorded 8:2b0d18ebbba9 678 DebugWrite("FAILED(6)\r\n");
lorded 8:2b0d18ebbba9 679 return;
lorded 8:2b0d18ebbba9 680 }
lorded 8:2b0d18ebbba9 681 }
lorded 8:2b0d18ebbba9 682 count = 0;
lorded 8:2b0d18ebbba9 683
lorded 8:2b0d18ebbba9 684 DebugWrite("SENDING PUMP COMMAND\r\n");
lorded 8:2b0d18ebbba9 685 sendCANCommand(id, pump, 8);
lorded 8:2b0d18ebbba9 686 DebugWrite("SEQUENCE ON COMMAND\r\n");
lorded 8:2b0d18ebbba9 687 sendCANCommand(id, pump2, 8);
lorded 8:2b0d18ebbba9 688 s->primeFuelPumpCount = 5;
lorded 8:2b0d18ebbba9 689 }
lorded 8:2b0d18ebbba9 690
lorded 8:2b0d18ebbba9 691 void doResetSequence(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 692 {
lorded 8:2b0d18ebbba9 693 int extrabyte = 0;
lorded 8:2b0d18ebbba9 694 int count;
lorded 8:2b0d18ebbba9 695 sendWakeCommand(s);
lorded 8:2b0d18ebbba9 696
lorded 8:2b0d18ebbba9 697 CANMessage msg;
lorded 8:2b0d18ebbba9 698 int id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 699 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 700 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 701 {
lorded 8:2b0d18ebbba9 702 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 703 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 704 }
lorded 8:2b0d18ebbba9 705 // read data F1F2 identifiers...
lorded 8:2b0d18ebbba9 706 char reset1[8] =
lorded 8:2b0d18ebbba9 707 { 0x03, 0x22, 0xF1, 0xF2, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 708 char res1[5] =
lorded 8:2b0d18ebbba9 709 { 0x10, 0x09, 0x62, 0xF1, 0xF2 };
lorded 8:2b0d18ebbba9 710
lorded 8:2b0d18ebbba9 711 // not sure
lorded 8:2b0d18ebbba9 712 char reset2[8] =
lorded 8:2b0d18ebbba9 713 { 0x30, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 714 char res2[5] =
lorded 8:2b0d18ebbba9 715 { 0x21, 0x00, 0x00, 0x60, 0xF2 };
lorded 8:2b0d18ebbba9 716
lorded 8:2b0d18ebbba9 717 // security access
lorded 8:2b0d18ebbba9 718 char reset3[8] =
lorded 8:2b0d18ebbba9 719 { 0x02, 0x27, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 720 // security response
lorded 8:2b0d18ebbba9 721 char res3[4] =
lorded 8:2b0d18ebbba9 722 { 0x06, 0x67, 0x63, 0x00 };
lorded 8:2b0d18ebbba9 723
lorded 8:2b0d18ebbba9 724 // clear diagnostics
lorded 8:2b0d18ebbba9 725 char reset4[8] =
lorded 8:2b0d18ebbba9 726 { 0x04, 0x14, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 727 // response
lorded 8:2b0d18ebbba9 728 char res4[4] =
lorded 8:2b0d18ebbba9 729 { 0x01, 0x54, 0x63, 0x00 };
lorded 8:2b0d18ebbba9 730
lorded 8:2b0d18ebbba9 731 // routine control
lorded 8:2b0d18ebbba9 732 char reset5[8] =
lorded 8:2b0d18ebbba9 733 { 0x04, 0x31, 0x01, 0xF0, 0x05, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 734 char res5[5] =
lorded 8:2b0d18ebbba9 735 { 0x04, 0x71, 0x01, 0xF0, 0x05 };
lorded 8:2b0d18ebbba9 736
lorded 8:2b0d18ebbba9 737 char reset3a[8] =
lorded 8:2b0d18ebbba9 738 { 0x02, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 739 char res3a[3] =
lorded 8:2b0d18ebbba9 740 { 0x06, 0x50, 0x01 };
lorded 8:2b0d18ebbba9 741
lorded 8:2b0d18ebbba9 742 // change to session '60'
lorded 8:2b0d18ebbba9 743 char reset3b[8] =
lorded 8:2b0d18ebbba9 744 { 0x02, 0x10, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 745 char res3b[3] =
lorded 8:2b0d18ebbba9 746 { 0x06, 0x50, 0x60 };
lorded 8:2b0d18ebbba9 747
lorded 8:2b0d18ebbba9 748 // scurity access
lorded 8:2b0d18ebbba9 749 char reset4a[8] =
lorded 8:2b0d18ebbba9 750 { 0x06, 0x27, 0x64, 0x00, 0x00, 0x10, 0x60, 0x00 };
lorded 8:2b0d18ebbba9 751 char res4a[4] =
lorded 8:2b0d18ebbba9 752 { 0x02, 0x67, 0x64, 0x00 };
lorded 8:2b0d18ebbba9 753 count = 0;
lorded 8:2b0d18ebbba9 754 DebugWrite("***RESET1\r\n");
lorded 8:2b0d18ebbba9 755 sendCANCommand(id, reset1, 8);
lorded 8:2b0d18ebbba9 756 while (count++ < 20)
lorded 8:2b0d18ebbba9 757 {
lorded 8:2b0d18ebbba9 758 if (doFindExpectedResponse(&msg, resp, res1, 3) > 0)
lorded 8:2b0d18ebbba9 759 {
lorded 8:2b0d18ebbba9 760 printf("1!\r\n");
lorded 8:2b0d18ebbba9 761 break;
lorded 8:2b0d18ebbba9 762 }
lorded 8:2b0d18ebbba9 763 else
lorded 8:2b0d18ebbba9 764 {
lorded 8:2b0d18ebbba9 765 if (msg.id == 0x073)
lorded 8:2b0d18ebbba9 766 {
lorded 8:2b0d18ebbba9 767 DebugWrite("Got-");
lorded 8:2b0d18ebbba9 768 printCAN(&msg);
lorded 8:2b0d18ebbba9 769 }
lorded 8:2b0d18ebbba9 770 }
lorded 8:2b0d18ebbba9 771 }
lorded 8:2b0d18ebbba9 772 if (count >= 20)
lorded 8:2b0d18ebbba9 773 {
lorded 8:2b0d18ebbba9 774 DebugWrite("FAILED(1)\r\n");
lorded 8:2b0d18ebbba9 775 return;
lorded 8:2b0d18ebbba9 776 }
lorded 8:2b0d18ebbba9 777 count = 0;
lorded 8:2b0d18ebbba9 778 sendCANCommand(id, reset2, 8);
lorded 8:2b0d18ebbba9 779 DebugWrite("***RESET2\r\n");
lorded 8:2b0d18ebbba9 780 while (count++ < 20)
lorded 8:2b0d18ebbba9 781 {
lorded 8:2b0d18ebbba9 782 if (doFindExpectedResponse(&msg, resp, res2, 3) > 0)
lorded 8:2b0d18ebbba9 783 {
lorded 8:2b0d18ebbba9 784 DebugWrite("2!\r\n");
lorded 8:2b0d18ebbba9 785 break;
lorded 8:2b0d18ebbba9 786 }
lorded 8:2b0d18ebbba9 787 else
lorded 8:2b0d18ebbba9 788 {
lorded 8:2b0d18ebbba9 789
lorded 8:2b0d18ebbba9 790 }
lorded 8:2b0d18ebbba9 791 }
lorded 8:2b0d18ebbba9 792 if (count >= 20)
lorded 8:2b0d18ebbba9 793 {
lorded 8:2b0d18ebbba9 794 DebugWrite("FAILED(2)\r\n");
lorded 8:2b0d18ebbba9 795 return;
lorded 8:2b0d18ebbba9 796 }
lorded 8:2b0d18ebbba9 797 // check msg byte 4, if 01, additional commands
lorded 8:2b0d18ebbba9 798 extrabyte = msg.data[3];
lorded 8:2b0d18ebbba9 799 if (extrabyte > 0)
lorded 8:2b0d18ebbba9 800 {
lorded 8:2b0d18ebbba9 801 count = 0;
lorded 8:2b0d18ebbba9 802 sendCANCommand(id, reset3a, 8);
lorded 8:2b0d18ebbba9 803 while (count++ < 20)
lorded 8:2b0d18ebbba9 804 {
lorded 8:2b0d18ebbba9 805 if (doFindExpectedResponse(&msg, resp, res3a, 3) > 0)
lorded 8:2b0d18ebbba9 806 {
lorded 8:2b0d18ebbba9 807 DebugWrite("3a!\r\n");
lorded 8:2b0d18ebbba9 808 break;
lorded 8:2b0d18ebbba9 809 }
lorded 8:2b0d18ebbba9 810 else
lorded 8:2b0d18ebbba9 811 {
lorded 8:2b0d18ebbba9 812
lorded 8:2b0d18ebbba9 813 }
lorded 8:2b0d18ebbba9 814 }
lorded 8:2b0d18ebbba9 815 if (count >= 20)
lorded 8:2b0d18ebbba9 816 {
lorded 8:2b0d18ebbba9 817 DebugWrite("FAILED(3)\r\n");
lorded 8:2b0d18ebbba9 818 return;
lorded 8:2b0d18ebbba9 819 }
lorded 8:2b0d18ebbba9 820 count = 0;
lorded 8:2b0d18ebbba9 821 sendCANCommand(id, reset3b, 8);
lorded 8:2b0d18ebbba9 822 while (count++ < 20)
lorded 8:2b0d18ebbba9 823 {
lorded 8:2b0d18ebbba9 824 if (doFindExpectedResponse(&msg, resp, res3b, 3) > 0)
lorded 8:2b0d18ebbba9 825 {
lorded 8:2b0d18ebbba9 826 DebugWrite("3b!\r\n");
lorded 8:2b0d18ebbba9 827 break;
lorded 8:2b0d18ebbba9 828 }
lorded 8:2b0d18ebbba9 829 else
lorded 8:2b0d18ebbba9 830 {
lorded 8:2b0d18ebbba9 831
lorded 8:2b0d18ebbba9 832 }
lorded 8:2b0d18ebbba9 833 }
lorded 8:2b0d18ebbba9 834 if (count >= 20)
lorded 8:2b0d18ebbba9 835 {
lorded 8:2b0d18ebbba9 836 DebugWrite("FAILED(4)\r\n");
lorded 8:2b0d18ebbba9 837 return;
lorded 8:2b0d18ebbba9 838 }
lorded 8:2b0d18ebbba9 839 }
lorded 8:2b0d18ebbba9 840 count = 0;
lorded 8:2b0d18ebbba9 841 sendCANCommand(id, reset3, 8);
lorded 8:2b0d18ebbba9 842 while (count++ < 20)
lorded 8:2b0d18ebbba9 843 {
lorded 8:2b0d18ebbba9 844 if (doFindExpectedResponse(&msg, resp, res3, 3) > 0)
lorded 8:2b0d18ebbba9 845 {
lorded 8:2b0d18ebbba9 846 DebugWrite("3!\r\n");
lorded 8:2b0d18ebbba9 847 break;
lorded 8:2b0d18ebbba9 848 }
lorded 8:2b0d18ebbba9 849 else
lorded 8:2b0d18ebbba9 850 {
lorded 8:2b0d18ebbba9 851
lorded 8:2b0d18ebbba9 852 }
lorded 8:2b0d18ebbba9 853 }
lorded 8:2b0d18ebbba9 854 if (count >= 20)
lorded 8:2b0d18ebbba9 855 {
lorded 8:2b0d18ebbba9 856 DebugWrite("FAILED(5)\r\n");
lorded 8:2b0d18ebbba9 857 return;
lorded 8:2b0d18ebbba9 858 }
lorded 8:2b0d18ebbba9 859 if (extrabyte > 0)
lorded 8:2b0d18ebbba9 860 {
lorded 8:2b0d18ebbba9 861 count = 0;
lorded 8:2b0d18ebbba9 862 sendCANCommand(id, reset4a, 8);
lorded 8:2b0d18ebbba9 863 while (count++ < 20)
lorded 8:2b0d18ebbba9 864 {
lorded 8:2b0d18ebbba9 865 if (doFindExpectedResponse(&msg, resp, res4a, 3) > 0)
lorded 8:2b0d18ebbba9 866 {
lorded 8:2b0d18ebbba9 867 DebugWrite("4a!\r\n");
lorded 8:2b0d18ebbba9 868 break;
lorded 8:2b0d18ebbba9 869 }
lorded 8:2b0d18ebbba9 870 else
lorded 8:2b0d18ebbba9 871 {
lorded 8:2b0d18ebbba9 872
lorded 8:2b0d18ebbba9 873 }
lorded 8:2b0d18ebbba9 874 }
lorded 8:2b0d18ebbba9 875 if (count >= 20)
lorded 8:2b0d18ebbba9 876 {
lorded 8:2b0d18ebbba9 877 DebugWrite("FAILED(6)\r\n");
lorded 8:2b0d18ebbba9 878 return;
lorded 8:2b0d18ebbba9 879 }
lorded 8:2b0d18ebbba9 880 }
lorded 8:2b0d18ebbba9 881 count = 0;
lorded 8:2b0d18ebbba9 882 sendCANCommand(id, reset4, 8);
lorded 8:2b0d18ebbba9 883 while (count++ < 20)
lorded 8:2b0d18ebbba9 884 {
lorded 8:2b0d18ebbba9 885 if (doFindExpectedResponse(&msg, resp, res4, 3) > 0)
lorded 8:2b0d18ebbba9 886 {
lorded 8:2b0d18ebbba9 887 printf("4!\r\n");
lorded 8:2b0d18ebbba9 888 break;
lorded 8:2b0d18ebbba9 889 }
lorded 8:2b0d18ebbba9 890 else
lorded 8:2b0d18ebbba9 891 {
lorded 8:2b0d18ebbba9 892
lorded 8:2b0d18ebbba9 893 }
lorded 8:2b0d18ebbba9 894 }
lorded 8:2b0d18ebbba9 895 if (count >= 20)
lorded 8:2b0d18ebbba9 896 {
lorded 8:2b0d18ebbba9 897 printf("FAILED(7)\r\n");
lorded 8:2b0d18ebbba9 898 return;
lorded 8:2b0d18ebbba9 899 }
lorded 8:2b0d18ebbba9 900 count = 0;
lorded 8:2b0d18ebbba9 901 sendCANCommand(id, reset5, 8);
lorded 8:2b0d18ebbba9 902 while (count++ < 20)
lorded 8:2b0d18ebbba9 903 {
lorded 8:2b0d18ebbba9 904 if (doFindExpectedResponse(&msg, resp, res5, 3) > 0)
lorded 8:2b0d18ebbba9 905 {
lorded 8:2b0d18ebbba9 906 printf("5!\r\n");
lorded 8:2b0d18ebbba9 907 break;
lorded 8:2b0d18ebbba9 908 }
lorded 8:2b0d18ebbba9 909 else
lorded 8:2b0d18ebbba9 910 {
lorded 8:2b0d18ebbba9 911
lorded 8:2b0d18ebbba9 912 }
lorded 8:2b0d18ebbba9 913 }
lorded 8:2b0d18ebbba9 914 if (count >= 20)
lorded 8:2b0d18ebbba9 915 {
lorded 8:2b0d18ebbba9 916 printf("FAILED(8)\r\n");
lorded 8:2b0d18ebbba9 917 return;
lorded 8:2b0d18ebbba9 918 }
lorded 8:2b0d18ebbba9 919 printf("SUCCESS\r\n");
lorded 8:2b0d18ebbba9 920 }
lorded 8:2b0d18ebbba9 921 int doFindExpectedResponse(CANMessage* msg, const uint16_t expectedID, const char* expectedResponse, int charsInMatch)
lorded 8:2b0d18ebbba9 922 {
lorded 8:2b0d18ebbba9 923 char buff[256];
lorded 8:2b0d18ebbba9 924 //printf("fe-a\r\n");
lorded 8:2b0d18ebbba9 925 int timeout = 0;
lorded 8:2b0d18ebbba9 926 wiced_bool_t couldRead = WICED_FALSE;
lorded 8:2b0d18ebbba9 927 int incoming = 0;
lorded 8:2b0d18ebbba9 928
lorded 8:2b0d18ebbba9 929 while ((incoming == 0) && (timeout++ < 10))
lorded 8:2b0d18ebbba9 930 {
lorded 8:2b0d18ebbba9 931
lorded 8:2b0d18ebbba9 932 incoming = can2.read(*msg);
lorded 8:2b0d18ebbba9 933 //printf("fe-b %d\r\n", incoming);
lorded 8:2b0d18ebbba9 934 if (incoming > 0)
lorded 8:2b0d18ebbba9 935 {
lorded 8:2b0d18ebbba9 936 couldRead = WICED_TRUE;
lorded 8:2b0d18ebbba9 937 }
lorded 8:2b0d18ebbba9 938 if (!couldRead)
lorded 8:2b0d18ebbba9 939 {
lorded 8:2b0d18ebbba9 940 wait(0.01);
lorded 8:2b0d18ebbba9 941 }
lorded 8:2b0d18ebbba9 942 }
lorded 8:2b0d18ebbba9 943 //printf("fe-c\r\n");
lorded 8:2b0d18ebbba9 944 if (incoming > 0)
lorded 8:2b0d18ebbba9 945 {
lorded 8:2b0d18ebbba9 946
lorded 8:2b0d18ebbba9 947 //CAN_FIFORelease(CAN1, CAN_FIFO0);
lorded 8:2b0d18ebbba9 948 if (msg->id != expectedID)
lorded 8:2b0d18ebbba9 949 {
lorded 8:2b0d18ebbba9 950 //sprintf(buff, "No match: %04X\r\n", (unsigned int) msg->StdId);
lorded 8:2b0d18ebbba9 951 //DebugWrite(buff);
lorded 8:2b0d18ebbba9 952 return 0; // not a match
lorded 8:2b0d18ebbba9 953 }
lorded 8:2b0d18ebbba9 954 // ignore byte 1
lorded 8:2b0d18ebbba9 955 for (int i = 1; i < charsInMatch; i++)
lorded 8:2b0d18ebbba9 956 {
lorded 8:2b0d18ebbba9 957 if (!(msg->data[i] == expectedResponse[i]))
lorded 8:2b0d18ebbba9 958 {
lorded 8:2b0d18ebbba9 959 // no match
lorded 8:2b0d18ebbba9 960 return 0;
lorded 8:2b0d18ebbba9 961 }
lorded 8:2b0d18ebbba9 962 return 1; // match
lorded 8:2b0d18ebbba9 963 }
lorded 8:2b0d18ebbba9 964 // no chars in match, always a match?
lorded 8:2b0d18ebbba9 965 return 1;
lorded 8:2b0d18ebbba9 966 }
lorded 8:2b0d18ebbba9 967 else
lorded 8:2b0d18ebbba9 968 {
lorded 8:2b0d18ebbba9 969 return -1; // no read
lorded 8:2b0d18ebbba9 970 }
lorded 8:2b0d18ebbba9 971 }
lorded 8:2b0d18ebbba9 972 void printCAN(CANMessage *canMsg)
lorded 8:2b0d18ebbba9 973 {
lorded 8:2b0d18ebbba9 974 return;
lorded 8:2b0d18ebbba9 975 char buff[256];
lorded 8:2b0d18ebbba9 976 sprintf(buff, "ID,%04X:", (unsigned int) canMsg->id);
lorded 8:2b0d18ebbba9 977
lorded 8:2b0d18ebbba9 978 DebugWrite(buff);
lorded 8:2b0d18ebbba9 979 for (int i = 0; i < canMsg->len; i++)
lorded 8:2b0d18ebbba9 980 {
lorded 8:2b0d18ebbba9 981 sprintf(buff, "%02X ", canMsg->data[i]);
lorded 8:2b0d18ebbba9 982 DebugWrite(buff);
lorded 8:2b0d18ebbba9 983 }
lorded 8:2b0d18ebbba9 984 DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 985 }
lorded 8:2b0d18ebbba9 986
lorded 8:2b0d18ebbba9 987 void printCANTx(CANMessage *canMsg)
lorded 8:2b0d18ebbba9 988 {
lorded 8:2b0d18ebbba9 989 return;
lorded 8:2b0d18ebbba9 990 char buff[256];
lorded 8:2b0d18ebbba9 991 sprintf(buff, "->ID,%04X:", (unsigned int) canMsg->id);
lorded 8:2b0d18ebbba9 992
lorded 8:2b0d18ebbba9 993 DebugWrite(buff);
lorded 8:2b0d18ebbba9 994 for (int i = 0; i < canMsg->len; i++)
lorded 8:2b0d18ebbba9 995 {
lorded 8:2b0d18ebbba9 996 sprintf(buff, "%02X ", canMsg->data[i]);
lorded 8:2b0d18ebbba9 997 DebugWrite(buff);
lorded 8:2b0d18ebbba9 998 }
lorded 8:2b0d18ebbba9 999 DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1000 }
lorded 8:2b0d18ebbba9 1001 void sendGetRuntime(struct sHeatVars *s, char *buff)
lorded 8:2b0d18ebbba9 1002 {
lorded 8:2b0d18ebbba9 1003 int count = 0;
lorded 8:2b0d18ebbba9 1004 CANMessage rxMsg;
lorded 8:2b0d18ebbba9 1005 int id;
lorded 8:2b0d18ebbba9 1006 int resp;
lorded 8:2b0d18ebbba9 1007 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1008 resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1009 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1010 {
lorded 8:2b0d18ebbba9 1011 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1012 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1013 }
lorded 8:2b0d18ebbba9 1014
lorded 8:2b0d18ebbba9 1015 const char msgbytes[8] =
lorded 8:2b0d18ebbba9 1016 { 0x03, 0x22, 0xFD, 0x17, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1017 const char continuePacket[8] =
lorded 8:2b0d18ebbba9 1018 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1019
lorded 8:2b0d18ebbba9 1020 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1021 //The control unit reads out the operating hours counter using the UDS service 22 ID: FD17
lorded 8:2b0d18ebbba9 1022 while (count++ < 10)
lorded 8:2b0d18ebbba9 1023 {
lorded 8:2b0d18ebbba9 1024 // just expect the ID (0
lorded 8:2b0d18ebbba9 1025 if (doFindExpectedResponse(&rxMsg, resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1026 {
lorded 8:2b0d18ebbba9 1027 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1028 // response in the format 59
lorded 8:2b0d18ebbba9 1029 // the first byte dictates the length
lorded 8:2b0d18ebbba9 1030
lorded 8:2b0d18ebbba9 1031 //073C:03 59 02 7B 05 48 C3 01
lorded 8:2b0d18ebbba9 1032
lorded 8:2b0d18ebbba9 1033 if (rxMsg.data[0] < 0x10)
lorded 8:2b0d18ebbba9 1034 {
lorded 8:2b0d18ebbba9 1035 DebugWrite("Single Message. Shouldn't happen\r\n");
lorded 8:2b0d18ebbba9 1036 }
lorded 8:2b0d18ebbba9 1037 else if (rxMsg.data[0] < 0x20)
lorded 8:2b0d18ebbba9 1038 {
lorded 8:2b0d18ebbba9 1039
lorded 8:2b0d18ebbba9 1040 int totalLength = rxMsg.data[1];
lorded 8:2b0d18ebbba9 1041 unsigned int totalExpectedPackets = ((totalLength - 7) / 7) + 1;
lorded 8:2b0d18ebbba9 1042 unsigned char dataBytes[6 + totalExpectedPackets * 7];
lorded 8:2b0d18ebbba9 1043 memset(dataBytes, 0, 6 + totalExpectedPackets * 7);
lorded 8:2b0d18ebbba9 1044
lorded 8:2b0d18ebbba9 1045 // first packet contains 6 bytes of data, additional contain 7
lorded 8:2b0d18ebbba9 1046 // length 11: 1 extra packet ((11 - 6 - 1) \ 7) + = 4\7 + 1 = 1
lorded 8:2b0d18ebbba9 1047 // length 13: 1 extra packet ((13 - 6 - 1) \ 7) + = 6\7 + 1 = 1
lorded 8:2b0d18ebbba9 1048 // length 14: 2 packets ((14 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1049 // length 20: 2 packets ((20 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1050 // length 21: 3 packets ((21 - 6 - 1) \ 7) + = 7\7 + 1 = 3
lorded 8:2b0d18ebbba9 1051 // Packets = lenght is ((length - 7) \ 7) + 1
lorded 8:2b0d18ebbba9 1052
lorded 8:2b0d18ebbba9 1053 // sprintf(buff, "multi message start, length %d\r\n", rxMsg.data[1]);
lorded 8:2b0d18ebbba9 1054 // DebugWrite(buff);
lorded 8:2b0d18ebbba9 1055
lorded 8:2b0d18ebbba9 1056 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1057 /*Query 03 19 02 08
lorded 8:2b0d18ebbba9 1058 * ID,073C:[10 0B] [59 02] [7B] 00 02 11]
lorded 8:2b0d18ebbba9 1059 * ID,073C:21 2B 00 02 A1 2A xx xx
lorded 8:2b0d18ebbba9 1060 * 10: Multi message start packet
lorded 8:2b0d18ebbba9 1061 * 0B: Length (11 DATA bytes). x'd out non-data
lorded 8:2b0d18ebbba9 1062 * 59: response type 59
lorded 8:2b0d18ebbba9 1063 * 02: subfunction 2
lorded 8:2b0d18ebbba9 1064 * 7B: mask
lorded 8:2b0d18ebbba9 1065 * 00 02 11: first 3 bytes of fault. Need next part
lorded 8:2b0d18ebbba9 1066 */
lorded 8:2b0d18ebbba9 1067 // get the first fault code, bytes 4-7
lorded 8:2b0d18ebbba9 1068 sendCANCommand(id, continuePacket, 8);
lorded 8:2b0d18ebbba9 1069 CANMessage additionalRxMsg[totalExpectedPackets];
lorded 8:2b0d18ebbba9 1070 int currentPacket = 0;
lorded 8:2b0d18ebbba9 1071 while (count++ < 10)
lorded 8:2b0d18ebbba9 1072 {
lorded 8:2b0d18ebbba9 1073
lorded 8:2b0d18ebbba9 1074 if (doFindExpectedResponse(&(additionalRxMsg[currentPacket]), resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1075 {
lorded 8:2b0d18ebbba9 1076 count = 0;
lorded 8:2b0d18ebbba9 1077 currentPacket++;
lorded 8:2b0d18ebbba9 1078 if (currentPacket >= totalExpectedPackets)
lorded 8:2b0d18ebbba9 1079 {
lorded 8:2b0d18ebbba9 1080 //DebugWrite("Found all additional packets\r\n");
lorded 8:2b0d18ebbba9 1081
lorded 8:2b0d18ebbba9 1082 memcpy(dataBytes, rxMsg.data + 2, 6); // 6 initial data bytes
lorded 8:2b0d18ebbba9 1083 for (int i = 0; i < totalExpectedPackets; i++)
lorded 8:2b0d18ebbba9 1084 {
lorded 8:2b0d18ebbba9 1085 memcpy(dataBytes + 6 + (totalExpectedPackets * i), additionalRxMsg[i].data + 1, 7);
lorded 8:2b0d18ebbba9 1086 }
lorded 8:2b0d18ebbba9 1087
lorded 8:2b0d18ebbba9 1088 //DebugWrite("Runtime Data bytes: ");
lorded 8:2b0d18ebbba9 1089 for (int i = 0; i < totalLength; i++)
lorded 8:2b0d18ebbba9 1090 {
lorded 8:2b0d18ebbba9 1091 sprintf(buff, "%02X ", dataBytes[i]);
lorded 8:2b0d18ebbba9 1092 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1093 }
lorded 8:2b0d18ebbba9 1094 //DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1095
lorded 8:2b0d18ebbba9 1096 long runtime = -1;
lorded 8:2b0d18ebbba9 1097 // bytes 3-6 are runtime
lorded 8:2b0d18ebbba9 1098 if (totalLength > 6)
lorded 8:2b0d18ebbba9 1099 {
lorded 8:2b0d18ebbba9 1100 runtime = dataBytes[3];
lorded 8:2b0d18ebbba9 1101 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1102 runtime = runtime + dataBytes[4];
lorded 8:2b0d18ebbba9 1103 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1104 runtime = runtime + dataBytes[5];
lorded 8:2b0d18ebbba9 1105 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1106 runtime = runtime + dataBytes[6];
lorded 8:2b0d18ebbba9 1107 s->heaterRuntime = runtime;
lorded 8:2b0d18ebbba9 1108 }
lorded 8:2b0d18ebbba9 1109 s->heaterRuntime = runtime;
lorded 8:2b0d18ebbba9 1110 break;
lorded 8:2b0d18ebbba9 1111 }
lorded 8:2b0d18ebbba9 1112
lorded 8:2b0d18ebbba9 1113 }
lorded 8:2b0d18ebbba9 1114 }
lorded 8:2b0d18ebbba9 1115 }
lorded 8:2b0d18ebbba9 1116 }
lorded 8:2b0d18ebbba9 1117 }
lorded 8:2b0d18ebbba9 1118 printf("f-b\r\n");
lorded 8:2b0d18ebbba9 1119 if (count >= 10)
lorded 8:2b0d18ebbba9 1120 {
lorded 8:2b0d18ebbba9 1121 printf("FAILED\r\n");
lorded 8:2b0d18ebbba9 1122 return;
lorded 8:2b0d18ebbba9 1123 }
lorded 8:2b0d18ebbba9 1124 return;
lorded 8:2b0d18ebbba9 1125 }
lorded 8:2b0d18ebbba9 1126 wiced_result_t sendGetGeneric(struct sHeatVars *s, char *buff, const char msgbytes[8], CANMessage* rxMsg)
lorded 8:2b0d18ebbba9 1127 {
lorded 8:2b0d18ebbba9 1128 int id;
lorded 8:2b0d18ebbba9 1129 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1130 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1131 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1132 {
lorded 8:2b0d18ebbba9 1133 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1134 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1135 }
lorded 8:2b0d18ebbba9 1136
lorded 8:2b0d18ebbba9 1137 const char continuePacket[8] =
lorded 8:2b0d18ebbba9 1138 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1139
lorded 8:2b0d18ebbba9 1140 //DebugWrite("************\r\n");
lorded 8:2b0d18ebbba9 1141 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1142 if (doFindExpectedResponse(rxMsg, resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1143 {
lorded 8:2b0d18ebbba9 1144 return WICED_SUCCESS;
lorded 8:2b0d18ebbba9 1145 }
lorded 8:2b0d18ebbba9 1146 return WICED_NOT_FOUND;
lorded 8:2b0d18ebbba9 1147 }
lorded 8:2b0d18ebbba9 1148 void sendGetTemperatures(struct sHeatVars *s, char *buff)
lorded 8:2b0d18ebbba9 1149 {
lorded 8:2b0d18ebbba9 1150
lorded 8:2b0d18ebbba9 1151 int id;
lorded 8:2b0d18ebbba9 1152 int count;
lorded 8:2b0d18ebbba9 1153 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1154 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1155 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1156 {
lorded 8:2b0d18ebbba9 1157 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1158 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1159 }
lorded 8:2b0d18ebbba9 1160 CANMessage rxMsg;
lorded 8:2b0d18ebbba9 1161 const char msgbytes[8] =
lorded 8:2b0d18ebbba9 1162 { 0x03, 0x22, 0xFD, 0x01, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1163
lorded 8:2b0d18ebbba9 1164 const char continuePacket[8] =
lorded 8:2b0d18ebbba9 1165 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1166
lorded 8:2b0d18ebbba9 1167 count = 0;
lorded 8:2b0d18ebbba9 1168
lorded 8:2b0d18ebbba9 1169 //DebugWrite("************\r\n");
lorded 8:2b0d18ebbba9 1170 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1171 // just expect the ID (0
lorded 8:2b0d18ebbba9 1172
lorded 8:2b0d18ebbba9 1173 if (doFindExpectedResponse(&rxMsg, resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1174 {
lorded 8:2b0d18ebbba9 1175 //DebugWrite("********(a)****\r\n");
lorded 8:2b0d18ebbba9 1176 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1177
lorded 8:2b0d18ebbba9 1178 // response is a multi part
lorded 8:2b0d18ebbba9 1179 if (rxMsg.data[0] < 0x10)
lorded 8:2b0d18ebbba9 1180 {
lorded 8:2b0d18ebbba9 1181 DebugWrite("Single Message. Shouldn't happen\r\n");
lorded 8:2b0d18ebbba9 1182 }
lorded 8:2b0d18ebbba9 1183 else if (rxMsg.data[0] < 0x20)
lorded 8:2b0d18ebbba9 1184 {
lorded 8:2b0d18ebbba9 1185 int totalLength = rxMsg.data[1];
lorded 8:2b0d18ebbba9 1186 unsigned int totalExpectedPackets = ((totalLength - 7) / 7) + 1;
lorded 8:2b0d18ebbba9 1187 unsigned char dataBytes[6 + totalExpectedPackets * 7];
lorded 8:2b0d18ebbba9 1188 memset(dataBytes, 0, 6 + totalExpectedPackets * 7);
lorded 8:2b0d18ebbba9 1189
lorded 8:2b0d18ebbba9 1190 // first packet contains 6 bytes of data, additional contain 7
lorded 8:2b0d18ebbba9 1191 // length 11: 1 extra packet ((11 - 6 - 1) \ 7) + = 4\7 + 1 = 1
lorded 8:2b0d18ebbba9 1192 // length 13: 1 extra packet ((13 - 6 - 1) \ 7) + = 6\7 + 1 = 1
lorded 8:2b0d18ebbba9 1193 // length 14: 2 packets ((14 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1194 // length 20: 2 packets ((20 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1195 // length 21: 3 packets ((21 - 6 - 1) \ 7) + = 7\7 + 1 = 3
lorded 8:2b0d18ebbba9 1196 // Packets = lenght is ((length - 7) \ 7) + 1
lorded 8:2b0d18ebbba9 1197
lorded 8:2b0d18ebbba9 1198 sprintf(buff, "multi message start, length %d\r\n", rxMsg.data[1]);
lorded 8:2b0d18ebbba9 1199 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1200
lorded 8:2b0d18ebbba9 1201 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1202 /*Query 03 19 02 08
lorded 8:2b0d18ebbba9 1203 * ID,073C:[10 0B] [59 02] [7B] 00 02 11]
lorded 8:2b0d18ebbba9 1204 * ID,073C:21 2B 00 02 A1 2A xx xx
lorded 8:2b0d18ebbba9 1205 * 10: Multi message start packet
lorded 8:2b0d18ebbba9 1206 * 0B: Length (11 DATA bytes). x'd out non-data
lorded 8:2b0d18ebbba9 1207 * 59: response type 59
lorded 8:2b0d18ebbba9 1208 * 02: subfunction 2
lorded 8:2b0d18ebbba9 1209 * 7B: mask
lorded 8:2b0d18ebbba9 1210 * 00 02 11: first 3 bytes of fault. Need next part
lorded 8:2b0d18ebbba9 1211 */
lorded 8:2b0d18ebbba9 1212 // get the first fault code, bytes 4-7
lorded 8:2b0d18ebbba9 1213 sendCANCommand(id, continuePacket, 8);
lorded 8:2b0d18ebbba9 1214 CANMessage additionalRxMsg[totalExpectedPackets];
lorded 8:2b0d18ebbba9 1215 int currentPacket = 0;
lorded 8:2b0d18ebbba9 1216 while (count++ < 10)
lorded 8:2b0d18ebbba9 1217 {
lorded 8:2b0d18ebbba9 1218
lorded 8:2b0d18ebbba9 1219 if (doFindExpectedResponse(&(additionalRxMsg[currentPacket]), resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1220 {
lorded 8:2b0d18ebbba9 1221 count = 0;
lorded 8:2b0d18ebbba9 1222 currentPacket++;
lorded 8:2b0d18ebbba9 1223 if (currentPacket >= totalExpectedPackets)
lorded 8:2b0d18ebbba9 1224 {
lorded 8:2b0d18ebbba9 1225 //DebugWrite("Found all additional packets\r\n");
lorded 8:2b0d18ebbba9 1226
lorded 8:2b0d18ebbba9 1227 memcpy(dataBytes, rxMsg.data + 2, 6); // 6 initial data bytes
lorded 8:2b0d18ebbba9 1228 for (int i = 0; i < totalExpectedPackets; i++)
lorded 8:2b0d18ebbba9 1229 {
lorded 8:2b0d18ebbba9 1230 memcpy(dataBytes + 6 + (totalExpectedPackets * i), additionalRxMsg[i].data + 1, 7);
lorded 8:2b0d18ebbba9 1231 }
lorded 8:2b0d18ebbba9 1232
lorded 8:2b0d18ebbba9 1233 s->flameTemp = dataBytes[3];
lorded 8:2b0d18ebbba9 1234 s->flameTemp = s->flameTemp << 8;
lorded 8:2b0d18ebbba9 1235 s->flameTemp += dataBytes[4];
lorded 8:2b0d18ebbba9 1236 s->flameTemp -= 5000;
lorded 8:2b0d18ebbba9 1237
lorded 8:2b0d18ebbba9 1238 s->inletTemp = dataBytes[5];
lorded 8:2b0d18ebbba9 1239 s->inletTemp = s->inletTemp << 8;
lorded 8:2b0d18ebbba9 1240 s->inletTemp += dataBytes[6];
lorded 8:2b0d18ebbba9 1241 s->inletTemp -= 5000;
lorded 8:2b0d18ebbba9 1242
lorded 8:2b0d18ebbba9 1243 s->outletTemp = dataBytes[7];
lorded 8:2b0d18ebbba9 1244 s->outletTemp = s->outletTemp << 8;
lorded 8:2b0d18ebbba9 1245 s->outletTemp += dataBytes[8];
lorded 8:2b0d18ebbba9 1246 s->outletTemp -= 5000;
lorded 8:2b0d18ebbba9 1247
lorded 8:2b0d18ebbba9 1248 DebugWrite(" **\r\n");
lorded 8:2b0d18ebbba9 1249 //DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1250
lorded 8:2b0d18ebbba9 1251 //long runtime = -1;
lorded 8:2b0d18ebbba9 1252 // bytes 3-6 are runtime
lorded 8:2b0d18ebbba9 1253 /*
lorded 8:2b0d18ebbba9 1254 if (totalLength > 6)
lorded 8:2b0d18ebbba9 1255 {
lorded 8:2b0d18ebbba9 1256 runtime = dataBytes[3];
lorded 8:2b0d18ebbba9 1257 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1258 runtime = runtime + dataBytes[4];
lorded 8:2b0d18ebbba9 1259 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1260 runtime = runtime + dataBytes[5];
lorded 8:2b0d18ebbba9 1261 runtime = runtime << 8;
lorded 8:2b0d18ebbba9 1262 runtime = runtime + dataBytes[6];
lorded 8:2b0d18ebbba9 1263 s->heaterRuntime = runtime;
lorded 8:2b0d18ebbba9 1264 }
lorded 8:2b0d18ebbba9 1265 s->heaterRuntime = runtime;
lorded 8:2b0d18ebbba9 1266 */
lorded 8:2b0d18ebbba9 1267 break;
lorded 8:2b0d18ebbba9 1268 }
lorded 8:2b0d18ebbba9 1269 }
lorded 8:2b0d18ebbba9 1270 }
lorded 8:2b0d18ebbba9 1271 }
lorded 8:2b0d18ebbba9 1272 }
lorded 8:2b0d18ebbba9 1273 printf("f-b\r\n");
lorded 8:2b0d18ebbba9 1274 if (count >= 10)
lorded 8:2b0d18ebbba9 1275 {
lorded 8:2b0d18ebbba9 1276 printf("FAILED\r\n");
lorded 8:2b0d18ebbba9 1277 return;
lorded 8:2b0d18ebbba9 1278 }
lorded 8:2b0d18ebbba9 1279 return;
lorded 8:2b0d18ebbba9 1280 }
lorded 8:2b0d18ebbba9 1281 void sendGetBattery(struct sHeatVars *s, char *buff)
lorded 8:2b0d18ebbba9 1282 {
lorded 8:2b0d18ebbba9 1283 int count;
lorded 8:2b0d18ebbba9 1284 CANMessage rxMsg;
lorded 8:2b0d18ebbba9 1285 char msgbytes[8] =
lorded 8:2b0d18ebbba9 1286 { 0x03, 0x22, 0xFD, 0x04, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1287 // response is on 73C: 0x05, 0x62, 0xFD, 0x04, [0x00, 0x7D], 0xB0, 0x1C
lorded 8:2b0d18ebbba9 1288 int id;
lorded 8:2b0d18ebbba9 1289 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1290 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1291 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1292 {
lorded 8:2b0d18ebbba9 1293 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1294 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1295 }
lorded 8:2b0d18ebbba9 1296 count = 0;
lorded 8:2b0d18ebbba9 1297 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1298 int batt = 0;
lorded 8:2b0d18ebbba9 1299 msgbytes[1] = 0x62;
lorded 8:2b0d18ebbba9 1300 while (count++ < 10)
lorded 8:2b0d18ebbba9 1301 {
lorded 8:2b0d18ebbba9 1302 // just expect the ID (0
lorded 8:2b0d18ebbba9 1303 if (doFindExpectedResponse(&rxMsg, resp, msgbytes, 4) > 0)
lorded 8:2b0d18ebbba9 1304 {
lorded 8:2b0d18ebbba9 1305 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1306 batt = rxMsg.data[4];
lorded 8:2b0d18ebbba9 1307 batt = batt << 8;
lorded 8:2b0d18ebbba9 1308 batt += rxMsg.data[5];
lorded 8:2b0d18ebbba9 1309 s->battV = batt;
lorded 8:2b0d18ebbba9 1310 }
lorded 8:2b0d18ebbba9 1311 }
lorded 8:2b0d18ebbba9 1312 }
lorded 8:2b0d18ebbba9 1313 void sendGetAltitude(struct sHeatVars *s, char *buff)
lorded 8:2b0d18ebbba9 1314 {
lorded 8:2b0d18ebbba9 1315 //DebugWrite("ALTITUDE******\r\n");
lorded 8:2b0d18ebbba9 1316 int count;
lorded 8:2b0d18ebbba9 1317 CANMessage rxMsg;
lorded 8:2b0d18ebbba9 1318 char msgbytes[8] =
lorded 8:2b0d18ebbba9 1319 { 0x03, 0x22, 0xFD, 0x36, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1320 // response is on 73C: 0x05, 0x62, 0xFD, 0x04, [0x00, 0x7D], 0xB0, 0x1C
lorded 8:2b0d18ebbba9 1321 int id;
lorded 8:2b0d18ebbba9 1322 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1323 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1324 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1325 {
lorded 8:2b0d18ebbba9 1326 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1327 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1328 }
lorded 8:2b0d18ebbba9 1329 count = 0;
lorded 8:2b0d18ebbba9 1330 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1331 int alt = 0;
lorded 8:2b0d18ebbba9 1332 msgbytes[1] = 0x62;
lorded 8:2b0d18ebbba9 1333 while (count++ < 10)
lorded 8:2b0d18ebbba9 1334 {
lorded 8:2b0d18ebbba9 1335 // just expect the ID (0
lorded 8:2b0d18ebbba9 1336 if (doFindExpectedResponse(&rxMsg, resp, msgbytes, 4) > 0)
lorded 8:2b0d18ebbba9 1337 {
lorded 8:2b0d18ebbba9 1338 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1339 alt = rxMsg.data[4];
lorded 8:2b0d18ebbba9 1340 alt = alt << 8;
lorded 8:2b0d18ebbba9 1341 alt += rxMsg.data[5];
lorded 8:2b0d18ebbba9 1342 s->altitude = alt / 10;
lorded 8:2b0d18ebbba9 1343 }
lorded 8:2b0d18ebbba9 1344 }
lorded 8:2b0d18ebbba9 1345 //DebugWrite("ALTITUDE******\r\n");
lorded 8:2b0d18ebbba9 1346 }
lorded 8:2b0d18ebbba9 1347
lorded 8:2b0d18ebbba9 1348 void sendGetFault(struct sHeatVars *s, char *buff)
lorded 8:2b0d18ebbba9 1349 {
lorded 8:2b0d18ebbba9 1350 //DebugWrite("Fault command\r\n");
lorded 8:2b0d18ebbba9 1351 CANMessage rxMsg;
lorded 8:2b0d18ebbba9 1352 int count;
lorded 8:2b0d18ebbba9 1353 // 3 bytes, function 19, command 2, mask 8 (all confirmed errors) (failed this cycle)
lorded 8:2b0d18ebbba9 1354 const char msgbytes[8] =
lorded 8:2b0d18ebbba9 1355 { 0x03, 0x19, 0x02, 0x08, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1356 const char continuePacket[8] =
lorded 8:2b0d18ebbba9 1357 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 1358
lorded 8:2b0d18ebbba9 1359 int id;
lorded 8:2b0d18ebbba9 1360 int resp = CTRLRESPONSE;
lorded 8:2b0d18ebbba9 1361 id = CTRLCHANNEL;
lorded 8:2b0d18ebbba9 1362 if (s->heaternum == 2)
lorded 8:2b0d18ebbba9 1363 {
lorded 8:2b0d18ebbba9 1364 id = CTRLCHANNEL2;
lorded 8:2b0d18ebbba9 1365 resp = CTRLRESPONSE2;
lorded 8:2b0d18ebbba9 1366 }
lorded 8:2b0d18ebbba9 1367 count = 0;
lorded 8:2b0d18ebbba9 1368 sendCANCommand(id, msgbytes, 8);
lorded 8:2b0d18ebbba9 1369
lorded 8:2b0d18ebbba9 1370 while (count++ < 10)
lorded 8:2b0d18ebbba9 1371 {
lorded 8:2b0d18ebbba9 1372 // just expect the ID (0
lorded 8:2b0d18ebbba9 1373 if (doFindExpectedResponse(&rxMsg, resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1374 {
lorded 8:2b0d18ebbba9 1375 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1376 // response in the format 59
lorded 8:2b0d18ebbba9 1377 // the first byte dictates the length
lorded 8:2b0d18ebbba9 1378
lorded 8:2b0d18ebbba9 1379 //073C:03 59 02 7B 05 48 C3 01
lorded 8:2b0d18ebbba9 1380
lorded 8:2b0d18ebbba9 1381 if (rxMsg.data[0] < 0x10)
lorded 8:2b0d18ebbba9 1382 {
lorded 8:2b0d18ebbba9 1383 DebugWrite("Single Message. ");
lorded 8:2b0d18ebbba9 1384 if (rxMsg.data[0] == 0x03)
lorded 8:2b0d18ebbba9 1385 {
lorded 8:2b0d18ebbba9 1386 // 59 is a resonse. Mask info isnt useful because no faults
lorded 8:2b0d18ebbba9 1387 if (rxMsg.data[1] == 0x59)
lorded 8:2b0d18ebbba9 1388 {
lorded 8:2b0d18ebbba9 1389 // no faults
lorded 8:2b0d18ebbba9 1390 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1391 {
lorded 8:2b0d18ebbba9 1392 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1393 }
lorded 8:2b0d18ebbba9 1394 sprintf(buff, "NO FAULTS (reset)\r\n");
lorded 8:2b0d18ebbba9 1395 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1396 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1397 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1398 s->errorHistory[1] = 0x0;
lorded 8:2b0d18ebbba9 1399 s->errorHistory[2] = 0x0;
lorded 8:2b0d18ebbba9 1400 s->errorHistory[3] = 0x0;
lorded 8:2b0d18ebbba9 1401 s->errorHistory[4] = 0x0;
lorded 8:2b0d18ebbba9 1402 s->errorHistory[5] = 0x0;
lorded 8:2b0d18ebbba9 1403 }
lorded 8:2b0d18ebbba9 1404 }
lorded 8:2b0d18ebbba9 1405 else if ((rxMsg.data[0] == 0x07) && rxMsg.data[1] == 0x59)
lorded 8:2b0d18ebbba9 1406 {
lorded 8:2b0d18ebbba9 1407
lorded 8:2b0d18ebbba9 1408 //ID,073C:07 59 02 7B 00 02 11 2A
lorded 8:2b0d18ebbba9 1409 // 07 length
lorded 8:2b0d18ebbba9 1410 // 59 response
lorded 8:2b0d18ebbba9 1411
lorded 8:2b0d18ebbba9 1412 // one fault. Is it a current fault?
lorded 8:2b0d18ebbba9 1413 if ((rxMsg.data[5] == 0x00) && (rxMsg.data[6] == 0x00))
lorded 8:2b0d18ebbba9 1414 {
lorded 8:2b0d18ebbba9 1415 // the fault isn't a fault.
lorded 8:2b0d18ebbba9 1416 sprintf(buff, "NO FAULTS\r\n");
lorded 8:2b0d18ebbba9 1417 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1418 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1419 {
lorded 8:2b0d18ebbba9 1420 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1421 }
lorded 8:2b0d18ebbba9 1422 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1423 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1424 s->errorHistory[1] = 0x0;
lorded 8:2b0d18ebbba9 1425 s->errorHistory[2] = 0x0;
lorded 8:2b0d18ebbba9 1426 s->errorHistory[3] = 0x0;
lorded 8:2b0d18ebbba9 1427 s->errorHistory[4] = 0x0;
lorded 8:2b0d18ebbba9 1428 s->errorHistory[5] = 0x0;
lorded 8:2b0d18ebbba9 1429 }
lorded 8:2b0d18ebbba9 1430 else
lorded 8:2b0d18ebbba9 1431 {
lorded 8:2b0d18ebbba9 1432
lorded 8:2b0d18ebbba9 1433 //A: 0010 1010 bit 1 is test failed this cycle
lorded 8:2b0d18ebbba9 1434 //B: 0010 1011 bit 0 is test failed. Seems to be considered
lorded 8:2b0d18ebbba9 1435 // active if bit 0 is '1'
lorded 8:2b0d18ebbba9 1436
lorded 8:2b0d18ebbba9 1437 // bit 5 test failed since last clear
lorded 8:2b0d18ebbba9 1438
lorded 8:2b0d18ebbba9 1439 //07 59 02 7B 00 02 11 2A
lorded 8:2b0d18ebbba9 1440
lorded 8:2b0d18ebbba9 1441 uint16_t newError = rxMsg.data[5];
lorded 8:2b0d18ebbba9 1442 newError *= 256;
lorded 8:2b0d18ebbba9 1443 newError += rxMsg.data[6];
lorded 8:2b0d18ebbba9 1444 wiced_bool_t gotAnError = WICED_FALSE;
lorded 8:2b0d18ebbba9 1445 // is it a current fault?
lorded 8:2b0d18ebbba9 1446 if ((rxMsg.data[7] & 0x01) == 0x01)
lorded 8:2b0d18ebbba9 1447 {
lorded 8:2b0d18ebbba9 1448 gotAnError = WICED_TRUE;
lorded 8:2b0d18ebbba9 1449 if (s->currentError != newError)
lorded 8:2b0d18ebbba9 1450 {
lorded 8:2b0d18ebbba9 1451 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1452 }
lorded 8:2b0d18ebbba9 1453 // active fault
lorded 8:2b0d18ebbba9 1454 s->currentError = newError;
lorded 8:2b0d18ebbba9 1455 }
lorded 8:2b0d18ebbba9 1456 if (!gotAnError)
lorded 8:2b0d18ebbba9 1457 {
lorded 8:2b0d18ebbba9 1458 s->currentError = 0;
lorded 8:2b0d18ebbba9 1459 }
lorded 8:2b0d18ebbba9 1460 // also first history fault
lorded 8:2b0d18ebbba9 1461 s->errorHistory[0] = newError;
lorded 8:2b0d18ebbba9 1462
lorded 8:2b0d18ebbba9 1463 sprintf(buff, "FAULT(h%d): %02X%02X\r\n", s->heaternum, rxMsg.data[5], rxMsg.data[6]);
lorded 8:2b0d18ebbba9 1464 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1465
lorded 8:2b0d18ebbba9 1466 // if (s->currentError != newError)
lorded 8:2b0d18ebbba9 1467 // {
lorded 8:2b0d18ebbba9 1468 // s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1469 // }
lorded 8:2b0d18ebbba9 1470 //errorChangeFlag
lorded 8:2b0d18ebbba9 1471 }
lorded 8:2b0d18ebbba9 1472 }
lorded 8:2b0d18ebbba9 1473 }
lorded 8:2b0d18ebbba9 1474 else if (rxMsg.data[0] < 0x20)
lorded 8:2b0d18ebbba9 1475 {
lorded 8:2b0d18ebbba9 1476
lorded 8:2b0d18ebbba9 1477 int totalLength = rxMsg.data[1];
lorded 8:2b0d18ebbba9 1478 unsigned int totalExpectedPackets = ((totalLength - 7) / 7) + 1;
lorded 8:2b0d18ebbba9 1479 unsigned char dataBytes[6 + totalExpectedPackets * 7];
lorded 8:2b0d18ebbba9 1480 memset(dataBytes, 0, 6 + totalExpectedPackets * 7)
lorded 8:2b0d18ebbba9 1481
lorded 8:2b0d18ebbba9 1482 ;
lorded 8:2b0d18ebbba9 1483 // first packet contains 6 bytes of data, additional contain 7
lorded 8:2b0d18ebbba9 1484 // length 11: 1 extra packet ((11 - 6 - 1) \ 7) + = 4\7 + 1 = 1
lorded 8:2b0d18ebbba9 1485 // length 13: 1 extra packet ((13 - 6 - 1) \ 7) + = 6\7 + 1 = 1
lorded 8:2b0d18ebbba9 1486 // length 14: 2 packets ((14 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1487 // length 20: 2 packets ((20 - 6 - 1) \ 7) + = 7\7 + 1 = 2
lorded 8:2b0d18ebbba9 1488 // length 21: 3 packets ((21 - 6 - 1) \ 7) + = 7\7 + 1 = 3
lorded 8:2b0d18ebbba9 1489 // Packets = lenght is ((length - 7) \ 7) + 1
lorded 8:2b0d18ebbba9 1490
lorded 8:2b0d18ebbba9 1491 // sprintf(buff, "multi message start, length %d\r\n", rxMsg.data[1]);
lorded 8:2b0d18ebbba9 1492 // DebugWrite(buff);
lorded 8:2b0d18ebbba9 1493
lorded 8:2b0d18ebbba9 1494 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1495 /*Query 03 19 02 08
lorded 8:2b0d18ebbba9 1496 * ID,073C:[10 0B] [59 02] [7B] 00 02 11]
lorded 8:2b0d18ebbba9 1497 * ID,073C:21 2B 00 02 A1 2A xx xx
lorded 8:2b0d18ebbba9 1498 * 10: Multi message start packet
lorded 8:2b0d18ebbba9 1499 * 0B: Length (11 DATA bytes). x'd out non-data
lorded 8:2b0d18ebbba9 1500 * 59: response type 59
lorded 8:2b0d18ebbba9 1501 * 02: subfunction 2
lorded 8:2b0d18ebbba9 1502 * 7B: mask
lorded 8:2b0d18ebbba9 1503 * 00 02 11: first 3 bytes of fault. Need next part
lorded 8:2b0d18ebbba9 1504 */
lorded 8:2b0d18ebbba9 1505 // get the first fault code, bytes 4-7
lorded 8:2b0d18ebbba9 1506 sendCANCommand(id, continuePacket, 8);
lorded 8:2b0d18ebbba9 1507 CANMessage additionalRxMsg[totalExpectedPackets];
lorded 8:2b0d18ebbba9 1508 int currentPacket = 0;
lorded 8:2b0d18ebbba9 1509 while (count++ < 10)
lorded 8:2b0d18ebbba9 1510 {
lorded 8:2b0d18ebbba9 1511 if (doFindExpectedResponse(&(additionalRxMsg[currentPacket]), resp, msgbytes, 0) > 0)
lorded 8:2b0d18ebbba9 1512 {
lorded 8:2b0d18ebbba9 1513 count = 0;
lorded 8:2b0d18ebbba9 1514 currentPacket++;
lorded 8:2b0d18ebbba9 1515 if (currentPacket >= totalExpectedPackets)
lorded 8:2b0d18ebbba9 1516 {
lorded 8:2b0d18ebbba9 1517 DebugWrite("Found all additional packets\r\n");
lorded 8:2b0d18ebbba9 1518
lorded 8:2b0d18ebbba9 1519 memcpy(dataBytes, rxMsg.data + 2, 6); // 6 initial data bytes
lorded 8:2b0d18ebbba9 1520 for (int i = 0; i < totalExpectedPackets; i++)
lorded 8:2b0d18ebbba9 1521 {
lorded 8:2b0d18ebbba9 1522 sprintf(printbuff, "- copying packet %d to databytes + %d\r\n", i, 6 + (i) * 7);
lorded 8:2b0d18ebbba9 1523 DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1524 memcpy(dataBytes + 6 + ((i) * 7), additionalRxMsg[i].data + 1, 7);
lorded 8:2b0d18ebbba9 1525
lorded 8:2b0d18ebbba9 1526 }
lorded 8:2b0d18ebbba9 1527 DebugWrite("Data bytes: ");
lorded 8:2b0d18ebbba9 1528 for (int i = 0; i < totalLength; i++)
lorded 8:2b0d18ebbba9 1529 {
lorded 8:2b0d18ebbba9 1530 sprintf(buff, "%02X ", dataBytes[i]);
lorded 8:2b0d18ebbba9 1531 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1532 }
lorded 8:2b0d18ebbba9 1533 DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1534
lorded 8:2b0d18ebbba9 1535 uint16_t newError;
lorded 8:2b0d18ebbba9 1536 wiced_bool_t gotAnError = WICED_FALSE;
lorded 8:2b0d18ebbba9 1537 //Data bytes: 59 02 7B [00 02 11 2B] [00 02 A1 28]
lorded 8:2b0d18ebbba9 1538
lorded 8:2b0d18ebbba9 1539 for (int i = 0; i < 6; i++)
lorded 8:2b0d18ebbba9 1540 {
lorded 8:2b0d18ebbba9 1541 s->errorHistory[i] = 0;
lorded 8:2b0d18ebbba9 1542 }
lorded 8:2b0d18ebbba9 1543 for (int i = 3; i < totalLength; i += 4)
lorded 8:2b0d18ebbba9 1544 {
lorded 8:2b0d18ebbba9 1545 newError = dataBytes[i + 1];
lorded 8:2b0d18ebbba9 1546 newError *= 256;
lorded 8:2b0d18ebbba9 1547 newError += dataBytes[i + 2];
lorded 8:2b0d18ebbba9 1548
lorded 8:2b0d18ebbba9 1549 // is it a current fault?
lorded 8:2b0d18ebbba9 1550 if ((dataBytes[i + 3] & 0x01) == 0x01)
lorded 8:2b0d18ebbba9 1551 {
lorded 8:2b0d18ebbba9 1552 gotAnError = WICED_TRUE;
lorded 8:2b0d18ebbba9 1553 if (s->currentError != newError)
lorded 8:2b0d18ebbba9 1554 {
lorded 8:2b0d18ebbba9 1555 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1556 }
lorded 8:2b0d18ebbba9 1557 // active fault
lorded 8:2b0d18ebbba9 1558 s->currentError = newError;
lorded 8:2b0d18ebbba9 1559 }
lorded 8:2b0d18ebbba9 1560 // history fault
lorded 8:2b0d18ebbba9 1561 if (((i - 3) / 4) < 6)
lorded 8:2b0d18ebbba9 1562 {
lorded 8:2b0d18ebbba9 1563 s->errorHistory[(i - 3) / 4] = newError;
lorded 8:2b0d18ebbba9 1564 }
lorded 8:2b0d18ebbba9 1565
lorded 8:2b0d18ebbba9 1566 sprintf(buff, "FAULT: %02X%02X\r\n", dataBytes[i + 1], dataBytes[i + 2]);
lorded 8:2b0d18ebbba9 1567 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1568 }
lorded 8:2b0d18ebbba9 1569 if (!gotAnError)
lorded 8:2b0d18ebbba9 1570 {
lorded 8:2b0d18ebbba9 1571 s->currentError = 0; // no error to start.
lorded 8:2b0d18ebbba9 1572 }
lorded 8:2b0d18ebbba9 1573 // clear the remainder
lorded 8:2b0d18ebbba9 1574 break;
lorded 8:2b0d18ebbba9 1575 }
lorded 8:2b0d18ebbba9 1576 }
lorded 8:2b0d18ebbba9 1577 }
lorded 8:2b0d18ebbba9 1578 }
lorded 8:2b0d18ebbba9 1579 }
lorded 8:2b0d18ebbba9 1580 }
lorded 8:2b0d18ebbba9 1581 printf("f-b\r\n");
lorded 8:2b0d18ebbba9 1582 if (count >= 10)
lorded 8:2b0d18ebbba9 1583 {
lorded 8:2b0d18ebbba9 1584 printf("FAILED\r\n");
lorded 8:2b0d18ebbba9 1585 return;
lorded 8:2b0d18ebbba9 1586 }
lorded 8:2b0d18ebbba9 1587 printf("f-c\r\n");
lorded 8:2b0d18ebbba9 1588 if ((rxMsg.data[0] == 0x03) && (rxMsg.data[1] == 0x59) && (rxMsg.data[5] == 0x56) && (rxMsg.data[6] == 0x78))
lorded 8:2b0d18ebbba9 1589 {
lorded 8:2b0d18ebbba9 1590
lorded 8:2b0d18ebbba9 1591 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1592 {
lorded 8:2b0d18ebbba9 1593 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1594 }
lorded 8:2b0d18ebbba9 1595 sprintf(buff, "NO FAULTS (reset)\r\n");
lorded 8:2b0d18ebbba9 1596 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1597 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1598 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1599 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1600 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1601 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1602 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1603 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1604 }
lorded 8:2b0d18ebbba9 1605 else if ((rxMsg.data[0] == 0x03) && (rxMsg.data[1] == 0x59) && (rxMsg.data[5] == 0x00) && (rxMsg.data[6] == 0x00))
lorded 8:2b0d18ebbba9 1606 {
lorded 8:2b0d18ebbba9 1607 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1608 {
lorded 8:2b0d18ebbba9 1609 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1610 }
lorded 8:2b0d18ebbba9 1611 sprintf(buff, "NO FAULTS(1)\r\n");
lorded 8:2b0d18ebbba9 1612 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1613 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1614 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1615 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1616 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1617 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1618 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1619 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1620 }
lorded 8:2b0d18ebbba9 1621 else if ((rxMsg.data[0] == 0x07) && (rxMsg.data[1] == 0x59) && (rxMsg.data[2] == 0x02))
lorded 8:2b0d18ebbba9 1622 {
lorded 8:2b0d18ebbba9 1623 if ((rxMsg.data[5] == 0x00) && (rxMsg.data[6] == 0x00))
lorded 8:2b0d18ebbba9 1624 {
lorded 8:2b0d18ebbba9 1625 sprintf(buff, "NO FAULTS\r\n");
lorded 8:2b0d18ebbba9 1626 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1627 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1628 {
lorded 8:2b0d18ebbba9 1629 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1630 }
lorded 8:2b0d18ebbba9 1631 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1632 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1633 s->errorHistory[1] = 0x0;
lorded 8:2b0d18ebbba9 1634 s->errorHistory[2] = 0x0;
lorded 8:2b0d18ebbba9 1635 s->errorHistory[3] = 0x0;
lorded 8:2b0d18ebbba9 1636 s->errorHistory[4] = 0x0;
lorded 8:2b0d18ebbba9 1637 s->errorHistory[5] = 0x0;
lorded 8:2b0d18ebbba9 1638 }
lorded 8:2b0d18ebbba9 1639 else
lorded 8:2b0d18ebbba9 1640 {
lorded 8:2b0d18ebbba9 1641 sprintf(buff, "FAULT: %02X%02X\r\n", rxMsg.data[5], rxMsg.data[6]);
lorded 8:2b0d18ebbba9 1642 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1643 uint16_t newError = rxMsg.data[5];
lorded 8:2b0d18ebbba9 1644 newError *= 256;
lorded 8:2b0d18ebbba9 1645 newError += rxMsg.data[6];
lorded 8:2b0d18ebbba9 1646 if (s->currentError != newError)
lorded 8:2b0d18ebbba9 1647 {
lorded 8:2b0d18ebbba9 1648 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1649 }
lorded 8:2b0d18ebbba9 1650 //errorChangeFlag
lorded 8:2b0d18ebbba9 1651 s->currentError = newError;
lorded 8:2b0d18ebbba9 1652 s->errorHistory[0] = newError;
lorded 8:2b0d18ebbba9 1653 }
lorded 8:2b0d18ebbba9 1654 printf("SUCCESS\r\n");
lorded 8:2b0d18ebbba9 1655 }
lorded 8:2b0d18ebbba9 1656 else if ((rxMsg.data[0] == 0x03) && (rxMsg.data[1] == 0x59) && (rxMsg.data[2] == 0x02))
lorded 8:2b0d18ebbba9 1657 {
lorded 8:2b0d18ebbba9 1658 // this means cleared in both cases!
lorded 8:2b0d18ebbba9 1659 if (s->currentError != 0)
lorded 8:2b0d18ebbba9 1660 {
lorded 8:2b0d18ebbba9 1661 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1662 }
lorded 8:2b0d18ebbba9 1663 sprintf(buff, "NO FAULTS(2)\r\n");
lorded 8:2b0d18ebbba9 1664 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1665 s->currentError = 0x00;
lorded 8:2b0d18ebbba9 1666 s->errorHistory[0] = 0x0;
lorded 8:2b0d18ebbba9 1667 s->errorHistory[1] = 0x0;
lorded 8:2b0d18ebbba9 1668 s->errorHistory[2] = 0x0;
lorded 8:2b0d18ebbba9 1669 s->errorHistory[3] = 0x0;
lorded 8:2b0d18ebbba9 1670 s->errorHistory[4] = 0x0;
lorded 8:2b0d18ebbba9 1671 s->errorHistory[5] = 0x0;
lorded 8:2b0d18ebbba9 1672 }
lorded 8:2b0d18ebbba9 1673 else if ((rxMsg.data[0] == 0x10) && (rxMsg.data[1] == 0x0B))
lorded 8:2b0d18ebbba9 1674 {
lorded 8:2b0d18ebbba9 1675 sprintf(buff, " MULTI FAULT: %02X%02X\r\n", rxMsg.data[6], rxMsg.data[7]);
lorded 8:2b0d18ebbba9 1676 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1677 uint16_t newError = rxMsg.data[6];
lorded 8:2b0d18ebbba9 1678 newError *= 256;
lorded 8:2b0d18ebbba9 1679 newError += rxMsg.data[7];
lorded 8:2b0d18ebbba9 1680 if (s->currentError != newError)
lorded 8:2b0d18ebbba9 1681 {
lorded 8:2b0d18ebbba9 1682 s->errorChangeFlag = 1;
lorded 8:2b0d18ebbba9 1683 }
lorded 8:2b0d18ebbba9 1684 s->currentError = newError;
lorded 8:2b0d18ebbba9 1685 s->errorHistory[0] = newError;
lorded 8:2b0d18ebbba9 1686 }
lorded 8:2b0d18ebbba9 1687 else
lorded 8:2b0d18ebbba9 1688 {
lorded 8:2b0d18ebbba9 1689 sprintf(buff, "OTHER RESPONSE\r\n");
lorded 8:2b0d18ebbba9 1690 DebugWrite(buff);
lorded 8:2b0d18ebbba9 1691 printCAN(&rxMsg);
lorded 8:2b0d18ebbba9 1692 }
lorded 8:2b0d18ebbba9 1693 printf("f-d\r\n");
lorded 8:2b0d18ebbba9 1694 }
lorded 8:2b0d18ebbba9 1695
lorded 8:2b0d18ebbba9 1696 void readCAN(struct sHeatVars *s)
lorded 8:2b0d18ebbba9 1697 {
lorded 8:2b0d18ebbba9 1698 // find the heater to update in some cases
lorded 8:2b0d18ebbba9 1699 int count = 0;
lorded 8:2b0d18ebbba9 1700 struct sHeatVars* heaterToUpdate = NULL;
lorded 8:2b0d18ebbba9 1701 //DebugWrite("read\r\n");
lorded 8:2b0d18ebbba9 1702 CANMessage canMsg;
lorded 8:2b0d18ebbba9 1703
lorded 8:2b0d18ebbba9 1704 int incoming = can2.read(canMsg);
lorded 8:2b0d18ebbba9 1705 while ((incoming > 0) && (count++ < 10))
lorded 8:2b0d18ebbba9 1706 {
lorded 8:2b0d18ebbba9 1707
lorded 8:2b0d18ebbba9 1708 // start blank
lorded 8:2b0d18ebbba9 1709
lorded 8:2b0d18ebbba9 1710 if (((canMsg.id == 0x07A0)))
lorded 8:2b0d18ebbba9 1711 {
lorded 8:2b0d18ebbba9 1712 otherControllerDetected = 30;
lorded 8:2b0d18ebbba9 1713 DebugWrite("\r\n****OTHER CONTROLLER ON NETWORK*****\r\n");
lorded 8:2b0d18ebbba9 1714 }
lorded 8:2b0d18ebbba9 1715 if (((canMsg.id != 0x0625) && (canMsg.id != 0x02C4)) && (canMsg.id != 0x02C6) && (canMsg.id != 0x0626) && (canMsg.id != 0x02D0)
lorded 8:2b0d18ebbba9 1716 && (canMsg.id != 0x02CE))
lorded 8:2b0d18ebbba9 1717 {
lorded 8:2b0d18ebbba9 1718 //
lorded 8:2b0d18ebbba9 1719 //DebugWrite("0-");
lorded 8:2b0d18ebbba9 1720 // printCAN(&canMsg);
lorded 8:2b0d18ebbba9 1721 }
lorded 8:2b0d18ebbba9 1722 else if ((canMsg.id == 0x0625) || (canMsg.id == 0x0626))
lorded 8:2b0d18ebbba9 1723 {
lorded 8:2b0d18ebbba9 1724 if ((canMsg.id == 0x0625) && (heaterState[0].bustype == HEATERTYPECAN) && (heaterState[0].heaternum == 1))
lorded 8:2b0d18ebbba9 1725 {
lorded 8:2b0d18ebbba9 1726 heaterToUpdate = &(heaterState[0]);
lorded 8:2b0d18ebbba9 1727 }
lorded 8:2b0d18ebbba9 1728 else if ((canMsg.id == 0x0625) && (heaterState[1].bustype == HEATERTYPECAN) && (heaterState[1].heaternum == 1))
lorded 8:2b0d18ebbba9 1729 {
lorded 8:2b0d18ebbba9 1730 heaterToUpdate = &(heaterState[1]);
lorded 8:2b0d18ebbba9 1731 }
lorded 8:2b0d18ebbba9 1732 else if ((canMsg.id == 0x0626) && (heaterState[0].bustype == HEATERTYPECAN) && (heaterState[0].heaternum == 2))
lorded 8:2b0d18ebbba9 1733 {
lorded 8:2b0d18ebbba9 1734 heaterToUpdate = &(heaterState[0]);
lorded 8:2b0d18ebbba9 1735 }
lorded 8:2b0d18ebbba9 1736 else if ((canMsg.id == 0x0626) && (heaterState[1].bustype == HEATERTYPECAN) && (heaterState[1].heaternum == 2))
lorded 8:2b0d18ebbba9 1737 {
lorded 8:2b0d18ebbba9 1738 heaterToUpdate = &(heaterState[1]);
lorded 8:2b0d18ebbba9 1739 }
lorded 8:2b0d18ebbba9 1740 heaterToUpdate->heaterDetected = 60; // preserve for a min.
lorded 8:2b0d18ebbba9 1741 // unpack and document
lorded 8:2b0d18ebbba9 1742 NM_Heater_1_t heaterInfo;
lorded 8:2b0d18ebbba9 1743 Unpack_NM_Heater_1_mydbc(&heaterInfo, canMsg.data, 0);
lorded 8:2b0d18ebbba9 1744 //DebugWrite("NM_HEATER_");
lorded 8:2b0d18ebbba9 1745
lorded 8:2b0d18ebbba9 1746 /*
lorded 8:2b0d18ebbba9 1747 sprintf(printbuff, "%d,%lu,", heaterToUpdate->heaternum, heaterInfo.SerialNumber);
lorded 8:2b0d18ebbba9 1748 DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1749 if (heaterInfo.HeaterInitFinished)
lorded 8:2b0d18ebbba9 1750 {
lorded 8:2b0d18ebbba9 1751 DebugWrite("DoneInit,");
lorded 8:2b0d18ebbba9 1752 }
lorded 8:2b0d18ebbba9 1753 else
lorded 8:2b0d18ebbba9 1754 {
lorded 8:2b0d18ebbba9 1755 DebugWrite("NOINIT,");
lorded 8:2b0d18ebbba9 1756 }
lorded 8:2b0d18ebbba9 1757 */
lorded 8:2b0d18ebbba9 1758 if (heaterInfo.HeaterType == 0)
lorded 8:2b0d18ebbba9 1759 {
lorded 8:2b0d18ebbba9 1760 // DebugWrite("Air,");
lorded 8:2b0d18ebbba9 1761 if (heaterToUpdate->setpoint == 0)
lorded 8:2b0d18ebbba9 1762 {
lorded 8:2b0d18ebbba9 1763 heaterToUpdate->setpoint = 250;
lorded 8:2b0d18ebbba9 1764 }
lorded 8:2b0d18ebbba9 1765 }
lorded 8:2b0d18ebbba9 1766 else if (heaterInfo.HeaterType == 1)
lorded 8:2b0d18ebbba9 1767 {
lorded 8:2b0d18ebbba9 1768 // DebugWrite("Water,");
lorded 8:2b0d18ebbba9 1769 heaterToUpdate->setpoint = 0;
lorded 8:2b0d18ebbba9 1770 }
lorded 8:2b0d18ebbba9 1771 else
lorded 8:2b0d18ebbba9 1772 {
lorded 8:2b0d18ebbba9 1773 // DebugWrite("Unknown,");
lorded 8:2b0d18ebbba9 1774 }
lorded 8:2b0d18ebbba9 1775 if (heaterInfo.AltitudeSensorOnBoard)
lorded 8:2b0d18ebbba9 1776 {
lorded 8:2b0d18ebbba9 1777 // DebugWrite("OB Alt,");
lorded 8:2b0d18ebbba9 1778 heaterToUpdate->OBAltitude = WICED_TRUE;
lorded 8:2b0d18ebbba9 1779 }
lorded 8:2b0d18ebbba9 1780 else
lorded 8:2b0d18ebbba9 1781 {
lorded 8:2b0d18ebbba9 1782 // DebugWrite("NO OB ALT,");
lorded 8:2b0d18ebbba9 1783 heaterToUpdate->OBAltitude = WICED_FALSE;
lorded 8:2b0d18ebbba9 1784 }
lorded 8:2b0d18ebbba9 1785 /*(
lorded 8:2b0d18ebbba9 1786 if (heaterInfo.OperateEasyFan)
lorded 8:2b0d18ebbba9 1787 {
lorded 8:2b0d18ebbba9 1788 DebugWrite("EZFAN,");
lorded 8:2b0d18ebbba9 1789 }
lorded 8:2b0d18ebbba9 1790 else
lorded 8:2b0d18ebbba9 1791 {
lorded 8:2b0d18ebbba9 1792 DebugWrite("NO-EZFAN,");
lorded 8:2b0d18ebbba9 1793 }
lorded 8:2b0d18ebbba9 1794 sprintf(printbuff, "Op:%u,", heaterInfo.OperatingModes);
lorded 8:2b0d18ebbba9 1795 DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1796
lorded 8:2b0d18ebbba9 1797 DebugWrite(",");
lorded 8:2b0d18ebbba9 1798 DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1799 */
lorded 8:2b0d18ebbba9 1800 }
lorded 8:2b0d18ebbba9 1801 else if ((canMsg.id == 0x02C6) || (canMsg.id == 0x02D0))
lorded 8:2b0d18ebbba9 1802 {
lorded 8:2b0d18ebbba9 1803
lorded 8:2b0d18ebbba9 1804 if (canMsg.id == 0x02C6)
lorded 8:2b0d18ebbba9 1805 {
lorded 8:2b0d18ebbba9 1806 if ((heaterState[0].bustype == HEATERTYPECAN) && (heaterState[0].heaternum == 1))
lorded 8:2b0d18ebbba9 1807 {
lorded 8:2b0d18ebbba9 1808 heaterToUpdate = &(heaterState[0]);
lorded 8:2b0d18ebbba9 1809 }
lorded 8:2b0d18ebbba9 1810 else if ((heaterState[1].bustype == HEATERTYPECAN) && (heaterState[1].heaternum == 1))
lorded 8:2b0d18ebbba9 1811 {
lorded 8:2b0d18ebbba9 1812 heaterToUpdate = &(heaterState[1]);
lorded 8:2b0d18ebbba9 1813 }
lorded 8:2b0d18ebbba9 1814 else
lorded 8:2b0d18ebbba9 1815 {
lorded 8:2b0d18ebbba9 1816 DebugWrite("Unable to update 0x02C6\r\n");
lorded 8:2b0d18ebbba9 1817 }
lorded 8:2b0d18ebbba9 1818 }
lorded 8:2b0d18ebbba9 1819 else if (canMsg.id == 0x02D0)
lorded 8:2b0d18ebbba9 1820 {
lorded 8:2b0d18ebbba9 1821 if ((heaterState[0].bustype == HEATERTYPECAN) && (heaterState[0].heaternum == 2))
lorded 8:2b0d18ebbba9 1822 {
lorded 8:2b0d18ebbba9 1823 heaterToUpdate = &(heaterState[0]);
lorded 8:2b0d18ebbba9 1824 }
lorded 8:2b0d18ebbba9 1825 else if ((heaterState[1].bustype == HEATERTYPECAN) && (heaterState[1].heaternum == 2))
lorded 8:2b0d18ebbba9 1826 {
lorded 8:2b0d18ebbba9 1827 heaterToUpdate = &(heaterState[1]);
lorded 8:2b0d18ebbba9 1828 }
lorded 8:2b0d18ebbba9 1829 else
lorded 8:2b0d18ebbba9 1830 {
lorded 8:2b0d18ebbba9 1831 DebugWrite("Unable to update 0x02D0\r\n");
lorded 8:2b0d18ebbba9 1832 }
lorded 8:2b0d18ebbba9 1833 }
lorded 8:2b0d18ebbba9 1834 if (heaterToUpdate == NULL)
lorded 8:2b0d18ebbba9 1835 {
lorded 8:2b0d18ebbba9 1836 DebugWrite("HEATERTOUPDATENULL\r\n");
lorded 8:2b0d18ebbba9 1837 return;
lorded 8:2b0d18ebbba9 1838 }
lorded 8:2b0d18ebbba9 1839 int lowRange = canMsg.data[1];
lorded 8:2b0d18ebbba9 1840 lowRange = lowRange << 8;
lorded 8:2b0d18ebbba9 1841 lowRange += canMsg.data[0];
lorded 8:2b0d18ebbba9 1842
lorded 8:2b0d18ebbba9 1843 int highRange = canMsg.data[3];
lorded 8:2b0d18ebbba9 1844 highRange = highRange << 8;
lorded 8:2b0d18ebbba9 1845 highRange += canMsg.data[2];
lorded 8:2b0d18ebbba9 1846 if (lowRange > highRange)
lorded 8:2b0d18ebbba9 1847 {
lorded 8:2b0d18ebbba9 1848 int temp = lowRange;
lorded 8:2b0d18ebbba9 1849 lowRange = highRange;
lorded 8:2b0d18ebbba9 1850 highRange = temp;
lorded 8:2b0d18ebbba9 1851 }
lorded 8:2b0d18ebbba9 1852
lorded 8:2b0d18ebbba9 1853 //sprintf(printbuff, "Temp range %d - %d heater %d\r\n", lowRange, highRange, heaterToUpdate->heaternum);
lorded 8:2b0d18ebbba9 1854 //DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1855 //printCAN(&canMsg);
lorded 8:2b0d18ebbba9 1856
lorded 8:2b0d18ebbba9 1857 /*
lorded 8:2b0d18ebbba9 1858 * now detected by heater NM command
lorded 8:2b0d18ebbba9 1859 if (heaterToUpdate->heaternum == 2)
lorded 8:2b0d18ebbba9 1860 {
lorded 8:2b0d18ebbba9 1861 // eventually replace with the equivalent of 0x0625
lorded 8:2b0d18ebbba9 1862 if (highRange > 500)
lorded 8:2b0d18ebbba9 1863 {
lorded 8:2b0d18ebbba9 1864 //sprintf(printbuff, "heater %d setpoint > 500\r\n", heaterToUpdate->heaternum);
lorded 8:2b0d18ebbba9 1865 //DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1866 heaterToUpdate->setpoint = 0;
lorded 8:2b0d18ebbba9 1867
lorded 8:2b0d18ebbba9 1868 // fluid heater
lorded 8:2b0d18ebbba9 1869 }
lorded 8:2b0d18ebbba9 1870 else
lorded 8:2b0d18ebbba9 1871 {
lorded 8:2b0d18ebbba9 1872 //
lorded 8:2b0d18ebbba9 1873 if (heaterToUpdate->setpoint == 0)
lorded 8:2b0d18ebbba9 1874 {
lorded 8:2b0d18ebbba9 1875 // sprintf(printbuff, "heater %d setpoint 250", heaterToUpdate->heaternum);
lorded 8:2b0d18ebbba9 1876 // DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1877
lorded 8:2b0d18ebbba9 1878 heaterToUpdate->setpoint = 250; // default value. Ignored mostly in CAN land.
lorded 8:2b0d18ebbba9 1879 }
lorded 8:2b0d18ebbba9 1880 }
lorded 8:2b0d18ebbba9 1881 }
lorded 8:2b0d18ebbba9 1882 */
lorded 8:2b0d18ebbba9 1883 }
lorded 8:2b0d18ebbba9 1884 else if ((canMsg.id == 0x02C4) || (canMsg.id == 0x02CE))
lorded 8:2b0d18ebbba9 1885 {
lorded 8:2b0d18ebbba9 1886 int heater = 1;
lorded 8:2b0d18ebbba9 1887 if (canMsg.id == 0x02CE)
lorded 8:2b0d18ebbba9 1888 {
lorded 8:2b0d18ebbba9 1889 heater = 2;
lorded 8:2b0d18ebbba9 1890 }
lorded 8:2b0d18ebbba9 1891 if ((heaterState[0].bustype == HEATERTYPECAN) && (heaterState[0].heaternum == heater))
lorded 8:2b0d18ebbba9 1892 {
lorded 8:2b0d18ebbba9 1893 heaterToUpdate = &(heaterState[0]);
lorded 8:2b0d18ebbba9 1894 }
lorded 8:2b0d18ebbba9 1895 else if ((heaterState[1].bustype == HEATERTYPECAN) && (heaterState[1].heaternum == heater))
lorded 8:2b0d18ebbba9 1896 {
lorded 8:2b0d18ebbba9 1897 heaterToUpdate = &(heaterState[1]);
lorded 8:2b0d18ebbba9 1898 }
lorded 8:2b0d18ebbba9 1899 else
lorded 8:2b0d18ebbba9 1900 {
lorded 8:2b0d18ebbba9 1901 DebugWrite("Unable to update 0x02C6\r\n");
lorded 8:2b0d18ebbba9 1902 }
lorded 8:2b0d18ebbba9 1903 //DebugWrite("OBK_STATUS_HEATER_1\r\n");
lorded 8:2b0d18ebbba9 1904 OBK_Status_Heater_1_t heaterStatus;
lorded 8:2b0d18ebbba9 1905 Unpack_OBK_Status_Heater_1_mydbc(&heaterStatus, canMsg.data, 0);
lorded 8:2b0d18ebbba9 1906
lorded 8:2b0d18ebbba9 1907 heaterToUpdate->heaterTemp = heaterStatus.HeaterTemperature;
lorded 8:2b0d18ebbba9 1908 //sprintf(printbuff, "OBK_STATUS_HEATER_%d,temp %ld,", heater, heaterStatus.HeaterTemperature);
lorded 8:2b0d18ebbba9 1909 //DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1910 if (heaterStatus.isValid)
lorded 8:2b0d18ebbba9 1911 {
lorded 8:2b0d18ebbba9 1912 DebugWrite("Valid,");
lorded 8:2b0d18ebbba9 1913 }
lorded 8:2b0d18ebbba9 1914 else
lorded 8:2b0d18ebbba9 1915 {
lorded 8:2b0d18ebbba9 1916 DebugWrite("!Valid,");
lorded 8:2b0d18ebbba9 1917 }
lorded 8:2b0d18ebbba9 1918 if (heaterStatus.noHeatModeActive)
lorded 8:2b0d18ebbba9 1919 {
lorded 8:2b0d18ebbba9 1920 DebugWrite("NOHEAT,");
lorded 8:2b0d18ebbba9 1921 heaterToUpdate->heatCallDetected = WICED_FALSE;
lorded 8:2b0d18ebbba9 1922 }
lorded 8:2b0d18ebbba9 1923 if (heaterStatus.standbyHeatingActive)
lorded 8:2b0d18ebbba9 1924 {
lorded 8:2b0d18ebbba9 1925 DebugWrite("STANBYHEAT,");
lorded 8:2b0d18ebbba9 1926 heaterToUpdate->heatCallDetected = WICED_TRUE;
lorded 8:2b0d18ebbba9 1927 }
lorded 8:2b0d18ebbba9 1928 if (heaterStatus.standbyHeatingWithSetpointActive)
lorded 8:2b0d18ebbba9 1929 {
lorded 8:2b0d18ebbba9 1930 DebugWrite("STANDBYHEATSETPOINT,");
lorded 8:2b0d18ebbba9 1931 heaterToUpdate->heatCallDetected = WICED_TRUE;
lorded 8:2b0d18ebbba9 1932 }
lorded 8:2b0d18ebbba9 1933 if (heaterStatus.ResidualHeat > 0)
lorded 8:2b0d18ebbba9 1934 {
lorded 8:2b0d18ebbba9 1935 DebugWrite("RESIDUAL,");
lorded 8:2b0d18ebbba9 1936 }
lorded 8:2b0d18ebbba9 1937 if (heaterStatus.ErrorClass1)
lorded 8:2b0d18ebbba9 1938 {
lorded 8:2b0d18ebbba9 1939 DebugWrite("F1,");
lorded 8:2b0d18ebbba9 1940 }
lorded 8:2b0d18ebbba9 1941 if (heaterStatus.ErrorClass2)
lorded 8:2b0d18ebbba9 1942 {
lorded 8:2b0d18ebbba9 1943 DebugWrite("F2,");
lorded 8:2b0d18ebbba9 1944 }
lorded 8:2b0d18ebbba9 1945 if (heaterStatus.ErrorClass3)
lorded 8:2b0d18ebbba9 1946 {
lorded 8:2b0d18ebbba9 1947 DebugWrite("F3,");
lorded 8:2b0d18ebbba9 1948 }
lorded 8:2b0d18ebbba9 1949 if (heaterStatus.ErrorClass4)
lorded 8:2b0d18ebbba9 1950 {
lorded 8:2b0d18ebbba9 1951 DebugWrite("F4,");
lorded 8:2b0d18ebbba9 1952 }
lorded 8:2b0d18ebbba9 1953 if (heaterStatus.ErrorClass5)
lorded 8:2b0d18ebbba9 1954 {
lorded 8:2b0d18ebbba9 1955 DebugWrite("F5,");
lorded 8:2b0d18ebbba9 1956 }
lorded 8:2b0d18ebbba9 1957 if (heaterStatus.ErrorClass6)
lorded 8:2b0d18ebbba9 1958 {
lorded 8:2b0d18ebbba9 1959 DebugWrite("F6,");
lorded 8:2b0d18ebbba9 1960 }
lorded 8:2b0d18ebbba9 1961 if (heaterStatus.HeatingUpActive)
lorded 8:2b0d18ebbba9 1962 {
lorded 8:2b0d18ebbba9 1963 DebugWrite("HUA,");
lorded 8:2b0d18ebbba9 1964 }
lorded 8:2b0d18ebbba9 1965 if (heaterStatus.SetpointInvalid)
lorded 8:2b0d18ebbba9 1966 {
lorded 8:2b0d18ebbba9 1967 DebugWrite("SetpointInvalid,");
lorded 8:2b0d18ebbba9 1968 }
lorded 8:2b0d18ebbba9 1969 else
lorded 8:2b0d18ebbba9 1970 {
lorded 8:2b0d18ebbba9 1971 DebugWrite("SetpointValid,");
lorded 8:2b0d18ebbba9 1972 }
lorded 8:2b0d18ebbba9 1973 if (heaterStatus.AltitudeModeActive)
lorded 8:2b0d18ebbba9 1974 {
lorded 8:2b0d18ebbba9 1975 DebugWrite("!!**ALT**!!,");
lorded 8:2b0d18ebbba9 1976 }
lorded 8:2b0d18ebbba9 1977 else
lorded 8:2b0d18ebbba9 1978 {
lorded 8:2b0d18ebbba9 1979 DebugWrite("NoALT,");
lorded 8:2b0d18ebbba9 1980 }
lorded 8:2b0d18ebbba9 1981
lorded 8:2b0d18ebbba9 1982 DebugWrite("V");
lorded 8:2b0d18ebbba9 1983 sprintf(printbuff, "%d", heaterStatus.ventilationActive);
lorded 8:2b0d18ebbba9 1984 DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 1985 DebugWrite("\r\n");
lorded 8:2b0d18ebbba9 1986
lorded 8:2b0d18ebbba9 1987 }
lorded 8:2b0d18ebbba9 1988 incoming = can2.read(canMsg);
lorded 8:2b0d18ebbba9 1989 }
lorded 8:2b0d18ebbba9 1990 //incoming = CAN_MessagePending(CAN1, CAN_FIFO1);
lorded 8:2b0d18ebbba9 1991
lorded 8:2b0d18ebbba9 1992 //DebugWrite("doneread\r\n");
lorded 8:2b0d18ebbba9 1993 }
lorded 8:2b0d18ebbba9 1994
lorded 8:2b0d18ebbba9 1995 //#define LISTENONLY
lorded 8:2b0d18ebbba9 1996 /* primary heat task start */
lorded 8:2b0d18ebbba9 1997
lorded 8:2b0d18ebbba9 1998 wiced_bool_t repeatSent = WICED_FALSE;
lorded 8:2b0d18ebbba9 1999
lorded 8:2b0d18ebbba9 2000 void doHeatTaskCAN(struct sHeatVars *s)
lorded 8:2b0d18ebbba9 2001 {
lorded 8:2b0d18ebbba9 2002 if (!(s->bustype == HEATERTYPECAN))
lorded 8:2b0d18ebbba9 2003 {
lorded 8:2b0d18ebbba9 2004 return;
lorded 8:2b0d18ebbba9 2005 }
lorded 8:2b0d18ebbba9 2006
lorded 8:2b0d18ebbba9 2007 char buff[256];
lorded 8:2b0d18ebbba9 2008
lorded 8:2b0d18ebbba9 2009 #ifdef LISTENONLY
lorded 8:2b0d18ebbba9 2010 // sprintf(buff,"heattask %d\r\n", s->tasksequence);
lorded 8:2b0d18ebbba9 2011 // DebugWrite(buff);
lorded 8:2b0d18ebbba9 2012 #endif
lorded 8:2b0d18ebbba9 2013 //DebugWrite("Listen Only\r\n");
lorded 8:2b0d18ebbba9 2014
lorded 8:2b0d18ebbba9 2015 readCAN(s);
lorded 8:2b0d18ebbba9 2016 if ((otherControllerDetected > 0) && s->tasksequence > 1)
lorded 8:2b0d18ebbba9 2017 {
lorded 8:2b0d18ebbba9 2018 s->tasksequence = 0;
lorded 8:2b0d18ebbba9 2019 s->heatOn = HEATCALLOFF;
lorded 8:2b0d18ebbba9 2020 //return;
lorded 8:2b0d18ebbba9 2021 }
lorded 8:2b0d18ebbba9 2022 #ifdef LISTENONLY
lorded 8:2b0d18ebbba9 2023 return;
lorded 8:2b0d18ebbba9 2024 #endif
lorded 8:2b0d18ebbba9 2025 //return; // listen only.
lorded 8:2b0d18ebbba9 2026 idletimer = 60; // disable idle
lorded 8:2b0d18ebbba9 2027 if ((s->heatOn != HEATCALLOFF))
lorded 8:2b0d18ebbba9 2028 {
lorded 8:2b0d18ebbba9 2029 idletimer = 60;
lorded 8:2b0d18ebbba9 2030 }
lorded 8:2b0d18ebbba9 2031 if ((idletimer <= 0) && (s->heatOn == HEATCALLOFF))
lorded 8:2b0d18ebbba9 2032 {
lorded 8:2b0d18ebbba9 2033 s->tasksequence = -1;
lorded 8:2b0d18ebbba9 2034 DebugWrite("*idle*\r\n");
lorded 8:2b0d18ebbba9 2035 return;
lorded 8:2b0d18ebbba9 2036 }
lorded 8:2b0d18ebbba9 2037 if (s->initTimer > 0)
lorded 8:2b0d18ebbba9 2038 {
lorded 8:2b0d18ebbba9 2039 s->tasksequence = 0;
lorded 8:2b0d18ebbba9 2040 }
lorded 8:2b0d18ebbba9 2041 else if (s->primeFuelPump == WICED_TRUE)
lorded 8:2b0d18ebbba9 2042 {
lorded 8:2b0d18ebbba9 2043 s->tasksequence = 2;
lorded 8:2b0d18ebbba9 2044 }
lorded 8:2b0d18ebbba9 2045 else if (s->reset_fault_codes == WICED_TRUE)
lorded 8:2b0d18ebbba9 2046 {
lorded 8:2b0d18ebbba9 2047 s->tasksequence = 2;
lorded 8:2b0d18ebbba9 2048 }
lorded 8:2b0d18ebbba9 2049 switch (s->tasksequence++)
lorded 8:2b0d18ebbba9 2050 {
lorded 8:2b0d18ebbba9 2051 case 4:
lorded 8:2b0d18ebbba9 2052 //60F: 0F 11 C9 22 00 20 60 00
lorded 8:2b0d18ebbba9 2053 if ((s->heaterDetected > 0) && s->heaternum == 1) // only send if heater is detected.
lorded 8:2b0d18ebbba9 2054 {
lorded 8:2b0d18ebbba9 2055 if (!repeatSent)
lorded 8:2b0d18ebbba9 2056 {
lorded 8:2b0d18ebbba9 2057 repeatSent = WICED_TRUE;
lorded 8:2b0d18ebbba9 2058 sendRepeatMode(s);
lorded 8:2b0d18ebbba9 2059 break;
lorded 8:2b0d18ebbba9 2060 }
lorded 8:2b0d18ebbba9 2061 }
lorded 8:2b0d18ebbba9 2062 //no break
lorded 8:2b0d18ebbba9 2063 case 0:
lorded 8:2b0d18ebbba9 2064 case 8:
lorded 8:2b0d18ebbba9 2065 case 12:
lorded 8:2b0d18ebbba9 2066 printf("SendWake\r\n");
lorded 8:2b0d18ebbba9 2067 sendWakeCommand(s);
lorded 8:2b0d18ebbba9 2068
lorded 8:2b0d18ebbba9 2069 break;
lorded 8:2b0d18ebbba9 2070 case 1:
lorded 8:2b0d18ebbba9 2071 case 5:
lorded 8:2b0d18ebbba9 2072 case 9:
lorded 8:2b0d18ebbba9 2073 case 13:
lorded 8:2b0d18ebbba9 2074 sendGetBattery(s, buff);
lorded 8:2b0d18ebbba9 2075 sendAltitudeMode(s);
lorded 8:2b0d18ebbba9 2076 if ((s->heatOn == HEATCALLINIT) || (s->heatOn == HEATCALLON))
lorded 8:2b0d18ebbba9 2077 {
lorded 8:2b0d18ebbba9 2078
lorded 8:2b0d18ebbba9 2079 // a cyclic heat call is always required.
lorded 8:2b0d18ebbba9 2080 if (s->setpoint > 0)
lorded 8:2b0d18ebbba9 2081 {
lorded 8:2b0d18ebbba9 2082 if (s->heaterSetpointChange != s->setpoint)
lorded 8:2b0d18ebbba9 2083 {
lorded 8:2b0d18ebbba9 2084 s->setpoint = s->heaterSetpointChange;
lorded 8:2b0d18ebbba9 2085 }
lorded 8:2b0d18ebbba9 2086 sendHeatOnCommandSetpoint(s);
lorded 8:2b0d18ebbba9 2087 }
lorded 8:2b0d18ebbba9 2088 else
lorded 8:2b0d18ebbba9 2089 {
lorded 8:2b0d18ebbba9 2090 sendHeatOnCommand(s);
lorded 8:2b0d18ebbba9 2091 }
lorded 8:2b0d18ebbba9 2092
lorded 8:2b0d18ebbba9 2093 if (s->heatOn == HEATCALLINIT)
lorded 8:2b0d18ebbba9 2094 {
lorded 8:2b0d18ebbba9 2095 s->heatOn = HEATCALLON;
lorded 8:2b0d18ebbba9 2096 }
lorded 8:2b0d18ebbba9 2097 }
lorded 8:2b0d18ebbba9 2098 else if (s->heatOn == HEATCALLOFF)
lorded 8:2b0d18ebbba9 2099 {
lorded 8:2b0d18ebbba9 2100 sendHeatOffCommand(s);
lorded 8:2b0d18ebbba9 2101 // double-if just for clarity
lorded 8:2b0d18ebbba9 2102 if ((s->OBAltitude == WICED_FALSE) && (s->heatCallDetected))
lorded 8:2b0d18ebbba9 2103 {
lorded 8:2b0d18ebbba9 2104 if ((s->altitudeMode == WICED_TRUE) || (s->internalAltitude > 0))
lorded 8:2b0d18ebbba9 2105 {
lorded 8:2b0d18ebbba9 2106 // send ONLY if heater is in "ON" state.
lorded 8:2b0d18ebbba9 2107 char mysteryCommand[8] =
lorded 8:2b0d18ebbba9 2108 { 0x0F, 0x00, 0xC9, 0x22, 0x00, 0x00, 0x00, 0x00 };
lorded 8:2b0d18ebbba9 2109 sendCANCommand(0x060D, mysteryCommand, 8);
lorded 8:2b0d18ebbba9 2110 }
lorded 8:2b0d18ebbba9 2111
lorded 8:2b0d18ebbba9 2112 }
lorded 8:2b0d18ebbba9 2113 }
lorded 8:2b0d18ebbba9 2114 break;
lorded 8:2b0d18ebbba9 2115 case 2:
lorded 8:2b0d18ebbba9 2116 case 6:
lorded 8:2b0d18ebbba9 2117 case 10:
lorded 8:2b0d18ebbba9 2118 case 14:
lorded 8:2b0d18ebbba9 2119 if ((s->heatOn == HEATCALLOFF) && (s->primeFuelPump == WICED_TRUE))
lorded 8:2b0d18ebbba9 2120 {
lorded 8:2b0d18ebbba9 2121 DebugWrite("IN prime call\r\n");
lorded 8:2b0d18ebbba9 2122 s->primeFuelPump = WICED_FALSE; // no prime allowed if heat on
lorded 8:2b0d18ebbba9 2123 doPrimeSequence(s);
lorded 8:2b0d18ebbba9 2124 }
lorded 8:2b0d18ebbba9 2125 else if (s->primeFuelPump == WICED_TRUE)
lorded 8:2b0d18ebbba9 2126 {
lorded 8:2b0d18ebbba9 2127 DebugWrite("IN prime call FORCED FALSE\r\n");
lorded 8:2b0d18ebbba9 2128 s->primeFuelPump = WICED_FALSE; // no prime allowed if heat on
lorded 8:2b0d18ebbba9 2129 }
lorded 8:2b0d18ebbba9 2130 if (s->reset_fault_codes == WICED_TRUE)
lorded 8:2b0d18ebbba9 2131 {
lorded 8:2b0d18ebbba9 2132 // doPrimeSequence(s);
lorded 8:2b0d18ebbba9 2133 // s->reset_fault_codes = WICED_FALSE;
lorded 8:2b0d18ebbba9 2134
lorded 8:2b0d18ebbba9 2135 printf("RESET faults\r\n");
lorded 8:2b0d18ebbba9 2136 s->reset_fault_codes = WICED_FALSE;
lorded 8:2b0d18ebbba9 2137 doResetSequence(s);
lorded 8:2b0d18ebbba9 2138 // reset fault codes
lorded 8:2b0d18ebbba9 2139 printf("****sendGetFaults***\r\n");
lorded 8:2b0d18ebbba9 2140 sendGetFault(s, buff);
lorded 8:2b0d18ebbba9 2141 printf("***doneGetFaults***\r\n");
lorded 8:2b0d18ebbba9 2142 }
lorded 8:2b0d18ebbba9 2143 else
lorded 8:2b0d18ebbba9 2144 {
lorded 8:2b0d18ebbba9 2145 printf("****sendGetFaults***\r\n");
lorded 8:2b0d18ebbba9 2146 sendGetFault(s, buff);
lorded 8:2b0d18ebbba9 2147 if ((s->errorHistory[0] == 0) || (s->errorHistory[0] == 255))
lorded 8:2b0d18ebbba9 2148 {
lorded 8:2b0d18ebbba9 2149 s->reset_fault_codes = WICED_FALSE;
lorded 8:2b0d18ebbba9 2150 }
lorded 8:2b0d18ebbba9 2151 printf("***doneGetFaults***\r\n");
lorded 8:2b0d18ebbba9 2152 }
lorded 8:2b0d18ebbba9 2153 // check faults
lorded 8:2b0d18ebbba9 2154 break;
lorded 8:2b0d18ebbba9 2155 case 3:
lorded 8:2b0d18ebbba9 2156 sendGetTemperatures(s, buff);
lorded 8:2b0d18ebbba9 2157 break;
lorded 8:2b0d18ebbba9 2158 case 7:
lorded 8:2b0d18ebbba9 2159 sendGetRuntime(s, buff);
lorded 8:2b0d18ebbba9 2160 break;
lorded 8:2b0d18ebbba9 2161 case 11:
lorded 8:2b0d18ebbba9 2162 sendGetBattery(s, buff);
lorded 8:2b0d18ebbba9 2163 break;
lorded 8:2b0d18ebbba9 2164 //case 4:
lorded 8:2b0d18ebbba9 2165 case 15:
lorded 8:2b0d18ebbba9 2166 sendGetAltitude(s, buff);
lorded 8:2b0d18ebbba9 2167 break;
lorded 8:2b0d18ebbba9 2168 default:
lorded 8:2b0d18ebbba9 2169 s->tasksequence = 0;
lorded 8:2b0d18ebbba9 2170 break;
lorded 8:2b0d18ebbba9 2171 }
lorded 8:2b0d18ebbba9 2172 printf("/done\r\n");
lorded 8:2b0d18ebbba9 2173 // start with "Wake" message
lorded 8:2b0d18ebbba9 2174
lorded 8:2b0d18ebbba9 2175 return;
lorded 8:2b0d18ebbba9 2176 }
lorded 8:2b0d18ebbba9 2177
lorded 8:2b0d18ebbba9 2178
lorded 8:2b0d18ebbba9 2179
lorded 8:2b0d18ebbba9 2180 // imported from picus
lorded 8:2b0d18ebbba9 2181
lorded 8:2b0d18ebbba9 2182 void doHeatLogicTask(struct sHeatVars* s)
lorded 8:2b0d18ebbba9 2183 {
lorded 8:2b0d18ebbba9 2184 // error flag valid after LINPulse 0.
lorded 8:2b0d18ebbba9 2185 if (s->errorChangeFlag == 1)
lorded 8:2b0d18ebbba9 2186 {
lorded 8:2b0d18ebbba9 2187 s->errorChangeFlag = 0;
lorded 8:2b0d18ebbba9 2188 //printf("Error Change %d \r\n",currentError);
lorded 8:2b0d18ebbba9 2189
lorded 8:2b0d18ebbba9 2190 //printf("History %d,%d,%d,%d,%d\r\n",errorHistory[0],errorHistory[1],errorHistory[2],errorHistory[3],errorHistory[4]);
lorded 8:2b0d18ebbba9 2191
lorded 8:2b0d18ebbba9 2192 // reset timer
lorded 8:2b0d18ebbba9 2193 resetTimer(s);
lorded 8:2b0d18ebbba9 2194 s->reportflag = 1;
lorded 8:2b0d18ebbba9 2195 //UARTWrite(1,"Timer reset\r\n");
lorded 8:2b0d18ebbba9 2196 }
lorded 8:2b0d18ebbba9 2197 //sprintf(printbuff, "tickcount: %d, heaton: %d, heattime: %d\n", s->tickcount, s->heatOn, s->heattime);
lorded 8:2b0d18ebbba9 2198 //DebugWrite(printbuff);
lorded 8:2b0d18ebbba9 2199 // if the error is stable for 15 seconds, report.
lorded 8:2b0d18ebbba9 2200 if (s->reportflag == 1 && s->tickcount > 15000 && s->heatOn > 0 && (s->heatcontrolstate != IDLE) && s->resettick == 0)
lorded 8:2b0d18ebbba9 2201 {
lorded 8:2b0d18ebbba9 2202 // stable for 15 seconds, do report
lorded 8:2b0d18ebbba9 2203 if (s->currentError == 0 && s->heatOn > 0)
lorded 8:2b0d18ebbba9 2204 {
lorded 8:2b0d18ebbba9 2205 s->reportflag = 0;
lorded 8:2b0d18ebbba9 2206 }
lorded 8:2b0d18ebbba9 2207 else if (s->currentError != 0xFF)
lorded 8:2b0d18ebbba9 2208 {
lorded 8:2b0d18ebbba9 2209 //printf("Error (heatOn & currentError !=0xFF) \r\n");
lorded 8:2b0d18ebbba9 2210 s->reportflag = 0;
lorded 8:2b0d18ebbba9 2211 s->heatOn = HEATCALLOFF;
lorded 8:2b0d18ebbba9 2212 // disabled retry function per neil at this point.
lorded 8:2b0d18ebbba9 2213 }
lorded 8:2b0d18ebbba9 2214 else
lorded 8:2b0d18ebbba9 2215 {
lorded 8:2b0d18ebbba9 2216 //printf( "Error FF: No communication. Allow heat to continue, but report\r\n");
lorded 8:2b0d18ebbba9 2217 // -OR-
lorded 8:2b0d18ebbba9 2218 // Retry algorighm on LIN pulse
lorded 8:2b0d18ebbba9 2219 s->reportflag = 0;
lorded 8:2b0d18ebbba9 2220 }
lorded 8:2b0d18ebbba9 2221 }
lorded 8:2b0d18ebbba9 2222 else
lorded 8:2b0d18ebbba9 2223 {
lorded 8:2b0d18ebbba9 2224 //sprintf(printbuff,"%d\r\n",tickcount);
lorded 8:2b0d18ebbba9 2225 //UARTWrite(1,printbuff);
lorded 8:2b0d18ebbba9 2226 }
lorded 8:2b0d18ebbba9 2227 if (s->heatOn == HEATCALLON && (s->heattime == 0 || s->heattime > 86400))
lorded 8:2b0d18ebbba9 2228 {
lorded 8:2b0d18ebbba9 2229 //printf("Heat off due to time expiry.");
lorded 8:2b0d18ebbba9 2230 // no final report.
lorded 8:2b0d18ebbba9 2231
lorded 8:2b0d18ebbba9 2232 if (s->heattime > 0)
lorded 8:2b0d18ebbba9 2233 {
lorded 8:2b0d18ebbba9 2234 s->heatOn = HEATCALLLONGRUN;
lorded 8:2b0d18ebbba9 2235 s->heatresettime = RESETHEATTIME
lorded 8:2b0d18ebbba9 2236 ; // reset heat timer
lorded 8:2b0d18ebbba9 2237 }
lorded 8:2b0d18ebbba9 2238 else
lorded 8:2b0d18ebbba9 2239 {
lorded 8:2b0d18ebbba9 2240 s->heatOn = HEATCALLOFF;
lorded 8:2b0d18ebbba9 2241 }
lorded 8:2b0d18ebbba9 2242
lorded 8:2b0d18ebbba9 2243 s->reportflag = 0;
lorded 8:2b0d18ebbba9 2244 }
lorded 8:2b0d18ebbba9 2245 }
lorded 8:2b0d18ebbba9 2246
lorded 8:2b0d18ebbba9 2247 //=========================================================
lorded 8:2b0d18ebbba9 2248 unsigned char fromHexAscii(char ascii)
lorded 8:2b0d18ebbba9 2249 {
lorded 8:2b0d18ebbba9 2250 if (ascii >= '0' && ascii <= '9')
lorded 8:2b0d18ebbba9 2251 {
lorded 8:2b0d18ebbba9 2252 return ascii - '0';
lorded 8:2b0d18ebbba9 2253 }
lorded 8:2b0d18ebbba9 2254 else if (ascii >= 'A' && ascii <= 'F')
lorded 8:2b0d18ebbba9 2255 {
lorded 8:2b0d18ebbba9 2256 return ascii - 'A' + 10;
lorded 8:2b0d18ebbba9 2257 }
lorded 8:2b0d18ebbba9 2258 else
lorded 8:2b0d18ebbba9 2259 {
lorded 8:2b0d18ebbba9 2260 return 255;
lorded 8:2b0d18ebbba9 2261 }
lorded 8:2b0d18ebbba9 2262 }
lorded 8:2b0d18ebbba9 2263
lorded 8:2b0d18ebbba9 2264