MOYA F.X. / Mbed 2 deprecated CAN_hsd_bt

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }