can viewer for layerone 2017
main.cpp@0:00c37ac2161b, 2016-11-13 (annotated)
- Committer:
- charliex
- Date:
- Sun Nov 13 18:08:56 2016 +0000
- Revision:
- 0:00c37ac2161b
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
charliex | 0:00c37ac2161b | 1 | #include "mbed.h" |
charliex | 0:00c37ac2161b | 2 | #include "tft.h" |
charliex | 0:00c37ac2161b | 3 | |
charliex | 0:00c37ac2161b | 4 | #define TX_ID (0x7e0) |
charliex | 0:00c37ac2161b | 5 | #define RX_ID (0x7e1) |
charliex | 0:00c37ac2161b | 6 | |
charliex | 0:00c37ac2161b | 7 | DigitalOut led1(LED1); |
charliex | 0:00c37ac2161b | 8 | |
charliex | 0:00c37ac2161b | 9 | CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name |
charliex | 0:00c37ac2161b | 10 | |
charliex | 0:00c37ac2161b | 11 | char counter = 0; |
charliex | 0:00c37ac2161b | 12 | |
charliex | 0:00c37ac2161b | 13 | #define NUMBER_TEXT_LINES ( 23 ) |
charliex | 0:00c37ac2161b | 14 | |
charliex | 0:00c37ac2161b | 15 | int filterhandle=0, index =0; |
charliex | 0:00c37ac2161b | 16 | char buffer[NUMBER_TEXT_LINES][200]; |
charliex | 0:00c37ac2161b | 17 | bool available = false; |
charliex | 0:00c37ac2161b | 18 | |
charliex | 0:00c37ac2161b | 19 | /** |
charliex | 0:00c37ac2161b | 20 | * @brief 'CAN receive-complete' interrup handler. |
charliex | 0:00c37ac2161b | 21 | * @note Called on arrival of new CAN message. |
charliex | 0:00c37ac2161b | 22 | * Keep it as short as possible. |
charliex | 0:00c37ac2161b | 23 | * @param |
charliex | 0:00c37ac2161b | 24 | * @retval |
charliex | 0:00c37ac2161b | 25 | */ |
charliex | 0:00c37ac2161b | 26 | void onMsgReceived() |
charliex | 0:00c37ac2161b | 27 | { |
charliex | 0:00c37ac2161b | 28 | CANMessage msg; |
charliex | 0:00c37ac2161b | 29 | |
charliex | 0:00c37ac2161b | 30 | memset ( &msg, 0, sizeof ( msg ) ); |
charliex | 0:00c37ac2161b | 31 | |
charliex | 0:00c37ac2161b | 32 | if ( can.read ( msg ) ) { |
charliex | 0:00c37ac2161b | 33 | |
charliex | 0:00c37ac2161b | 34 | sprintf(buffer[index%NUMBER_TEXT_LINES],"0x%03x %d %02x %02x %02x %02x %02x %02x %02x %02x", msg.id,msg.len , |
charliex | 0:00c37ac2161b | 35 | msg.data[0], msg.data[1], msg.data[2], msg.data[3], msg.data[4],msg.data[5], msg.data[6], msg.data[7] |
charliex | 0:00c37ac2161b | 36 | ); |
charliex | 0:00c37ac2161b | 37 | |
charliex | 0:00c37ac2161b | 38 | available = true; |
charliex | 0:00c37ac2161b | 39 | index++; |
charliex | 0:00c37ac2161b | 40 | } |
charliex | 0:00c37ac2161b | 41 | } |
charliex | 0:00c37ac2161b | 42 | |
charliex | 0:00c37ac2161b | 43 | int main() |
charliex | 0:00c37ac2161b | 44 | { |
charliex | 0:00c37ac2161b | 45 | int error; |
charliex | 0:00c37ac2161b | 46 | |
charliex | 0:00c37ac2161b | 47 | unsigned char q = 0; |
charliex | 0:00c37ac2161b | 48 | set_back(0); |
charliex | 0:00c37ac2161b | 49 | tft_init(); |
charliex | 0:00c37ac2161b | 50 | |
charliex | 0:00c37ac2161b | 51 | tft_clear(TFT_BLUE); |
charliex | 0:00c37ac2161b | 52 | tft_set_window(32, 8, TFT_WIDTH + 32 - 1, TFT_HEIGHT + 8 - 1); |
charliex | 0:00c37ac2161b | 53 | |
charliex | 0:00c37ac2161b | 54 | set_back(1); |
charliex | 0:00c37ac2161b | 55 | |
charliex | 0:00c37ac2161b | 56 | CANMessage msg,txMsg; |
charliex | 0:00c37ac2161b | 57 | restart: |
charliex | 0:00c37ac2161b | 58 | ; |
charliex | 0:00c37ac2161b | 59 | |
charliex | 0:00c37ac2161b | 60 | // can reset messes up the can (more init?) |
charliex | 0:00c37ac2161b | 61 | //can.reset(); |
charliex | 0:00c37ac2161b | 62 | |
charliex | 0:00c37ac2161b | 63 | error = can.frequency(500000); // set bit rate to 1Mbps |
charliex | 0:00c37ac2161b | 64 | if(error == 0) { |
charliex | 0:00c37ac2161b | 65 | tft_text(0,0,"can.frequency",0xfff,0); |
charliex | 0:00c37ac2161b | 66 | wait(10); |
charliex | 0:00c37ac2161b | 67 | goto restart; |
charliex | 0:00c37ac2161b | 68 | } |
charliex | 0:00c37ac2161b | 69 | |
charliex | 0:00c37ac2161b | 70 | |
charliex | 0:00c37ac2161b | 71 | |
charliex | 0:00c37ac2161b | 72 | error = can.mode(CAN::Silent); |
charliex | 0:00c37ac2161b | 73 | if(error == 0 ) { |
charliex | 0:00c37ac2161b | 74 | tft_text(0,0,"can.mode",0xfff,0); |
charliex | 0:00c37ac2161b | 75 | wait(10); |
charliex | 0:00c37ac2161b | 76 | goto restart; |
charliex | 0:00c37ac2161b | 77 | } |
charliex | 0:00c37ac2161b | 78 | |
charliex | 0:00c37ac2161b | 79 | //can.monitor(true); |
charliex | 0:00c37ac2161b | 80 | |
charliex | 0:00c37ac2161b | 81 | // filterhandle = can.filter(0xff,0x07ff,CANAny,0); |
charliex | 0:00c37ac2161b | 82 | |
charliex | 0:00c37ac2161b | 83 | can.attach(&onMsgReceived); // attach 'CAN receive-complete' interrupt handler |
charliex | 0:00c37ac2161b | 84 | |
charliex | 0:00c37ac2161b | 85 | tft_clear(TFT_BLACK); |
charliex | 0:00c37ac2161b | 86 | |
charliex | 0:00c37ac2161b | 87 | tft_text(0,0," ID LEN ------ Data ------ Waiting",0xff0,0); |
charliex | 0:00c37ac2161b | 88 | |
charliex | 0:00c37ac2161b | 89 | while(1) { |
charliex | 0:00c37ac2161b | 90 | |
charliex | 0:00c37ac2161b | 91 | |
charliex | 0:00c37ac2161b | 92 | #if 0 |
charliex | 0:00c37ac2161b | 93 | char ind[ 12 ]; |
charliex | 0:00c37ac2161b | 94 | |
charliex | 0:00c37ac2161b | 95 | memset ( &msg, 0, sizeof ( msg ) ); |
charliex | 0:00c37ac2161b | 96 | |
charliex | 0:00c37ac2161b | 97 | error = can.read ( msg,0 ) ; |
charliex | 0:00c37ac2161b | 98 | |
charliex | 0:00c37ac2161b | 99 | if(error == 1) { |
charliex | 0:00c37ac2161b | 100 | sprintf(buffer[index%NUMBER_TEXT_LINES],"0x%03x %d %02x %02x %02x %02x %02x %02x %02x %02x", msg.id,msg.len , |
charliex | 0:00c37ac2161b | 101 | msg.data[0], msg.data[1], msg.data[2], msg.data[3], msg.data[4],msg.data[5], msg.data[6], msg.data[7] |
charliex | 0:00c37ac2161b | 102 | ); |
charliex | 0:00c37ac2161b | 103 | index++; |
charliex | 0:00c37ac2161b | 104 | index%=NUMBER_TEXT_LINES; |
charliex | 0:00c37ac2161b | 105 | } |
charliex | 0:00c37ac2161b | 106 | |
charliex | 0:00c37ac2161b | 107 | if( can.rderror() ) { |
charliex | 0:00c37ac2161b | 108 | |
charliex | 0:00c37ac2161b | 109 | tft_text(100,0,"can.rderror",0xfff,0); |
charliex | 0:00c37ac2161b | 110 | wait(1); |
charliex | 0:00c37ac2161b | 111 | tft_clear(TFT_BLACK); |
charliex | 0:00c37ac2161b | 112 | |
charliex | 0:00c37ac2161b | 113 | can.reset(); |
charliex | 0:00c37ac2161b | 114 | can.frequency(500000); |
charliex | 0:00c37ac2161b | 115 | can.mode(CAN::Normal); |
charliex | 0:00c37ac2161b | 116 | q= 0; |
charliex | 0:00c37ac2161b | 117 | |
charliex | 0:00c37ac2161b | 118 | } |
charliex | 0:00c37ac2161b | 119 | |
charliex | 0:00c37ac2161b | 120 | sprintf(ind,"%03d %01d %d",index,error, can.rderror() ); |
charliex | 0:00c37ac2161b | 121 | |
charliex | 0:00c37ac2161b | 122 | tft_text(0,0,ind,0xfff,0); |
charliex | 0:00c37ac2161b | 123 | |
charliex | 0:00c37ac2161b | 124 | #endif |
charliex | 0:00c37ac2161b | 125 | //for(unsigned char q=0;q< NUMBER_TEXT_LINES;q++) |
charliex | 0:00c37ac2161b | 126 | { |
charliex | 0:00c37ac2161b | 127 | tft_text(0,8+((q)*8),buffer[q],0xfff,0); |
charliex | 0:00c37ac2161b | 128 | |
charliex | 0:00c37ac2161b | 129 | } |
charliex | 0:00c37ac2161b | 130 | |
charliex | 0:00c37ac2161b | 131 | q++; |
charliex | 0:00c37ac2161b | 132 | q%=NUMBER_TEXT_LINES; |
charliex | 0:00c37ac2161b | 133 | |
charliex | 0:00c37ac2161b | 134 | led1 = !led1; |
charliex | 0:00c37ac2161b | 135 | } |
charliex | 0:00c37ac2161b | 136 | |
charliex | 0:00c37ac2161b | 137 | |
charliex | 0:00c37ac2161b | 138 | } |