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.
main.cpp@0:c0bb943bc2a7, 2012-04-09 (annotated)
- Committer:
- priusfan
- Date:
- Mon Apr 09 15:27:55 2012 +0000
- Revision:
- 0:c0bb943bc2a7
todo: find a working BT module...
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| priusfan | 0:c0bb943bc2a7 | 1 | /* this is a beta release for a can sequencer for prius gen3 on mbed |
| priusfan | 0:c0bb943bc2a7 | 2 | it is based on a work from Moon Light on mbed.org for the sequencer |
| priusfan | 0:c0bb943bc2a7 | 3 | and from Yoshi for the filtering |
| priusfan | 0:c0bb943bc2a7 | 4 | |
| priusfan | 0:c0bb943bc2a7 | 5 | |
| priusfan | 0:c0bb943bc2a7 | 6 | |
| priusfan | 0:c0bb943bc2a7 | 7 | harware: |
| priusfan | 0:c0bb943bc2a7 | 8 | mbed LPC1768 |
| priusfan | 0:c0bb943bc2a7 | 9 | Can transceiver mcp2551 on pin 30 & 29 |
| priusfan | 0:c0bb943bc2a7 | 10 | BT module BlueToothBee on pin 28 & 27 |
| priusfan | 0:c0bb943bc2a7 | 11 | |
| priusfan | 0:c0bb943bc2a7 | 12 | main mods: |
| priusfan | 0:c0bb943bc2a7 | 13 | remove sd card (not used yet) |
| priusfan | 0:c0bb943bc2a7 | 14 | change structure for table.cpp: use cod1 & cod2 instead of code |
| priusfan | 0:c0bb943bc2a7 | 15 | change content in this table to follow only usefull request (known content) |
| priusfan | 0:c0bb943bc2a7 | 16 | install filters |
| priusfan | 0:c0bb943bc2a7 | 17 | |
| priusfan | 0:c0bb943bc2a7 | 18 | mod 2/04/2012: change detection for last frame in case of multiframe |
| priusfan | 0:c0bb943bc2a7 | 19 | |
| priusfan | 0:c0bb943bc2a7 | 20 | mod 9/04/2012:: use external files on /local/ for filters & requests * Author: teamprii |
| priusfan | 0:c0bb943bc2a7 | 21 | |
| priusfan | 0:c0bb943bc2a7 | 22 | priusfan @ priusfan.info |
| priusfan | 0:c0bb943bc2a7 | 23 | |
| priusfan | 0:c0bb943bc2a7 | 24 | */ |
| priusfan | 0:c0bb943bc2a7 | 25 | |
| priusfan | 0:c0bb943bc2a7 | 26 | |
| priusfan | 0:c0bb943bc2a7 | 27 | #include "mbed.h" |
| priusfan | 0:c0bb943bc2a7 | 28 | #include "MODSERIAL.h" // buffered serial |
| priusfan | 0:c0bb943bc2a7 | 29 | #include "stdarg.h" |
| priusfan | 0:c0bb943bc2a7 | 30 | #include "common.h" |
| priusfan | 0:c0bb943bc2a7 | 31 | #include <iostream> |
| priusfan | 0:c0bb943bc2a7 | 32 | #include <fstream> |
| priusfan | 0:c0bb943bc2a7 | 33 | #include "sstream" |
| priusfan | 0:c0bb943bc2a7 | 34 | DigitalOut myled(LED1); |
| priusfan | 0:c0bb943bc2a7 | 35 | |
| priusfan | 0:c0bb943bc2a7 | 36 | LocalFileSystem local("local"); |
| priusfan | 0:c0bb943bc2a7 | 37 | vector<reqTbl> reqTable; |
| priusfan | 0:c0bb943bc2a7 | 38 | int reqNumTbl; |
| priusfan | 0:c0bb943bc2a7 | 39 | |
| priusfan | 0:c0bb943bc2a7 | 40 | |
| priusfan | 0:c0bb943bc2a7 | 41 | |
| priusfan | 0:c0bb943bc2a7 | 42 | |
| priusfan | 0:c0bb943bc2a7 | 43 | Ticker ticker; |
| priusfan | 0:c0bb943bc2a7 | 44 | Timer timer; |
| priusfan | 0:c0bb943bc2a7 | 45 | DigitalOut led1(LED1); |
| priusfan | 0:c0bb943bc2a7 | 46 | DigitalOut led2(LED2); |
| priusfan | 0:c0bb943bc2a7 | 47 | DigitalOut led3(LED3); |
| priusfan | 0:c0bb943bc2a7 | 48 | DigitalOut led4(LED4); |
| priusfan | 0:c0bb943bc2a7 | 49 | // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD). |
| priusfan | 0:c0bb943bc2a7 | 50 | CAN can2(p30, p29); |
| priusfan | 0:c0bb943bc2a7 | 51 | |
| priusfan | 0:c0bb943bc2a7 | 52 | MODSERIAL pc(USBTX, USBRX, 1000, 100); // tx, rx, txBuffer, rxBuffer |
| priusfan | 0:c0bb943bc2a7 | 53 | |
| priusfan | 0:c0bb943bc2a7 | 54 | MODSERIAL BT(p28, p27, 1000, 100); // tx, rx, txBuffer, rxBuffer |
| priusfan | 0:c0bb943bc2a7 | 55 | |
| priusfan | 0:c0bb943bc2a7 | 56 | |
| priusfan | 0:c0bb943bc2a7 | 57 | |
| priusfan | 0:c0bb943bc2a7 | 58 | |
| priusfan | 0:c0bb943bc2a7 | 59 | |
| priusfan | 0:c0bb943bc2a7 | 60 | |
| priusfan | 0:c0bb943bc2a7 | 61 | int len_max = 0; |
| priusfan | 0:c0bb943bc2a7 | 62 | |
| priusfan | 0:c0bb943bc2a7 | 63 | // this request will be completely modified according external file /local/request.txt |
| priusfan | 0:c0bb943bc2a7 | 64 | char msg_Request[] = { 0x02, 0x99, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Request Data; 02 is the length of the qry |
| priusfan | 0:c0bb943bc2a7 | 65 | |
| priusfan | 0:c0bb943bc2a7 | 66 | char msg_Continue[] = { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // Continue Receiving Additional Data |
| priusfan | 0:c0bb943bc2a7 | 67 | int msg_ReqIdx = 0; |
| priusfan | 0:c0bb943bc2a7 | 68 | int msg_ReqFrameW = 0; |
| priusfan | 0:c0bb943bc2a7 | 69 | |
| priusfan | 0:c0bb943bc2a7 | 70 | // |
| priusfan | 0:c0bb943bc2a7 | 71 | char msg_MF_data[100] ; // used to store Multiframe |
| priusfan | 0:c0bb943bc2a7 | 72 | int msg_MF_Idx ; // cursor for previous |
| priusfan | 0:c0bb943bc2a7 | 73 | unsigned int msg_MF_Id ; // Multiframe Id |
| priusfan | 0:c0bb943bc2a7 | 74 | |
| priusfan | 0:c0bb943bc2a7 | 75 | char Crc ; // crc char for checking integrity |
| priusfan | 0:c0bb943bc2a7 | 76 | |
| priusfan | 0:c0bb943bc2a7 | 77 | |
| priusfan | 0:c0bb943bc2a7 | 78 | |
| priusfan | 0:c0bb943bc2a7 | 79 | // |
| priusfan | 0:c0bb943bc2a7 | 80 | |
| priusfan | 0:c0bb943bc2a7 | 81 | |
| priusfan | 0:c0bb943bc2a7 | 82 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 83 | // declaration functions (prototypes) |
| priusfan | 0:c0bb943bc2a7 | 84 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 85 | void init(); |
| priusfan | 0:c0bb943bc2a7 | 86 | int install_filters(); |
| priusfan | 0:c0bb943bc2a7 | 87 | int read_reqTable(vector<reqTbl>& reqtable, int& reqnumtbl); |
| priusfan | 0:c0bb943bc2a7 | 88 | void CAN2_wrFilter (uint32_t id); |
| priusfan | 0:c0bb943bc2a7 | 89 | void timchk(); |
| priusfan | 0:c0bb943bc2a7 | 90 | void can2rcv(); |
| priusfan | 0:c0bb943bc2a7 | 91 | //void calcs(); |
| priusfan | 0:c0bb943bc2a7 | 92 | //void calcm(); |
| priusfan | 0:c0bb943bc2a7 | 93 | //======================================= |
| priusfan | 0:c0bb943bc2a7 | 94 | unsigned int prev_us = 0; // work |
| priusfan | 0:c0bb943bc2a7 | 95 | unsigned int curr_us = 0; // micro sec looped |
| priusfan | 0:c0bb943bc2a7 | 96 | unsigned int curr_uH = 0; // micro sec upper dword |
| priusfan | 0:c0bb943bc2a7 | 97 | unsigned int diff_us = 0; // erapsed us |
| priusfan | 0:c0bb943bc2a7 | 98 | unsigned int curr_ms = 0; // milli sec looped |
| priusfan | 0:c0bb943bc2a7 | 99 | unsigned int left_ms = 0; // work |
| priusfan | 0:c0bb943bc2a7 | 100 | unsigned int curr_sc = 0; // sec looped |
| priusfan | 0:c0bb943bc2a7 | 101 | int ms_1000 = 0; // 1000 looped ms |
| priusfan | 0:c0bb943bc2a7 | 102 | int ms_60000 = 0; // 60000 looped ms |
| priusfan | 0:c0bb943bc2a7 | 103 | unsigned int max_diff = 0; |
| priusfan | 0:c0bb943bc2a7 | 104 | int send_per_sec = 0; |
| priusfan | 0:c0bb943bc2a7 | 105 | int rec_per_sec = 0; |
| priusfan | 0:c0bb943bc2a7 | 106 | int HiNi=0; |
| priusfan | 0:c0bb943bc2a7 | 107 | int NbB=0; |
| priusfan | 0:c0bb943bc2a7 | 108 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 109 | |
| priusfan | 0:c0bb943bc2a7 | 110 | int main() { |
| priusfan | 0:c0bb943bc2a7 | 111 | init(); |
| priusfan | 0:c0bb943bc2a7 | 112 | // |
| priusfan | 0:c0bb943bc2a7 | 113 | CANMessage can_MsgRx; |
| priusfan | 0:c0bb943bc2a7 | 114 | |
| priusfan | 0:c0bb943bc2a7 | 115 | while (1) { |
| priusfan | 0:c0bb943bc2a7 | 116 | if (can2.read(can_MsgRx)) { |
| priusfan | 0:c0bb943bc2a7 | 117 | led4=!led4; |
| priusfan | 0:c0bb943bc2a7 | 118 | // check if new can message |
| priusfan | 0:c0bb943bc2a7 | 119 | // if long response, ask for next part |
| priusfan | 0:c0bb943bc2a7 | 120 | // check if frame is complete (case of multiframe) |
| priusfan | 0:c0bb943bc2a7 | 121 | |
| priusfan | 0:c0bb943bc2a7 | 122 | if (can_MsgRx.id < 0x700) { // passive frame , |
| priusfan | 0:c0bb943bc2a7 | 123 | msg_ReqFrameW--; |
| priusfan | 0:c0bb943bc2a7 | 124 | |
| priusfan | 0:c0bb943bc2a7 | 125 | pc.printf("p\t%03X\t",can_MsgRx.id); |
| priusfan | 0:c0bb943bc2a7 | 126 | for (int i=0; i<can_MsgRx.len; i++) { |
| priusfan | 0:c0bb943bc2a7 | 127 | pc.printf(" "); |
| priusfan | 0:c0bb943bc2a7 | 128 | pc.printf("%02X",can_MsgRx.data[i]); |
| priusfan | 0:c0bb943bc2a7 | 129 | } // for |
| priusfan | 0:c0bb943bc2a7 | 130 | pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 131 | |
| priusfan | 0:c0bb943bc2a7 | 132 | BT.printf("%03X",can_MsgRx.id); |
| priusfan | 0:c0bb943bc2a7 | 133 | Crc=can_MsgRx.id; |
| priusfan | 0:c0bb943bc2a7 | 134 | for (int i=0; i<can_MsgRx.len; i++) { |
| priusfan | 0:c0bb943bc2a7 | 135 | BT.printf("%02X",can_MsgRx.data[i]); |
| priusfan | 0:c0bb943bc2a7 | 136 | Crc = Crc + can_MsgRx.data[i]; |
| priusfan | 0:c0bb943bc2a7 | 137 | } // for |
| priusfan | 0:c0bb943bc2a7 | 138 | BT.printf("%02X",Crc); |
| priusfan | 0:c0bb943bc2a7 | 139 | BT.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 140 | |
| priusfan | 0:c0bb943bc2a7 | 141 | // calcs(); |
| priusfan | 0:c0bb943bc2a7 | 142 | |
| priusfan | 0:c0bb943bc2a7 | 143 | // send next req |
| priusfan | 0:c0bb943bc2a7 | 144 | if (msg_ReqFrameW <= 0) { |
| priusfan | 0:c0bb943bc2a7 | 145 | // it is ok to send another request |
| priusfan | 0:c0bb943bc2a7 | 146 | // because we received at least X passive frames since completion of previous request |
| priusfan | 0:c0bb943bc2a7 | 147 | // get the full message to send |
| priusfan | 0:c0bb943bc2a7 | 148 | for (int i=0; i<8; i++) { |
| priusfan | 0:c0bb943bc2a7 | 149 | msg_Request[i] = reqTable[msg_ReqIdx].code[i]; |
| priusfan | 0:c0bb943bc2a7 | 150 | } |
| priusfan | 0:c0bb943bc2a7 | 151 | // log request |
| priusfan | 0:c0bb943bc2a7 | 152 | pc.printf("T\t%03X\t",reqTable[msg_ReqIdx].id); |
| priusfan | 0:c0bb943bc2a7 | 153 | for (int i=0; i<8; i++) { |
| priusfan | 0:c0bb943bc2a7 | 154 | pc.printf(" "); |
| priusfan | 0:c0bb943bc2a7 | 155 | pc.printf("%02X", msg_Request[i]); |
| priusfan | 0:c0bb943bc2a7 | 156 | } // for |
| priusfan | 0:c0bb943bc2a7 | 157 | pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 158 | // end log request |
| priusfan | 0:c0bb943bc2a7 | 159 | if (can2.write(CANMessage(reqTable[msg_ReqIdx].id, msg_Request,8))) { |
| priusfan | 0:c0bb943bc2a7 | 160 | send_per_sec++; |
| priusfan | 0:c0bb943bc2a7 | 161 | msg_ReqFrameW = 100; |
| priusfan | 0:c0bb943bc2a7 | 162 | |
| priusfan | 0:c0bb943bc2a7 | 163 | // next req |
| priusfan | 0:c0bb943bc2a7 | 164 | do { |
| priusfan | 0:c0bb943bc2a7 | 165 | reqTable[msg_ReqIdx].fcnt++; |
| priusfan | 0:c0bb943bc2a7 | 166 | if (reqTable[msg_ReqIdx].fcnt >= reqTable[msg_ReqIdx].freq) { |
| priusfan | 0:c0bb943bc2a7 | 167 | reqTable[msg_ReqIdx].fcnt = 0; |
| priusfan | 0:c0bb943bc2a7 | 168 | } // endif |
| priusfan | 0:c0bb943bc2a7 | 169 | msg_ReqIdx++; |
| priusfan | 0:c0bb943bc2a7 | 170 | if (msg_ReqIdx > reqNumTbl) { |
| priusfan | 0:c0bb943bc2a7 | 171 | msg_ReqIdx = 0; |
| priusfan | 0:c0bb943bc2a7 | 172 | } // endif |
| priusfan | 0:c0bb943bc2a7 | 173 | } while (reqTable[msg_ReqIdx].fcnt != 0); |
| priusfan | 0:c0bb943bc2a7 | 174 | } // end if can2.write |
| priusfan | 0:c0bb943bc2a7 | 175 | } // end if (msg_ReqFrameW <= 0) |
| priusfan | 0:c0bb943bc2a7 | 176 | |
| priusfan | 0:c0bb943bc2a7 | 177 | } else if (can_MsgRx.id >= 0x7E8 ) { // from here, we are dealing with answers |
| priusfan | 0:c0bb943bc2a7 | 178 | led2 =!led2; |
| priusfan | 0:c0bb943bc2a7 | 179 | HiNi = can_MsgRx.data[0]>>4; // test HighNibble to detect continuation frame |
| priusfan | 0:c0bb943bc2a7 | 180 | switch (HiNi) { |
| priusfan | 0:c0bb943bc2a7 | 181 | case 0: // short response if (can_MsgRx.data[0] < 0x10) { |
| priusfan | 0:c0bb943bc2a7 | 182 | |
| priusfan | 0:c0bb943bc2a7 | 183 | BT.printf("%03X",can_MsgRx.id); |
| priusfan | 0:c0bb943bc2a7 | 184 | Crc=can_MsgRx.id; |
| priusfan | 0:c0bb943bc2a7 | 185 | for (int i=0; i<can_MsgRx.len; i++) { |
| priusfan | 0:c0bb943bc2a7 | 186 | BT.printf("%02X",can_MsgRx.data[i]); |
| priusfan | 0:c0bb943bc2a7 | 187 | Crc = Crc + can_MsgRx.data[i]; |
| priusfan | 0:c0bb943bc2a7 | 188 | } // for |
| priusfan | 0:c0bb943bc2a7 | 189 | BT.printf("%02X",Crc); |
| priusfan | 0:c0bb943bc2a7 | 190 | BT.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 191 | |
| priusfan | 0:c0bb943bc2a7 | 192 | pc.printf("r\t%03X\t",can_MsgRx.id); |
| priusfan | 0:c0bb943bc2a7 | 193 | |
| priusfan | 0:c0bb943bc2a7 | 194 | for (int i=0; i<8; i++) { |
| priusfan | 0:c0bb943bc2a7 | 195 | pc.printf(" "); |
| priusfan | 0:c0bb943bc2a7 | 196 | pc.printf("%02X",can_MsgRx.data[i]); |
| priusfan | 0:c0bb943bc2a7 | 197 | } // for |
| priusfan | 0:c0bb943bc2a7 | 198 | pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 199 | |
| priusfan | 0:c0bb943bc2a7 | 200 | msg_ReqFrameW = 2; |
| priusfan | 0:c0bb943bc2a7 | 201 | break; |
| priusfan | 0:c0bb943bc2a7 | 202 | |
| priusfan | 0:c0bb943bc2a7 | 203 | case 1 : // long response if (can_MsgRx.data[0] == 0x10) { |
| priusfan | 0:c0bb943bc2a7 | 204 | |
| priusfan | 0:c0bb943bc2a7 | 205 | |
| priusfan | 0:c0bb943bc2a7 | 206 | NbB =int(can_MsgRx.data[1]); // the Number of Bytes in the multiframe |
| priusfan | 0:c0bb943bc2a7 | 207 | msg_ReqFrameW = 50; // continue receive |
| priusfan | 0:c0bb943bc2a7 | 208 | // store msg |
| priusfan | 0:c0bb943bc2a7 | 209 | msg_MF_Idx = 0; |
| priusfan | 0:c0bb943bc2a7 | 210 | // store id |
| priusfan | 0:c0bb943bc2a7 | 211 | msg_MF_Id = can_MsgRx.id; |
| priusfan | 0:c0bb943bc2a7 | 212 | // store from 1 to 7 |
| priusfan | 0:c0bb943bc2a7 | 213 | |
| priusfan | 0:c0bb943bc2a7 | 214 | for (int i = 1; i < can_MsgRx.len ; i++) { |
| priusfan | 0:c0bb943bc2a7 | 215 | msg_MF_data[msg_MF_Idx] = can_MsgRx.data[i]; |
| priusfan | 0:c0bb943bc2a7 | 216 | msg_MF_Idx ++; |
| priusfan | 0:c0bb943bc2a7 | 217 | } |
| priusfan | 0:c0bb943bc2a7 | 218 | |
| priusfan | 0:c0bb943bc2a7 | 219 | // send contination request |
| priusfan | 0:c0bb943bc2a7 | 220 | if (can2.write(CANMessage(can_MsgRx.id -8, msg_Continue, 8))) { |
| priusfan | 0:c0bb943bc2a7 | 221 | led3 =!led3; |
| priusfan | 0:c0bb943bc2a7 | 222 | } |
| priusfan | 0:c0bb943bc2a7 | 223 | break; |
| priusfan | 0:c0bb943bc2a7 | 224 | |
| priusfan | 0:c0bb943bc2a7 | 225 | case 2 : // if (can_MsgRx.data[0] > 0x20 && can_MsgRx.data[0] <= 0x2F) |
| priusfan | 0:c0bb943bc2a7 | 226 | // |
| priusfan | 0:c0bb943bc2a7 | 227 | // store from 1 to 7 |
| priusfan | 0:c0bb943bc2a7 | 228 | for (int i = 1; i < can_MsgRx.len ; i++) { |
| priusfan | 0:c0bb943bc2a7 | 229 | msg_MF_data[msg_MF_Idx] = can_MsgRx.data[i]; |
| priusfan | 0:c0bb943bc2a7 | 230 | msg_MF_Idx ++; |
| priusfan | 0:c0bb943bc2a7 | 231 | } |
| priusfan | 0:c0bb943bc2a7 | 232 | // |
| priusfan | 0:c0bb943bc2a7 | 233 | if ( msg_MF_Idx > NbB) { // we received the full multiframe |
| priusfan | 0:c0bb943bc2a7 | 234 | msg_ReqFrameW = 2; |
| priusfan | 0:c0bb943bc2a7 | 235 | // multiframe is finished, we send the complete thing to pc |
| priusfan | 0:c0bb943bc2a7 | 236 | |
| priusfan | 0:c0bb943bc2a7 | 237 | BT.printf("%03X",msg_MF_Id); |
| priusfan | 0:c0bb943bc2a7 | 238 | Crc=msg_MF_Id; |
| priusfan | 0:c0bb943bc2a7 | 239 | for (int i=0; i <= NbB; i++) { |
| priusfan | 0:c0bb943bc2a7 | 240 | BT.printf("%02X", msg_MF_data[i]); |
| priusfan | 0:c0bb943bc2a7 | 241 | Crc = Crc + msg_MF_data[i]; |
| priusfan | 0:c0bb943bc2a7 | 242 | } // for |
| priusfan | 0:c0bb943bc2a7 | 243 | BT.printf("%02X",Crc); |
| priusfan | 0:c0bb943bc2a7 | 244 | BT.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 245 | |
| priusfan | 0:c0bb943bc2a7 | 246 | pc.printf("r\t%03X\t",msg_MF_Id); |
| priusfan | 0:c0bb943bc2a7 | 247 | for (int i=0; i <= NbB; i++) { |
| priusfan | 0:c0bb943bc2a7 | 248 | pc.printf(" "); |
| priusfan | 0:c0bb943bc2a7 | 249 | pc.printf("%02X", msg_MF_data[i]); |
| priusfan | 0:c0bb943bc2a7 | 250 | } // for |
| priusfan | 0:c0bb943bc2a7 | 251 | pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 252 | // calcm(); |
| priusfan | 0:c0bb943bc2a7 | 253 | } else { |
| priusfan | 0:c0bb943bc2a7 | 254 | msg_ReqFrameW = 50; |
| priusfan | 0:c0bb943bc2a7 | 255 | break; |
| priusfan | 0:c0bb943bc2a7 | 256 | default: // } else if (can_MsgRx.data[0] == 0x30) { |
| priusfan | 0:c0bb943bc2a7 | 257 | // ignore |
| priusfan | 0:c0bb943bc2a7 | 258 | break; |
| priusfan | 0:c0bb943bc2a7 | 259 | } // end if ( msg_MF_Idx >= NbB) |
| priusfan | 0:c0bb943bc2a7 | 260 | } // end switch (HiNi) |
| priusfan | 0:c0bb943bc2a7 | 261 | |
| priusfan | 0:c0bb943bc2a7 | 262 | |
| priusfan | 0:c0bb943bc2a7 | 263 | // Error check |
| priusfan | 0:c0bb943bc2a7 | 264 | int rerr = can2.rderror(); |
| priusfan | 0:c0bb943bc2a7 | 265 | int werr = can2.tderror(); |
| priusfan | 0:c0bb943bc2a7 | 266 | if (rerr > 0 || werr > 0) { |
| priusfan | 0:c0bb943bc2a7 | 267 | can2.reset(); |
| priusfan | 0:c0bb943bc2a7 | 268 | led4 = !led4; |
| priusfan | 0:c0bb943bc2a7 | 269 | } // end if error |
| priusfan | 0:c0bb943bc2a7 | 270 | } // end if (can_MsgRx.id |
| priusfan | 0:c0bb943bc2a7 | 271 | } // end if (can2.read(can_MsgRx) |
| priusfan | 0:c0bb943bc2a7 | 272 | } // while (1) |
| priusfan | 0:c0bb943bc2a7 | 273 | } |
| priusfan | 0:c0bb943bc2a7 | 274 | |
| priusfan | 0:c0bb943bc2a7 | 275 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 276 | // timchk() |
| priusfan | 0:c0bb943bc2a7 | 277 | // description: this routine is called every 100microsec |
| priusfan | 0:c0bb943bc2a7 | 278 | // a) manage time_counters |
| priusfan | 0:c0bb943bc2a7 | 279 | |
| priusfan | 0:c0bb943bc2a7 | 280 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 281 | void timchk() { |
| priusfan | 0:c0bb943bc2a7 | 282 | |
| priusfan | 0:c0bb943bc2a7 | 283 | // count time |
| priusfan | 0:c0bb943bc2a7 | 284 | curr_us = timer.read_us(); // 0x00000000-0xFFFFFFFF looped |
| priusfan | 0:c0bb943bc2a7 | 285 | diff_us = curr_us - prev_us; |
| priusfan | 0:c0bb943bc2a7 | 286 | if (curr_us < prev_us) { |
| priusfan | 0:c0bb943bc2a7 | 287 | curr_uH++; |
| priusfan | 0:c0bb943bc2a7 | 288 | } |
| priusfan | 0:c0bb943bc2a7 | 289 | left_ms += diff_us; |
| priusfan | 0:c0bb943bc2a7 | 290 | while (left_ms >= 1000) { // timer.read_ms() not looped. it calculated from read_us() / 1000. so buggy. |
| priusfan | 0:c0bb943bc2a7 | 291 | curr_ms++; |
| priusfan | 0:c0bb943bc2a7 | 292 | ms_60000++; |
| priusfan | 0:c0bb943bc2a7 | 293 | ms_1000++; |
| priusfan | 0:c0bb943bc2a7 | 294 | if (ms_60000 >= 60000) { |
| priusfan | 0:c0bb943bc2a7 | 295 | ms_60000 = 0; |
| priusfan | 0:c0bb943bc2a7 | 296 | } |
| priusfan | 0:c0bb943bc2a7 | 297 | if (ms_1000 >= 1000) { |
| priusfan | 0:c0bb943bc2a7 | 298 | ms_1000 = 0; |
| priusfan | 0:c0bb943bc2a7 | 299 | curr_sc++; |
| priusfan | 0:c0bb943bc2a7 | 300 | send_per_sec =0; |
| priusfan | 0:c0bb943bc2a7 | 301 | rec_per_sec=0; |
| priusfan | 0:c0bb943bc2a7 | 302 | |
| priusfan | 0:c0bb943bc2a7 | 303 | } |
| priusfan | 0:c0bb943bc2a7 | 304 | led1 = (ms_60000 / 250) & 1; |
| priusfan | 0:c0bb943bc2a7 | 305 | left_ms -= 1000; |
| priusfan | 0:c0bb943bc2a7 | 306 | // |
| priusfan | 0:c0bb943bc2a7 | 307 | |
| priusfan | 0:c0bb943bc2a7 | 308 | } |
| priusfan | 0:c0bb943bc2a7 | 309 | if (diff_us > max_diff) { |
| priusfan | 0:c0bb943bc2a7 | 310 | max_diff = diff_us; |
| priusfan | 0:c0bb943bc2a7 | 311 | } |
| priusfan | 0:c0bb943bc2a7 | 312 | prev_us = curr_us; |
| priusfan | 0:c0bb943bc2a7 | 313 | |
| priusfan | 0:c0bb943bc2a7 | 314 | |
| priusfan | 0:c0bb943bc2a7 | 315 | } |
| priusfan | 0:c0bb943bc2a7 | 316 | |
| priusfan | 0:c0bb943bc2a7 | 317 | |
| priusfan | 0:c0bb943bc2a7 | 318 | |
| priusfan | 0:c0bb943bc2a7 | 319 | //*---------------------------------------------------------------------------- |
| priusfan | 0:c0bb943bc2a7 | 320 | // init() |
| priusfan | 0:c0bb943bc2a7 | 321 | // description: no comment |
| priusfan | 0:c0bb943bc2a7 | 322 | //*---------------------------------------------------------------------------- |
| priusfan | 0:c0bb943bc2a7 | 323 | void init() { |
| priusfan | 0:c0bb943bc2a7 | 324 | |
| priusfan | 0:c0bb943bc2a7 | 325 | |
| priusfan | 0:c0bb943bc2a7 | 326 | // Init |
| priusfan | 0:c0bb943bc2a7 | 327 | can2.frequency(500000); |
| priusfan | 0:c0bb943bc2a7 | 328 | //can2->Attach(*can2rcv); // not ready now for queuing |
| priusfan | 0:c0bb943bc2a7 | 329 | pc.baud(921600); |
| priusfan | 0:c0bb943bc2a7 | 330 | |
| priusfan | 0:c0bb943bc2a7 | 331 | BT.baud(38400); // when the BT module is new, the bps is 38400 |
| priusfan | 0:c0bb943bc2a7 | 332 | BT.printf(" \r\n+STBD=460800\r\n"); // Set baudrate 460800. Save and Rest |
| priusfan | 0:c0bb943bc2a7 | 333 | wait(0.5); |
| priusfan | 0:c0bb943bc2a7 | 334 | BT.baud(115200); // in case we played before with 115200 |
| priusfan | 0:c0bb943bc2a7 | 335 | BT.printf(" \r\n+STBD=460800\r\n"); // Set baudrate 460800. Save and Rest |
| priusfan | 0:c0bb943bc2a7 | 336 | wait(0.5); |
| priusfan | 0:c0bb943bc2a7 | 337 | BT.baud(460800); |
| priusfan | 0:c0bb943bc2a7 | 338 | wait(0.5); |
| priusfan | 0:c0bb943bc2a7 | 339 | BT.printf("\r\n+INQ=1\r\n"); // start broadcasting (make device visible) |
| priusfan | 0:c0bb943bc2a7 | 340 | |
| priusfan | 0:c0bb943bc2a7 | 341 | // install filters ( Filter) |
| priusfan | 0:c0bb943bc2a7 | 342 | install_filters(); |
| priusfan | 0:c0bb943bc2a7 | 343 | |
| priusfan | 0:c0bb943bc2a7 | 344 | int reqtblresult = read_reqTable(reqTable, reqNumTbl); |
| priusfan | 0:c0bb943bc2a7 | 345 | |
| priusfan | 0:c0bb943bc2a7 | 346 | timer.start(); |
| priusfan | 0:c0bb943bc2a7 | 347 | |
| priusfan | 0:c0bb943bc2a7 | 348 | led1=0; |
| priusfan | 0:c0bb943bc2a7 | 349 | led2=0; |
| priusfan | 0:c0bb943bc2a7 | 350 | led3=0; |
| priusfan | 0:c0bb943bc2a7 | 351 | led4=0; |
| priusfan | 0:c0bb943bc2a7 | 352 | |
| priusfan | 0:c0bb943bc2a7 | 353 | msg_ReqFrameW = 2; |
| priusfan | 0:c0bb943bc2a7 | 354 | // CAN |
| priusfan | 0:c0bb943bc2a7 | 355 | prev_us = timer.read_us(); |
| priusfan | 0:c0bb943bc2a7 | 356 | ticker.attach_us(&timchk, 100); |
| priusfan | 0:c0bb943bc2a7 | 357 | } |
| priusfan | 0:c0bb943bc2a7 | 358 | // When a CAN message is received, it is placed in queue |
| priusfan | 0:c0bb943bc2a7 | 359 | void can2rcv() { |
| priusfan | 0:c0bb943bc2a7 | 360 | CANMessage msg; |
| priusfan | 0:c0bb943bc2a7 | 361 | if (can2.read(msg)) { |
| priusfan | 0:c0bb943bc2a7 | 362 | // inQueue.Enqueue(msg); |
| priusfan | 0:c0bb943bc2a7 | 363 | led3=!led3; |
| priusfan | 0:c0bb943bc2a7 | 364 | } |
| priusfan | 0:c0bb943bc2a7 | 365 | } |
| priusfan | 0:c0bb943bc2a7 | 366 | |
| priusfan | 0:c0bb943bc2a7 | 367 | /*============================================ |
| priusfan | 0:c0bb943bc2a7 | 368 | // calcs() |
| priusfan | 0:c0bb943bc2a7 | 369 | // description: this routine is called at the recept of each single frame answer |
| priusfan | 0:c0bb943bc2a7 | 370 | // we will use msg.id & msg.data[] |
| priusfan | 0:c0bb943bc2a7 | 371 | // |
| priusfan | 0:c0bb943bc2a7 | 372 | // |
| priusfan | 0:c0bb943bc2a7 | 373 | // |
| priusfan | 0:c0bb943bc2a7 | 374 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 375 | void calcs() { |
| priusfan | 0:c0bb943bc2a7 | 376 | if (msg.id== 0x00B4) { } |
| priusfan | 0:c0bb943bc2a7 | 377 | if (msg.id== 0x01C4) { } |
| priusfan | 0:c0bb943bc2a7 | 378 | if (msg.id== 0x0245) { } |
| priusfan | 0:c0bb943bc2a7 | 379 | if (msg.id== 0x03D3) { } |
| priusfan | 0:c0bb943bc2a7 | 380 | if (msg.id== 0x0498) { } |
| priusfan | 0:c0bb943bc2a7 | 381 | if (msg.id== 0x04A6) { } |
| priusfan | 0:c0bb943bc2a7 | 382 | if (msg.id== 0x07E8 && msg.data[1]==0x61 && msg.data[2]==0x3C) {} |
| priusfan | 0:c0bb943bc2a7 | 383 | if (msg.id== 0x07E8 && msg.data[1]==0x61 && msg.data[2]==0x49) {} |
| priusfan | 0:c0bb943bc2a7 | 384 | if (msg.id== 0x07E8 && msg.data[1]==0x41 && msg.data[2]==0x3C) {} |
| priusfan | 0:c0bb943bc2a7 | 385 | if (msg.id== 0x07E8 && msg.data[1]==0x41 && msg.data[2]==0x3E) {} |
| priusfan | 0:c0bb943bc2a7 | 386 | |
| priusfan | 0:c0bb943bc2a7 | 387 | if (msg.id== 0x07EA && msg.data[1]==0x61) { |
| priusfan | 0:c0bb943bc2a7 | 388 | if (msg.data[2] == 0x61) {} |
| priusfan | 0:c0bb943bc2a7 | 389 | if (msg.data[2] == 0x62) {} |
| priusfan | 0:c0bb943bc2a7 | 390 | if (msg.data[2] == 0x67) {} |
| priusfan | 0:c0bb943bc2a7 | 391 | if (msg.data[2] == 0x68) {} |
| priusfan | 0:c0bb943bc2a7 | 392 | if (msg.data[2] == 0x70) {} |
| priusfan | 0:c0bb943bc2a7 | 393 | if (msg.data[2] == 0x71) {} |
| priusfan | 0:c0bb943bc2a7 | 394 | if (msg.data[2] == 0x87) {} |
| priusfan | 0:c0bb943bc2a7 | 395 | if (msg.data[2] == 0x8A) {} |
| priusfan | 0:c0bb943bc2a7 | 396 | if (msg.data[2] == 0x98) {} |
| priusfan | 0:c0bb943bc2a7 | 397 | } |
| priusfan | 0:c0bb943bc2a7 | 398 | |
| priusfan | 0:c0bb943bc2a7 | 399 | } |
| priusfan | 0:c0bb943bc2a7 | 400 | |
| priusfan | 0:c0bb943bc2a7 | 401 | |
| priusfan | 0:c0bb943bc2a7 | 402 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 403 | // calcm() |
| priusfan | 0:c0bb943bc2a7 | 404 | // description: this routine is called at the end of multiframe answer |
| priusfan | 0:c0bb943bc2a7 | 405 | // we will use msg_MF_Id & msg_MF_data[] |
| priusfan | 0:c0bb943bc2a7 | 406 | // |
| priusfan | 0:c0bb943bc2a7 | 407 | // |
| priusfan | 0:c0bb943bc2a7 | 408 | // |
| priusfan | 0:c0bb943bc2a7 | 409 | //============================================ |
| priusfan | 0:c0bb943bc2a7 | 410 | void calcm() { |
| priusfan | 0:c0bb943bc2a7 | 411 | if ( msg_MF_Id== 0x07E8 && msg_MF_data[1]==0x61 && msg_MF_data[2]==0x01) {} |
| priusfan | 0:c0bb943bc2a7 | 412 | if ( msg_MF_Id== 0x07E8 && msg_MF_data[1]==0x61 && msg_MF_data[2]==0x49) {} |
| priusfan | 0:c0bb943bc2a7 | 413 | if ( msg_MF_Id== 0x07EA && msg_MF_data[1]==0x61 && msg_MF_data[2]==0x01) {} |
| priusfan | 0:c0bb943bc2a7 | 414 | if ( msg_MF_Id== 0x07E8 && msg_MF_data[1]==0x61 && msg_MF_data[2]==0x01) {} |
| priusfan | 0:c0bb943bc2a7 | 415 | |
| priusfan | 0:c0bb943bc2a7 | 416 | } |
| priusfan | 0:c0bb943bc2a7 | 417 | */ |
| priusfan | 0:c0bb943bc2a7 | 418 | |
| priusfan | 0:c0bb943bc2a7 | 419 | /*---------------------------------------------------------------------------- |
| priusfan | 0:c0bb943bc2a7 | 420 | CAN_wrFilter() |
| priusfan | 0:c0bb943bc2a7 | 421 | description: setup acceptance filter. CAN controller (1..2) |
| priusfan | 0:c0bb943bc2a7 | 422 | |
| priusfan | 0:c0bb943bc2a7 | 423 | setup acceptance filter for CAN controller 2 |
| priusfan | 0:c0bb943bc2a7 | 424 | original http://www.dragonwake.com/download/LPC1768/Example/CAN/CAN.c |
| priusfan | 0:c0bb943bc2a7 | 425 | simplified for CAN2 interface and std id (11 bit) only by YM1784 |
| priusfan | 0:c0bb943bc2a7 | 426 | *----------------------------------------------------------------------------*/ |
| priusfan | 0:c0bb943bc2a7 | 427 | void CAN2_wrFilter (uint32_t id) { |
| priusfan | 0:c0bb943bc2a7 | 428 | static int CAN_std_cnt = 0; |
| priusfan | 0:c0bb943bc2a7 | 429 | uint32_t buf0, buf1; |
| priusfan | 0:c0bb943bc2a7 | 430 | int cnt1, cnt2, bound1; |
| priusfan | 0:c0bb943bc2a7 | 431 | |
| priusfan | 0:c0bb943bc2a7 | 432 | /* Acceptance Filter Memory full */ |
| priusfan | 0:c0bb943bc2a7 | 433 | if (((CAN_std_cnt + 1) >> 1) >= 512) |
| priusfan | 0:c0bb943bc2a7 | 434 | return; /* error: objects full */ |
| priusfan | 0:c0bb943bc2a7 | 435 | |
| priusfan | 0:c0bb943bc2a7 | 436 | /* Setup Acceptance Filter Configuration |
| priusfan | 0:c0bb943bc2a7 | 437 | Acceptance Filter Mode Register = Off */ |
| priusfan | 0:c0bb943bc2a7 | 438 | LPC_CANAF->AFMR = 0x00000001; |
| priusfan | 0:c0bb943bc2a7 | 439 | |
| priusfan | 0:c0bb943bc2a7 | 440 | id |= 1 << 13; /* Add controller number(2) */ |
| priusfan | 0:c0bb943bc2a7 | 441 | id &= 0x0000F7FF; /* Mask out 16-bits of ID */ |
| priusfan | 0:c0bb943bc2a7 | 442 | |
| priusfan | 0:c0bb943bc2a7 | 443 | if (CAN_std_cnt == 0) { /* For entering first ID */ |
| priusfan | 0:c0bb943bc2a7 | 444 | LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16); |
| priusfan | 0:c0bb943bc2a7 | 445 | } else if (CAN_std_cnt == 1) { /* For entering second ID */ |
| priusfan | 0:c0bb943bc2a7 | 446 | if ((LPC_CANAF_RAM->mask[0] >> 16) > id) |
| priusfan | 0:c0bb943bc2a7 | 447 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16); |
| priusfan | 0:c0bb943bc2a7 | 448 | else |
| priusfan | 0:c0bb943bc2a7 | 449 | LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id; |
| priusfan | 0:c0bb943bc2a7 | 450 | } else { |
| priusfan | 0:c0bb943bc2a7 | 451 | /* Find where to insert new ID */ |
| priusfan | 0:c0bb943bc2a7 | 452 | cnt1 = 0; |
| priusfan | 0:c0bb943bc2a7 | 453 | cnt2 = CAN_std_cnt; |
| priusfan | 0:c0bb943bc2a7 | 454 | bound1 = (CAN_std_cnt - 1) >> 1; |
| priusfan | 0:c0bb943bc2a7 | 455 | while (cnt1 <= bound1) { /* Loop through standard existing IDs */ |
| priusfan | 0:c0bb943bc2a7 | 456 | if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) { |
| priusfan | 0:c0bb943bc2a7 | 457 | cnt2 = cnt1 * 2; |
| priusfan | 0:c0bb943bc2a7 | 458 | break; |
| priusfan | 0:c0bb943bc2a7 | 459 | } |
| priusfan | 0:c0bb943bc2a7 | 460 | if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) { |
| priusfan | 0:c0bb943bc2a7 | 461 | cnt2 = cnt1 * 2 + 1; |
| priusfan | 0:c0bb943bc2a7 | 462 | break; |
| priusfan | 0:c0bb943bc2a7 | 463 | } |
| priusfan | 0:c0bb943bc2a7 | 464 | cnt1++; /* cnt1 = U32 where to insert new ID */ |
| priusfan | 0:c0bb943bc2a7 | 465 | } /* cnt2 = U16 where to insert new ID */ |
| priusfan | 0:c0bb943bc2a7 | 466 | |
| priusfan | 0:c0bb943bc2a7 | 467 | if (cnt1 > bound1) { /* Adding ID as last entry */ |
| priusfan | 0:c0bb943bc2a7 | 468 | if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */ |
| priusfan | 0:c0bb943bc2a7 | 469 | LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16); |
| priusfan | 0:c0bb943bc2a7 | 470 | else /* Odd number of IDs exists */ |
| priusfan | 0:c0bb943bc2a7 | 471 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id; |
| priusfan | 0:c0bb943bc2a7 | 472 | } else { |
| priusfan | 0:c0bb943bc2a7 | 473 | buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */ |
| priusfan | 0:c0bb943bc2a7 | 474 | if ((cnt2 & 0x0001) == 0) /* Insert new mask to even address */ |
| priusfan | 0:c0bb943bc2a7 | 475 | buf1 = (id << 16) | (buf0 >> 16); |
| priusfan | 0:c0bb943bc2a7 | 476 | else /* Insert new mask to odd address */ |
| priusfan | 0:c0bb943bc2a7 | 477 | buf1 = (buf0 & 0xFFFF0000) | id; |
| priusfan | 0:c0bb943bc2a7 | 478 | |
| priusfan | 0:c0bb943bc2a7 | 479 | LPC_CANAF_RAM->mask[cnt1] = buf1; /* Insert mask */ |
| priusfan | 0:c0bb943bc2a7 | 480 | |
| priusfan | 0:c0bb943bc2a7 | 481 | bound1 = CAN_std_cnt >> 1; |
| priusfan | 0:c0bb943bc2a7 | 482 | /* Move all remaining standard mask entries one place up */ |
| priusfan | 0:c0bb943bc2a7 | 483 | while (cnt1 < bound1) { |
| priusfan | 0:c0bb943bc2a7 | 484 | cnt1++; |
| priusfan | 0:c0bb943bc2a7 | 485 | buf1 = LPC_CANAF_RAM->mask[cnt1]; |
| priusfan | 0:c0bb943bc2a7 | 486 | LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16); |
| priusfan | 0:c0bb943bc2a7 | 487 | buf0 = buf1; |
| priusfan | 0:c0bb943bc2a7 | 488 | } |
| priusfan | 0:c0bb943bc2a7 | 489 | |
| priusfan | 0:c0bb943bc2a7 | 490 | if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */ |
| priusfan | 0:c0bb943bc2a7 | 491 | LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF); |
| priusfan | 0:c0bb943bc2a7 | 492 | } |
| priusfan | 0:c0bb943bc2a7 | 493 | } |
| priusfan | 0:c0bb943bc2a7 | 494 | CAN_std_cnt++; |
| priusfan | 0:c0bb943bc2a7 | 495 | |
| priusfan | 0:c0bb943bc2a7 | 496 | /* Calculate std ID start address (buf0) and ext ID start address <- none (buf1) */ |
| priusfan | 0:c0bb943bc2a7 | 497 | buf0 = ((CAN_std_cnt + 1) >> 1) << 2; |
| priusfan | 0:c0bb943bc2a7 | 498 | buf1 = buf0; |
| priusfan | 0:c0bb943bc2a7 | 499 | |
| priusfan | 0:c0bb943bc2a7 | 500 | /* Setup acceptance filter pointers */ |
| priusfan | 0:c0bb943bc2a7 | 501 | LPC_CANAF->SFF_sa = 0; |
| priusfan | 0:c0bb943bc2a7 | 502 | LPC_CANAF->SFF_GRP_sa = buf0; |
| priusfan | 0:c0bb943bc2a7 | 503 | LPC_CANAF->EFF_sa = buf0; |
| priusfan | 0:c0bb943bc2a7 | 504 | LPC_CANAF->EFF_GRP_sa = buf1; |
| priusfan | 0:c0bb943bc2a7 | 505 | LPC_CANAF->ENDofTable = buf1; |
| priusfan | 0:c0bb943bc2a7 | 506 | |
| priusfan | 0:c0bb943bc2a7 | 507 | LPC_CANAF->AFMR = 0x00000000; /* Use acceptance filter */ |
| priusfan | 0:c0bb943bc2a7 | 508 | } // CAN2_wrFilter |
| priusfan | 0:c0bb943bc2a7 | 509 | |
| priusfan | 0:c0bb943bc2a7 | 510 | |
| priusfan | 0:c0bb943bc2a7 | 511 | /* ================================================= |
| priusfan | 0:c0bb943bc2a7 | 512 | read /local/filters.txt & install them |
| priusfan | 0:c0bb943bc2a7 | 513 | the file contains something like: |
| priusfan | 0:c0bb943bc2a7 | 514 | // max line length 128 |
| priusfan | 0:c0bb943bc2a7 | 515 | 025 // comments can be added to note what this filter (025) is for |
| priusfan | 0:c0bb943bc2a7 | 516 | 030 |
| priusfan | 0:c0bb943bc2a7 | 517 | 038 |
| priusfan | 0:c0bb943bc2a7 | 518 | 039 |
| priusfan | 0:c0bb943bc2a7 | 519 | // 03A // comment out this line so this filter (03A) will not be installed |
| priusfan | 0:c0bb943bc2a7 | 520 | 230 |
| priusfan | 0:c0bb943bc2a7 | 521 | 244 |
| priusfan | 0:c0bb943bc2a7 | 522 | |
| priusfan | 0:c0bb943bc2a7 | 523 | Author: teamprii |
| priusfan | 0:c0bb943bc2a7 | 524 | =====================================================*/ |
| priusfan | 0:c0bb943bc2a7 | 525 | int install_filters() { |
| priusfan | 0:c0bb943bc2a7 | 526 | const int maxlinelen=128; // max line length in filters.txt file; 128 should be plenty for things like "0B4 // comment for 0B4 ....... " etc. |
| priusfan | 0:c0bb943bc2a7 | 527 | char str[maxlinelen]; |
| priusfan | 0:c0bb943bc2a7 | 528 | int filter; |
| priusfan | 0:c0bb943bc2a7 | 529 | ifstream infile("/local/filters.txt"); // hard coded pathname for filter specification file |
| priusfan | 0:c0bb943bc2a7 | 530 | if (infile.is_open()) { |
| priusfan | 0:c0bb943bc2a7 | 531 | while (infile.good()) { |
| priusfan | 0:c0bb943bc2a7 | 532 | infile.getline(str,maxlinelen); |
| priusfan | 0:c0bb943bc2a7 | 533 | if (str[0]=='/' && str[1]=='/') { |
| priusfan | 0:c0bb943bc2a7 | 534 | // pc.printf("skip commented line %s",str); |
| priusfan | 0:c0bb943bc2a7 | 535 | // pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 536 | // cout<<str<<", skip commented line."<<endl; // skip commented line |
| priusfan | 0:c0bb943bc2a7 | 537 | } else { |
| priusfan | 0:c0bb943bc2a7 | 538 | sscanf(str,"%x",&filter); |
| priusfan | 0:c0bb943bc2a7 | 539 | // cout<<str<<", install filter "<<hex<<filter<<endl; // to be replaced with CAN2_wrFilter(hex); |
| priusfan | 0:c0bb943bc2a7 | 540 | pc.printf("filter:\t%03X\r\n",filter); |
| priusfan | 0:c0bb943bc2a7 | 541 | CAN2_wrFilter (filter); |
| priusfan | 0:c0bb943bc2a7 | 542 | } |
| priusfan | 0:c0bb943bc2a7 | 543 | } |
| priusfan | 0:c0bb943bc2a7 | 544 | infile.close(); |
| priusfan | 0:c0bb943bc2a7 | 545 | return 0; |
| priusfan | 0:c0bb943bc2a7 | 546 | } else { |
| priusfan | 0:c0bb943bc2a7 | 547 | // pc.printf("Unable to open filter spec file"); |
| priusfan | 0:c0bb943bc2a7 | 548 | // cout<<"Unable to open filter spec file"; |
| priusfan | 0:c0bb943bc2a7 | 549 | return -1; |
| priusfan | 0:c0bb943bc2a7 | 550 | } |
| priusfan | 0:c0bb943bc2a7 | 551 | } |
| priusfan | 0:c0bb943bc2a7 | 552 | int read_reqTable(vector<reqTbl>& reqtable, int& reqnumtbl) { |
| priusfan | 0:c0bb943bc2a7 | 553 | const int maxlinelen=256; // max line length in request.txt file; 256 should be plenty. |
| priusfan | 0:c0bb943bc2a7 | 554 | char str[maxlinelen]; |
| priusfan | 0:c0bb943bc2a7 | 555 | int id; // PID |
| priusfan | 0:c0bb943bc2a7 | 556 | int freq; // request frequency |
| priusfan | 0:c0bb943bc2a7 | 557 | int codej; // to store read code temporarily |
| priusfan | 0:c0bb943bc2a7 | 558 | reqTbl tmp; |
| priusfan | 0:c0bb943bc2a7 | 559 | ifstream infile("/local/request.txt"); // hard coded pathname for request specification file |
| priusfan | 0:c0bb943bc2a7 | 560 | if (infile.is_open()) { |
| priusfan | 0:c0bb943bc2a7 | 561 | while (infile.good()) { |
| priusfan | 0:c0bb943bc2a7 | 562 | infile.getline(str,maxlinelen); |
| priusfan | 0:c0bb943bc2a7 | 563 | if (str[0]=='/' && str[1]=='/') { |
| priusfan | 0:c0bb943bc2a7 | 564 | // pc.printf("skip commented line %s",str); |
| priusfan | 0:c0bb943bc2a7 | 565 | // pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 566 | // cout<<str<<", skip commented line."<<endl; // skip commented line |
| priusfan | 0:c0bb943bc2a7 | 567 | } else { |
| priusfan | 0:c0bb943bc2a7 | 568 | // cout<<str<<", add this request to reqTable."<<endl; // add request to reqTable |
| priusfan | 0:c0bb943bc2a7 | 569 | stringstream ss; |
| priusfan | 0:c0bb943bc2a7 | 570 | ss<<str; |
| priusfan | 0:c0bb943bc2a7 | 571 | if (ss.str().length() > 10) { // use only real lines |
| priusfan | 0:c0bb943bc2a7 | 572 | ss>>hex>>id>>freq; |
| priusfan | 0:c0bb943bc2a7 | 573 | pc.printf("\r\n add this request to reqTable.\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 574 | tmp.id=id; |
| priusfan | 0:c0bb943bc2a7 | 575 | tmp.freq=freq; |
| priusfan | 0:c0bb943bc2a7 | 576 | vector<int> code; // list of code |
| priusfan | 0:c0bb943bc2a7 | 577 | do { |
| priusfan | 0:c0bb943bc2a7 | 578 | ss>>hex>>codej; |
| priusfan | 0:c0bb943bc2a7 | 579 | if (ss.good()) { |
| priusfan | 0:c0bb943bc2a7 | 580 | code.push_back(codej); |
| priusfan | 0:c0bb943bc2a7 | 581 | } |
| priusfan | 0:c0bb943bc2a7 | 582 | } while (ss.good()); |
| priusfan | 0:c0bb943bc2a7 | 583 | tmp.code=code; |
| priusfan | 0:c0bb943bc2a7 | 584 | //cout<<"PID="<<tmp.id<<", freq="<<tmp.freq<<", code="; |
| priusfan | 0:c0bb943bc2a7 | 585 | pc.printf("PID=%03X",tmp.id); |
| priusfan | 0:c0bb943bc2a7 | 586 | pc.printf("\tfreq=%03d",tmp.freq); |
| priusfan | 0:c0bb943bc2a7 | 587 | pc.printf("\tCode="); |
| priusfan | 0:c0bb943bc2a7 | 588 | |
| priusfan | 0:c0bb943bc2a7 | 589 | for (int j=0; j<(int)tmp.code.size(); j++) { |
| priusfan | 0:c0bb943bc2a7 | 590 | pc.printf(" %02x",tmp.code[j]); |
| priusfan | 0:c0bb943bc2a7 | 591 | // cout<<" "<<tmp.code[j]<<", "; |
| priusfan | 0:c0bb943bc2a7 | 592 | } |
| priusfan | 0:c0bb943bc2a7 | 593 | // cout<<endl; |
| priusfan | 0:c0bb943bc2a7 | 594 | pc.printf("\r\n"); |
| priusfan | 0:c0bb943bc2a7 | 595 | reqtable.push_back(tmp); |
| priusfan | 0:c0bb943bc2a7 | 596 | } |
| priusfan | 0:c0bb943bc2a7 | 597 | } |
| priusfan | 0:c0bb943bc2a7 | 598 | } |
| priusfan | 0:c0bb943bc2a7 | 599 | reqnumtbl=reqtable.size(); |
| priusfan | 0:c0bb943bc2a7 | 600 | infile.close(); |
| priusfan | 0:c0bb943bc2a7 | 601 | return 0; |
| priusfan | 0:c0bb943bc2a7 | 602 | } else { |
| priusfan | 0:c0bb943bc2a7 | 603 | // pc.printf("Unable to open request spec file"); |
| priusfan | 0:c0bb943bc2a7 | 604 | // cout<<"Unable to open request spec file"; |
| priusfan | 0:c0bb943bc2a7 | 605 | return -2; |
| priusfan | 0:c0bb943bc2a7 | 606 | } |
| priusfan | 0:c0bb943bc2a7 | 607 | } |