Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed mbed-STM32F103C8T6
main.cpp@11:b571de4666c9, 2020-07-29 (annotated)
- Committer:
- lorded
- Date:
- Wed Jul 29 16:48:19 2020 +0000
- Revision:
- 11:b571de4666c9
- Parent:
- 10:a82e51837e2b
Espar
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pangsk | 0:908be729d27c | 1 | /* |
pangsk | 0:908be729d27c | 2 | |
pangsk | 6:41a4ad385daa | 3 | mbed Can-Bus ECU simulator |
pangsk | 0:908be729d27c | 4 | |
pangsk | 6:41a4ad385daa | 5 | v1.0 December 2014 |
pangsk | 0:908be729d27c | 6 | |
pangsk | 0:908be729d27c | 7 | ******************************************************************************** |
pangsk | 0:908be729d27c | 8 | |
pangsk | 0:908be729d27c | 9 | WARNING: Use at your own risk, sadly this software comes with no guarantees. |
pangsk | 0:908be729d27c | 10 | This software is provided 'free' and in good faith, but the author does not |
pangsk | 0:908be729d27c | 11 | accept liability for any damage arising from its use. |
pangsk | 0:908be729d27c | 12 | |
pangsk | 0:908be729d27c | 13 | ******************************************************************************** |
pangsk | 0:908be729d27c | 14 | |
pangsk | 0:908be729d27c | 15 | */ |
RogerJKelly | 7:467e350d1a10 | 16 | //#include "MapleMini.h" |
RogerJKelly | 7:467e350d1a10 | 17 | #include "stm32f103c8t6.h" |
pangsk | 0:908be729d27c | 18 | #include "mbed.h" |
lorded | 9:6126b83608be | 19 | //#include "ecu_simulator.h" |
pangsk | 0:908be729d27c | 20 | #include "globals.h" |
lorded | 8:2b0d18ebbba9 | 21 | #include "heatcontrol.h" |
lorded | 10:a82e51837e2b | 22 | #include "spl0601.h" |
lorded | 10:a82e51837e2b | 23 | #include "i2c_base.h" |
lorded | 10:a82e51837e2b | 24 | extern I2C* spl_i2c; |
RogerJKelly | 7:467e350d1a10 | 25 | // pinout for Maple Mini |
RogerJKelly | 7:467e350d1a10 | 26 | DigitalIn click(PA_1); // Button inputs |
RogerJKelly | 7:467e350d1a10 | 27 | // pinout for lpc1768 |
RogerJKelly | 7:467e350d1a10 | 28 | //DigitalIn click(p21); // Joystick inputs |
RogerJKelly | 7:467e350d1a10 | 29 | //DigitalIn right(p22); |
RogerJKelly | 7:467e350d1a10 | 30 | //DigitalIn down(p23); |
RogerJKelly | 7:467e350d1a10 | 31 | //DigitalIn left(p24); |
RogerJKelly | 7:467e350d1a10 | 32 | //DigitalIn up(p25); |
pangsk | 3:05bb8f0bd7a4 | 33 | |
lorded | 9:6126b83608be | 34 | volatile unsigned long lifetimer = 0; |
lorded | 9:6126b83608be | 35 | volatile int secondFlag = 0; |
pangsk | 6:41a4ad385daa | 36 | |
RogerJKelly | 7:467e350d1a10 | 37 | Ticker timer; |
lorded | 9:6126b83608be | 38 | Ticker quartersecond_timed_event; |
lorded | 11:b571de4666c9 | 39 | Ticker hundredms_timed_event; |
lorded | 9:6126b83608be | 40 | Ticker onesecond_timed_event; |
RogerJKelly | 7:467e350d1a10 | 41 | |
lorded | 9:6126b83608be | 42 | void attime() |
RogerJKelly | 7:467e350d1a10 | 43 | { |
RogerJKelly | 7:467e350d1a10 | 44 | //second_tick = true; |
RogerJKelly | 7:467e350d1a10 | 45 | //myled = !myled; |
lorded | 11:b571de4666c9 | 46 | led1 = 0; // keep it off. Flicker on with CAN |
RogerJKelly | 7:467e350d1a10 | 47 | } |
pangsk | 0:908be729d27c | 48 | |
pangsk | 6:41a4ad385daa | 49 | // Menu defines |
pangsk | 0:908be729d27c | 50 | |
RogerJKelly | 7:467e350d1a10 | 51 | //unsigned char menu_state; |
RogerJKelly | 7:467e350d1a10 | 52 | //unsigned char canspeed; |
pangsk | 6:41a4ad385daa | 53 | |
lorded | 8:2b0d18ebbba9 | 54 | // external variables |
lorded | 8:2b0d18ebbba9 | 55 | volatile unsigned char idletimer; |
lorded | 9:6126b83608be | 56 | extern char otherControllerDetected; |
lorded | 10:a82e51837e2b | 57 | wiced_bool_t hasOnboardAltimeter = WICED_FALSE; |
lorded | 9:6126b83608be | 58 | |
lorded | 8:2b0d18ebbba9 | 59 | char printbuff[256]; |
lorded | 8:2b0d18ebbba9 | 60 | |
lorded | 9:6126b83608be | 61 | void DebugWrite(const char* str) |
lorded | 9:6126b83608be | 62 | { |
lorded | 9:6126b83608be | 63 | pc.printf(str); |
lorded | 8:2b0d18ebbba9 | 64 | } |
lorded | 9:6126b83608be | 65 | void resetTimer(struct sHeatVars *s) |
lorded | 9:6126b83608be | 66 | { |
lorded | 9:6126b83608be | 67 | s->resettick = 1; |
lorded | 9:6126b83608be | 68 | //TODO: This. |
lorded | 9:6126b83608be | 69 | } |
lorded | 9:6126b83608be | 70 | void resetTimerAsync(struct sHeatVars *s) |
lorded | 9:6126b83608be | 71 | { |
lorded | 9:6126b83608be | 72 | s->resettick = 1; |
lorded | 8:2b0d18ebbba9 | 73 | //TODO: This. |
lorded | 8:2b0d18ebbba9 | 74 | } |
lorded | 9:6126b83608be | 75 | void one_second_tick() |
lorded | 9:6126b83608be | 76 | { |
lorded | 9:6126b83608be | 77 | int i; |
lorded | 9:6126b83608be | 78 | lifetimer++; // used for wifi reset test. |
lorded | 9:6126b83608be | 79 | //wiced_rtos_lock_mutex( &xively_data.mutex ); |
lorded | 9:6126b83608be | 80 | |
lorded | 9:6126b83608be | 81 | for (i = 0; i < HEATERSTATECOUNT; i++) { |
lorded | 9:6126b83608be | 82 | if (heaterState[i].heattime > 0 && heaterState[i].heattime < 59995) { // count down the heat timer |
lorded | 9:6126b83608be | 83 | // tick,tick... |
lorded | 9:6126b83608be | 84 | heaterState[i].heattime--; |
lorded | 9:6126b83608be | 85 | } |
lorded | 9:6126b83608be | 86 | if (heaterState[i].heatresettime > 0) { |
lorded | 9:6126b83608be | 87 | heaterState[i].heatresettime--; |
lorded | 9:6126b83608be | 88 | } |
lorded | 9:6126b83608be | 89 | if (heaterState[i].preheattime > 0) { |
lorded | 9:6126b83608be | 90 | heaterState[i].preheattime--; |
lorded | 9:6126b83608be | 91 | } |
lorded | 9:6126b83608be | 92 | if (heaterState[i].heaterDetected > 0) { |
lorded | 9:6126b83608be | 93 | heaterState[i].heaterDetected--; |
lorded | 9:6126b83608be | 94 | } |
lorded | 9:6126b83608be | 95 | } |
lorded | 9:6126b83608be | 96 | |
lorded | 9:6126b83608be | 97 | if (idletimer > 0) { |
lorded | 9:6126b83608be | 98 | idletimer--; |
lorded | 9:6126b83608be | 99 | } |
lorded | 9:6126b83608be | 100 | if (otherControllerDetected > 0) { |
lorded | 9:6126b83608be | 101 | otherControllerDetected--; |
lorded | 9:6126b83608be | 102 | } |
lorded | 9:6126b83608be | 103 | secondFlag = 1; |
lorded | 9:6126b83608be | 104 | |
lorded | 8:2b0d18ebbba9 | 105 | } |
lorded | 9:6126b83608be | 106 | |
lorded | 9:6126b83608be | 107 | void quarter_second_tick() |
lorded | 9:6126b83608be | 108 | { |
lorded | 9:6126b83608be | 109 | int i; |
lorded | 9:6126b83608be | 110 | for (i = 0; i < HEATERSTATECOUNT; i++) { |
lorded | 9:6126b83608be | 111 | heaterState[i].tickcount += 250; |
lorded | 9:6126b83608be | 112 | if (heaterState[i].resettick == 1) { |
lorded | 9:6126b83608be | 113 | heaterState[i].tickcount = 0; |
lorded | 9:6126b83608be | 114 | heaterState[i].resettick = 0; |
lorded | 9:6126b83608be | 115 | } |
lorded | 9:6126b83608be | 116 | } |
lorded | 11:b571de4666c9 | 117 | } |
lorded | 11:b571de4666c9 | 118 | void hundredms_tick() |
lorded | 11:b571de4666c9 | 119 | { |
lorded | 11:b571de4666c9 | 120 | led1 = 0;// off |
lorded | 9:6126b83608be | 121 | } |
lorded | 9:6126b83608be | 122 | |
lorded | 9:6126b83608be | 123 | int main() |
pangsk | 6:41a4ad385daa | 124 | { |
RogerJKelly | 7:467e350d1a10 | 125 | confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock) |
pangsk | 3:05bb8f0bd7a4 | 126 | pc.baud(115200); |
lorded | 9:6126b83608be | 127 | |
lorded | 9:6126b83608be | 128 | //Enable Pullup |
pangsk | 3:05bb8f0bd7a4 | 129 | click.mode(PullUp); |
pangsk | 6:41a4ad385daa | 130 | |
lorded | 9:6126b83608be | 131 | |
lorded | 9:6126b83608be | 132 | pc.printf("\n\nRIXEN Simulator v1.1 \r\n"); |
pangsk | 6:41a4ad385daa | 133 | led1 = 1; |
lorded | 9:6126b83608be | 134 | |
pangsk | 6:41a4ad385daa | 135 | wait(1); |
lorded | 11:b571de4666c9 | 136 | led1 = 0; |
lorded | 10:a82e51837e2b | 137 | spl_i2c = new I2C(SDA, SCL); |
RogerJKelly | 7:467e350d1a10 | 138 | //canspeed = CAN500; |
lorded | 9:6126b83608be | 139 | // ecu.dtc = false; |
lorded | 9:6126b83608be | 140 | // ecu.active_fault = false; |
lorded | 9:6126b83608be | 141 | |
lorded | 9:6126b83608be | 142 | // sim.canspeed(CANSPEED_500); |
lorded | 9:6126b83608be | 143 | |
pangsk | 6:41a4ad385daa | 144 | wait(0.2); |
pangsk | 6:41a4ad385daa | 145 | led1 = 1; |
lorded | 9:6126b83608be | 146 | |
lorded | 9:6126b83608be | 147 | //timer.attach(&attime, 1); |
lorded | 9:6126b83608be | 148 | quartersecond_timed_event.attach(&quarter_second_tick, 0.250); |
lorded | 11:b571de4666c9 | 149 | hundredms_timed_event.attach(&hundredms_tick, 0.1); |
lorded | 9:6126b83608be | 150 | onesecond_timed_event.attach(&one_second_tick, 1.0); |
lorded | 9:6126b83608be | 151 | |
lorded | 9:6126b83608be | 152 | |
lorded | 8:2b0d18ebbba9 | 153 | initHeaterState(&heaterState[0]); |
lorded | 8:2b0d18ebbba9 | 154 | |
lorded | 8:2b0d18ebbba9 | 155 | heaterState[0].bustype = HEATERTYPECAN; |
lorded | 8:2b0d18ebbba9 | 156 | heaterState[0].heaternum = 1; |
lorded | 9:6126b83608be | 157 | |
lorded | 8:2b0d18ebbba9 | 158 | |
lorded | 9:6126b83608be | 159 | InitCAN(); |
lorded | 9:6126b83608be | 160 | |
lorded | 10:a82e51837e2b | 161 | double presComp; |
lorded | 9:6126b83608be | 162 | while(1) { // Main CAN loop |
lorded | 9:6126b83608be | 163 | |
lorded | 9:6126b83608be | 164 | for (int i = 0; i < HEATERSTATECOUNT; i++) { |
lorded | 10:a82e51837e2b | 165 | // wiced_update_system_monitor(&main_thread_monitor, 10 * 1000); |
lorded | 8:2b0d18ebbba9 | 166 | doHeatTaskCAN(&heaterState[i]); |
lorded | 10:a82e51837e2b | 167 | // wiced_update_system_monitor(&main_thread_monitor, 10 * 1000); |
lorded | 8:2b0d18ebbba9 | 168 | doHeatLogicTask(&heaterState[i]); |
lorded | 9:6126b83608be | 169 | if (i < HEATERSTATECOUNT) { |
lorded | 8:2b0d18ebbba9 | 170 | wait_ms(50); |
lorded | 9:6126b83608be | 171 | } else { |
lorded | 8:2b0d18ebbba9 | 172 | //wiced_rtos_delay_milliseconds(50); |
lorded | 8:2b0d18ebbba9 | 173 | } |
pangsk | 6:41a4ad385daa | 174 | } |
lorded | 9:6126b83608be | 175 | if (!click) { |
lorded | 9:6126b83608be | 176 | if (heaterState[0].heatOn == HEATCALLOFF) { |
lorded | 9:6126b83608be | 177 | set_heat_con(&heaterState[0], HEATCALLINIT); |
lorded | 9:6126b83608be | 178 | } |
lorded | 9:6126b83608be | 179 | } else { |
lorded | 9:6126b83608be | 180 | if (heaterState[0].heatOn != HEATCALLOFF) { |
lorded | 9:6126b83608be | 181 | set_heat_con(&heaterState[0], HEATCALLOFF); |
lorded | 9:6126b83608be | 182 | } |
lorded | 9:6126b83608be | 183 | } |
lorded | 10:a82e51837e2b | 184 | |
lorded | 9:6126b83608be | 185 | if (secondFlag > 0) { |
lorded | 9:6126b83608be | 186 | secondFlag = 0; |
lorded | 10:a82e51837e2b | 187 | |
lorded | 10:a82e51837e2b | 188 | DebugWrite("About to clean I2C\r\n"); |
lorded | 10:a82e51837e2b | 189 | cleanI2CLines(spl_i2c, SDA, SCL); |
lorded | 10:a82e51837e2b | 190 | |
lorded | 10:a82e51837e2b | 191 | DebugWrite("Done clean I2C, get pressure\r\n"); |
lorded | 10:a82e51837e2b | 192 | |
lorded | 10:a82e51837e2b | 193 | hasOnboardAltimeter = getPressure(&presComp); |
lorded | 10:a82e51837e2b | 194 | if (hasOnboardAltimeter) { |
lorded | 10:a82e51837e2b | 195 | int hpa = presComp / 100; // convert to HPA |
lorded | 10:a82e51837e2b | 196 | sprintf(printbuff, "Pressure %0.5lf vs %d\r\n", presComp, hpa); |
lorded | 10:a82e51837e2b | 197 | DebugWrite(printbuff); |
lorded | 10:a82e51837e2b | 198 | |
lorded | 10:a82e51837e2b | 199 | //sprintf(printbuff, "Pressure is %.1f (%d)\r\n", presComp, hpa); |
lorded | 10:a82e51837e2b | 200 | //DebugWrite(printbuff); |
lorded | 10:a82e51837e2b | 201 | if (hpa < 600) { |
lorded | 10:a82e51837e2b | 202 | hpa = 680; |
lorded | 10:a82e51837e2b | 203 | } |
lorded | 10:a82e51837e2b | 204 | if (hpa > 1105) { |
lorded | 10:a82e51837e2b | 205 | hpa = 680; |
lorded | 10:a82e51837e2b | 206 | } |
lorded | 10:a82e51837e2b | 207 | heaterState[0].rawAltitude = presComp; |
lorded | 10:a82e51837e2b | 208 | heaterState[0].internalAltitude = hpa; |
lorded | 10:a82e51837e2b | 209 | } else { |
lorded | 10:a82e51837e2b | 210 | DebugWrite("No altimeter\r\n"); |
lorded | 10:a82e51837e2b | 211 | } |
lorded | 9:6126b83608be | 212 | if (heaterState[0].initTimer > 0) { |
lorded | 9:6126b83608be | 213 | heaterState[0].initTimer--; |
lorded | 9:6126b83608be | 214 | } |
lorded | 9:6126b83608be | 215 | // DebugWrite("Doing re-init of I2c\r\n"); |
lorded | 9:6126b83608be | 216 | |
lorded | 9:6126b83608be | 217 | // check I2C |
lorded | 9:6126b83608be | 218 | // DeInit_SC16IS740(); |
lorded | 9:6126b83608be | 219 | // DeInit_SPL0601(); |
lorded | 9:6126b83608be | 220 | // cleanI2CLines(); |
lorded | 9:6126b83608be | 221 | // Init_SC16IS740(2); |
lorded | 9:6126b83608be | 222 | // Init_SPL0601(); |
lorded | 9:6126b83608be | 223 | } |
pangsk | 6:41a4ad385daa | 224 | } |
pangsk | 6:41a4ad385daa | 225 | } |