test code for our MBED board

Dependencies:   mbed lwip

Committer:
lolpcc
Date:
Wed May 04 08:30:52 2011 +0000
Revision:
1:6877bb99aa17
Parent:
0:9edfcca7cd25

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lolpcc 0:9edfcca7cd25 1 #include "mbed.h"
lolpcc 1:6877bb99aa17 2 #include "useful.h"
lolpcc 1:6877bb99aa17 3 #include "led.h"
lolpcc 1:6877bb99aa17 4 #include "cmd.h" /* used to get at the command code */
lolpcc 1:6877bb99aa17 5 #include "can_layer.h"
lolpcc 1:6877bb99aa17 6 #include "can.h"
lolpcc 0:9edfcca7cd25 7
lolpcc 0:9edfcca7cd25 8 // CAN_RS pin at Philips PCA82C250 can bus controller.
lolpcc 0:9edfcca7cd25 9 // activate transceiver by pulling this pin to GND.
lolpcc 0:9edfcca7cd25 10 // (Rise and fall slope controlled by resistor R_s)
lolpcc 0:9edfcca7cd25 11 // (+5V result in tranceiver standby mode)
lolpcc 0:9edfcca7cd25 12 // For further information see datasheet page 4
lolpcc 0:9edfcca7cd25 13 DigitalOut can_Pca82c250SlopePin(p28);
lolpcc 0:9edfcca7cd25 14
lolpcc 0:9edfcca7cd25 15 // We use can on mbed pins 29(CAN_TXD) and 30(CAN_RXD).
lolpcc 0:9edfcca7cd25 16 CAN can(p30, p29);
lolpcc 0:9edfcca7cd25 17
lolpcc 0:9edfcca7cd25 18 int can_cnt=0;
lolpcc 1:6877bb99aa17 19 extern char station_id;
lolpcc 1:6877bb99aa17 20 char *can_str;
lolpcc 0:9edfcca7cd25 21
lolpcc 0:9edfcca7cd25 22 /******************************************/
lolpcc 0:9edfcca7cd25 23 /* */
lolpcc 1:6877bb99aa17 24 /* Can Bus Send a string to remote add */
lolpcc 1:6877bb99aa17 25 /* */
lolpcc 1:6877bb99aa17 26 /******************************************/
lolpcc 1:6877bb99aa17 27 void can_send_string(char remote, char *str)
lolpcc 1:6877bb99aa17 28 {
lolpcc 1:6877bb99aa17 29 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 30 int len = strlen(str);
lolpcc 1:6877bb99aa17 31 int id;
lolpcc 1:6877bb99aa17 32 int cnt = 0;
lolpcc 1:6877bb99aa17 33 int sub;
lolpcc 1:6877bb99aa17 34 int pt = 0;
lolpcc 1:6877bb99aa17 35
lolpcc 1:6877bb99aa17 36 if(len > 128){
lolpcc 1:6877bb99aa17 37 lprintf("Max string lenght of 128 bytes, current string %d bytes long, not sending\n",len);
lolpcc 1:6877bb99aa17 38 return;
lolpcc 1:6877bb99aa17 39 }
lolpcc 1:6877bb99aa17 40
lolpcc 1:6877bb99aa17 41 /* Set up the TX buffer for start packet */
lolpcc 1:6877bb99aa17 42 can_clear_data(buf);
lolpcc 1:6877bb99aa17 43 buf[0] = station_id; /* who we are */
lolpcc 1:6877bb99aa17 44 buf[1] = len; /* number of bytes been sent, overall */
lolpcc 1:6877bb99aa17 45 buf[2] = (len/8)+1; /* guess at how many packets it should be */
lolpcc 1:6877bb99aa17 46
lolpcc 1:6877bb99aa17 47 id = can_build_id(station_id,remote,CAN_SPRT);
lolpcc 1:6877bb99aa17 48 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 49 lprintf("Error sending %s packet (%03x),",cancmd[CAN_SPRT],id);
lolpcc 1:6877bb99aa17 50 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 51 lprintf("\n");
lolpcc 1:6877bb99aa17 52 return;
lolpcc 1:6877bb99aa17 53 }
lolpcc 1:6877bb99aa17 54 /* About to send the data */
lolpcc 1:6877bb99aa17 55 sub = 1;
lolpcc 1:6877bb99aa17 56 pt = 0;
lolpcc 1:6877bb99aa17 57 while(sub > 0){
lolpcc 1:6877bb99aa17 58 can_clear_data(buf);
lolpcc 1:6877bb99aa17 59 sub = can_build_data(len,pt,(unsigned char*)str,buf);
lolpcc 1:6877bb99aa17 60 id = can_build_id(station_id,remote,CAN_PRT);
lolpcc 1:6877bb99aa17 61 if(!can.write(CANMessage(id | cnt, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 62 lprintf("Error sending %s packet PRT (%03x),",cancmd[CAN_PRT],id);
lolpcc 1:6877bb99aa17 63 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 64 lprintf("\n");
lolpcc 1:6877bb99aa17 65 } else {
lolpcc 1:6877bb99aa17 66 pt = sub;
lolpcc 1:6877bb99aa17 67 }
lolpcc 1:6877bb99aa17 68 wait(0.1);
lolpcc 1:6877bb99aa17 69 cnt++;
lolpcc 1:6877bb99aa17 70 }
lolpcc 1:6877bb99aa17 71
lolpcc 1:6877bb99aa17 72 /* Set up the TX buffer for end packet */
lolpcc 1:6877bb99aa17 73 can_clear_data(buf);
lolpcc 1:6877bb99aa17 74 buf[0] = station_id; /* Who we are */
lolpcc 1:6877bb99aa17 75 buf[1] = len; /* number of bytes sent */
lolpcc 1:6877bb99aa17 76 buf[2] = cnt; /* atual packet count */
lolpcc 1:6877bb99aa17 77 id = can_build_id(station_id,remote,CAN_EPRT);
lolpcc 1:6877bb99aa17 78 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 79 lprintf("Error sending %s packet EPRT (%03x),",cancmd[CAN_EPRT],id);
lolpcc 1:6877bb99aa17 80 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 81 lprintf("\n");
lolpcc 1:6877bb99aa17 82 return;
lolpcc 1:6877bb99aa17 83 }
lolpcc 1:6877bb99aa17 84 }
lolpcc 1:6877bb99aa17 85 /******************************************/
lolpcc 1:6877bb99aa17 86 /* */
lolpcc 1:6877bb99aa17 87 /* Can Bus Send raw data to remote add */
lolpcc 1:6877bb99aa17 88 /* */
lolpcc 1:6877bb99aa17 89 /******************************************/
lolpcc 1:6877bb99aa17 90 void can_send_raw(char remote, char *str)
lolpcc 1:6877bb99aa17 91 {
lolpcc 1:6877bb99aa17 92 lprintf("In Can Send String with '%02x%02x%02x%02x%02x%02x%02x%02x' going to %d\n",
lolpcc 1:6877bb99aa17 93 str[0],str[1],str[2],str[3],str[4],str[5],str[6],str[7], remote);
lolpcc 1:6877bb99aa17 94 }
lolpcc 1:6877bb99aa17 95 /******************************************/
lolpcc 1:6877bb99aa17 96 /* */
lolpcc 1:6877bb99aa17 97 /* Can Bus Send BUS Reset */
lolpcc 1:6877bb99aa17 98 /* */
lolpcc 1:6877bb99aa17 99 /******************************************/
lolpcc 1:6877bb99aa17 100 void can_send_sync(void)
lolpcc 1:6877bb99aa17 101 {
lolpcc 1:6877bb99aa17 102 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 103 int id;
lolpcc 1:6877bb99aa17 104
lolpcc 1:6877bb99aa17 105 can_clear_data(buf);
lolpcc 1:6877bb99aa17 106 id = can_build_id(0,0,CAN_SYNC);
lolpcc 1:6877bb99aa17 107 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 108 lprintf("Error sending %s packet SYNC (%03x),",cancmd[CAN_SYNC],id);
lolpcc 1:6877bb99aa17 109 lprintf("\n");
lolpcc 1:6877bb99aa17 110 return;
lolpcc 1:6877bb99aa17 111 }
lolpcc 1:6877bb99aa17 112 }
lolpcc 1:6877bb99aa17 113 /******************************************/
lolpcc 0:9edfcca7cd25 114 /* */
lolpcc 1:6877bb99aa17 115 /* Can Bus Send Intger to remote add */
lolpcc 1:6877bb99aa17 116 /* mode = 0, Int, mode = 1, Time */
lolpcc 0:9edfcca7cd25 117 /* */
lolpcc 1:6877bb99aa17 118 /******************************************/
lolpcc 1:6877bb99aa17 119 void can_send_int(int remote,int value,char mode)
lolpcc 1:6877bb99aa17 120 {
lolpcc 1:6877bb99aa17 121 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 122 int id;
lolpcc 1:6877bb99aa17 123
lolpcc 1:6877bb99aa17 124 can_clear_data(buf);
lolpcc 1:6877bb99aa17 125 if(mode==0)
lolpcc 1:6877bb99aa17 126 id = can_build_id(station_id,remote,CAN_INT);
lolpcc 1:6877bb99aa17 127 else if(mode == 1)
lolpcc 1:6877bb99aa17 128 id = can_build_id(station_id,remote,CAN_TIME);
lolpcc 1:6877bb99aa17 129 else {
lolpcc 1:6877bb99aa17 130 lprintf("can_send_int: unknown mode with %d\n",mode);
lolpcc 1:6877bb99aa17 131 return;
lolpcc 1:6877bb99aa17 132 }
lolpcc 1:6877bb99aa17 133 buf[0]=value & 0x000000ff;
lolpcc 1:6877bb99aa17 134 buf[1]=(value >> 8) & 0x000000ff;
lolpcc 1:6877bb99aa17 135 buf[2]=(value >> 16) & 0x000000ff;
lolpcc 1:6877bb99aa17 136 buf[3]=(value >> 24) & 0x000000ff;
lolpcc 1:6877bb99aa17 137 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 138 lprintf("Error sending %s packet INT (%03x),",cancmd[CAN_INT],id);
lolpcc 1:6877bb99aa17 139 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 140 lprintf("\n");
lolpcc 1:6877bb99aa17 141 return;
lolpcc 1:6877bb99aa17 142 }
lolpcc 1:6877bb99aa17 143 }
lolpcc 1:6877bb99aa17 144 /******************************************/
lolpcc 0:9edfcca7cd25 145 /* */
lolpcc 1:6877bb99aa17 146 /* Can Bus Send Who is Out there mes */
lolpcc 1:6877bb99aa17 147 /* */
lolpcc 1:6877bb99aa17 148 /******************************************/
lolpcc 1:6877bb99aa17 149 void can_send_who(void)
lolpcc 1:6877bb99aa17 150 {
lolpcc 1:6877bb99aa17 151 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 152 int id;
lolpcc 1:6877bb99aa17 153
lolpcc 1:6877bb99aa17 154 can_clear_data(buf);
lolpcc 1:6877bb99aa17 155 buf[0]=station_id;
lolpcc 1:6877bb99aa17 156 id = can_build_id(station_id,0,CAN_WHOIS);
lolpcc 1:6877bb99aa17 157 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 158 lprintf("Error sending %s packet WhoIs (%03x),",cancmd[CAN_WHOIS],id);
lolpcc 1:6877bb99aa17 159 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 160 lprintf("\n");
lolpcc 1:6877bb99aa17 161 return;
lolpcc 1:6877bb99aa17 162 }
lolpcc 1:6877bb99aa17 163 }
lolpcc 1:6877bb99aa17 164 /******************************************/
lolpcc 1:6877bb99aa17 165 /* */
lolpcc 1:6877bb99aa17 166 /* Can Bus Send I Am Out there mes */
lolpcc 1:6877bb99aa17 167 /* */
lolpcc 1:6877bb99aa17 168 /******************************************/
lolpcc 1:6877bb99aa17 169 void can_send_iam(int from)
lolpcc 1:6877bb99aa17 170 {
lolpcc 1:6877bb99aa17 171 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 172 int id;
lolpcc 1:6877bb99aa17 173
lolpcc 1:6877bb99aa17 174 can_clear_data(buf);
lolpcc 1:6877bb99aa17 175 buf[0]=station_id;
lolpcc 1:6877bb99aa17 176 buf[1]=from;
lolpcc 1:6877bb99aa17 177 id = can_build_id(station_id,from,CAN_IAM);
lolpcc 1:6877bb99aa17 178 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 179 lprintf("Error sending %s packet I'm Here (%03x),",cancmd[CAN_IAM],id);
lolpcc 1:6877bb99aa17 180 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 181 lprintf("\n");
lolpcc 1:6877bb99aa17 182 return;
lolpcc 1:6877bb99aa17 183 }
lolpcc 1:6877bb99aa17 184 }
lolpcc 1:6877bb99aa17 185 /******************************************/
lolpcc 1:6877bb99aa17 186 /* */
lolpcc 1:6877bb99aa17 187 /* CAN Bus Send a ticker message */
lolpcc 1:6877bb99aa17 188 /* */
lolpcc 1:6877bb99aa17 189 /******************************************/
lolpcc 1:6877bb99aa17 190 void can_ticker_tx(int v)
lolpcc 1:6877bb99aa17 191 {
lolpcc 1:6877bb99aa17 192 unsigned char buf[0x8];
lolpcc 1:6877bb99aa17 193 int id;
lolpcc 1:6877bb99aa17 194
lolpcc 1:6877bb99aa17 195 can_clear_data(buf);
lolpcc 1:6877bb99aa17 196 buf[0]=station_id;
lolpcc 1:6877bb99aa17 197 buf[4]=v;
lolpcc 1:6877bb99aa17 198 id = can_build_id(station_id,0,CAN_IAM);
lolpcc 1:6877bb99aa17 199 if(!can.write(CANMessage(id, (char *)buf, 8))) {
lolpcc 1:6877bb99aa17 200 lprintf("Error sending %s packet CAN Ticker (%03x),",cancmd[CAN_IAM],id);
lolpcc 1:6877bb99aa17 201 can_dump_buffer(buf);
lolpcc 1:6877bb99aa17 202 lprintf("\n");
lolpcc 1:6877bb99aa17 203 return;
lolpcc 1:6877bb99aa17 204 }
lolpcc 1:6877bb99aa17 205 }
lolpcc 1:6877bb99aa17 206 /******************************************/
lolpcc 1:6877bb99aa17 207 /* */
lolpcc 1:6877bb99aa17 208 /* CAN Bus receiver, show the messages */
lolpcc 0:9edfcca7cd25 209 /* */
lolpcc 0:9edfcca7cd25 210 /******************************************/
lolpcc 1:6877bb99aa17 211 void can_receive(void)
lolpcc 1:6877bb99aa17 212 {
lolpcc 1:6877bb99aa17 213 CANMessage msg;
lolpcc 1:6877bb99aa17 214 int pt;
lolpcc 1:6877bb99aa17 215 time_t seconds;
lolpcc 1:6877bb99aa17 216
lolpcc 1:6877bb99aa17 217 if(can.read(msg)) {
lolpcc 1:6877bb99aa17 218 switch(can_decode_id(msg.id,CAN_GET_CMD)){
lolpcc 1:6877bb99aa17 219 case CAN_SYNC :
lolpcc 1:6877bb99aa17 220 lprintf("CAN SYNC MESSAGE< what do we do :-)\n");
lolpcc 1:6877bb99aa17 221 break;
lolpcc 1:6877bb99aa17 222 case CAN_RAW :
lolpcc 1:6877bb99aa17 223 break;
lolpcc 1:6877bb99aa17 224 case CAN_SPRT :
lolpcc 1:6877bb99aa17 225 if(can_str != NULL){
lolpcc 1:6877bb99aa17 226 lprintf("trying to start a string packet, when the buffer is in use\n");
lolpcc 1:6877bb99aa17 227 } else {
lolpcc 1:6877bb99aa17 228 can_str = can_buffer_create(msg.data[1]+2);
lolpcc 1:6877bb99aa17 229 }
lolpcc 1:6877bb99aa17 230 break;
lolpcc 1:6877bb99aa17 231 case CAN_EPRT :
lolpcc 1:6877bb99aa17 232 find_cmd(can_str);
lolpcc 1:6877bb99aa17 233 free(can_str);
lolpcc 1:6877bb99aa17 234 can_str = NULL;
lolpcc 1:6877bb99aa17 235 break;
lolpcc 1:6877bb99aa17 236 case CAN_INT :
lolpcc 1:6877bb99aa17 237 lprintf("Recieved an int 0x%08x\n", msg.data[0] | msg.data[1]<<8 | msg.data[2]<<16 | msg.data[3]<<24);
lolpcc 1:6877bb99aa17 238 break;
lolpcc 1:6877bb99aa17 239 case CAN_TIME :
lolpcc 1:6877bb99aa17 240 seconds = msg.data[0] | msg.data[1]<<8 | msg.data[2]<<16 | msg.data[3]<<24;
lolpcc 1:6877bb99aa17 241 set_time(seconds);
lolpcc 1:6877bb99aa17 242 break;
lolpcc 1:6877bb99aa17 243 case CAN_WHOIS :
lolpcc 1:6877bb99aa17 244 wait(station_id/10);
lolpcc 1:6877bb99aa17 245 can_send_iam(msg.data[0]);
lolpcc 1:6877bb99aa17 246 break;
lolpcc 1:6877bb99aa17 247 case CAN_IAM :
lolpcc 1:6877bb99aa17 248 lprintf("Can_I_AM responce station id %02x, you where %02x\n",
lolpcc 1:6877bb99aa17 249 msg.data[0],msg.data[1]);
lolpcc 1:6877bb99aa17 250 break;
lolpcc 1:6877bb99aa17 251 case CAN_PRT :
lolpcc 1:6877bb99aa17 252 pt = can_decode_id(msg.id,CAN_GET_CNT);
lolpcc 1:6877bb99aa17 253 can_str[(pt*8)+0] = msg.data[0];
lolpcc 1:6877bb99aa17 254 can_str[(pt*8)+1] = msg.data[1];
lolpcc 1:6877bb99aa17 255 can_str[(pt*8)+2] = msg.data[2];
lolpcc 1:6877bb99aa17 256 can_str[(pt*8)+3] = msg.data[3];
lolpcc 1:6877bb99aa17 257 can_str[(pt*8)+4] = msg.data[4];
lolpcc 1:6877bb99aa17 258 can_str[(pt*8)+5] = msg.data[5];
lolpcc 1:6877bb99aa17 259 can_str[(pt*8)+6] = msg.data[6];
lolpcc 1:6877bb99aa17 260 can_str[(pt*8)+7] = msg.data[7];
lolpcc 1:6877bb99aa17 261 break;
lolpcc 1:6877bb99aa17 262 default :
lolpcc 1:6877bb99aa17 263 lprintf("CAN receive, unknown message %d\n",can_decode_id(msg.id,CAN_GET_CMD));
lolpcc 1:6877bb99aa17 264 }
lolpcc 0:9edfcca7cd25 265 }
lolpcc 0:9edfcca7cd25 266 }
lolpcc 1:6877bb99aa17 267
lolpcc 1:6877bb99aa17 268 /******************************************/
lolpcc 1:6877bb99aa17 269 /* */
lolpcc 1:6877bb99aa17 270 /* Setup the CAN bus for use */
lolpcc 1:6877bb99aa17 271 /* */
lolpcc 1:6877bb99aa17 272 /******************************************/
lolpcc 1:6877bb99aa17 273 void can_init(void)
lolpcc 0:9edfcca7cd25 274 {
lolpcc 0:9edfcca7cd25 275 // 500kbit/s
lolpcc 1:6877bb99aa17 276 // can.frequency(500000);
lolpcc 1:6877bb99aa17 277 // 10kbits/s, for testing
lolpcc 1:6877bb99aa17 278 can.frequency(10000);
lolpcc 0:9edfcca7cd25 279 // activate external can transceiver
lolpcc 0:9edfcca7cd25 280 can_Pca82c250SlopePin = 0;
lolpcc 1:6877bb99aa17 281 can_str = NULL; /* Mark the input buffer as free */
lolpcc 1:6877bb99aa17 282 }
lolpcc 1:6877bb99aa17 283 /******************************************/
lolpcc 1:6877bb99aa17 284 /* */
lolpcc 1:6877bb99aa17 285 /* Setup the CAN message ID */
lolpcc 1:6877bb99aa17 286 /* */
lolpcc 1:6877bb99aa17 287 /******************************************/
lolpcc 1:6877bb99aa17 288 int can_build_id(char station, char dest, int cmd)
lolpcc 1:6877bb99aa17 289 {
lolpcc 1:6877bb99aa17 290 int add, dst,c = 0,id = 0;
lolpcc 1:6877bb99aa17 291 add = station << 8;
lolpcc 1:6877bb99aa17 292 dst = dest << 4;
lolpcc 0:9edfcca7cd25 293
lolpcc 1:6877bb99aa17 294 switch(cmd) {
lolpcc 1:6877bb99aa17 295 case CAN_SYNC :
lolpcc 1:6877bb99aa17 296 c = 0;
lolpcc 1:6877bb99aa17 297 add = 0;
lolpcc 1:6877bb99aa17 298 dst = 0;
lolpcc 1:6877bb99aa17 299 break;
lolpcc 1:6877bb99aa17 300 case CAN_RAW :
lolpcc 1:6877bb99aa17 301 c = 1;
lolpcc 1:6877bb99aa17 302 break;
lolpcc 1:6877bb99aa17 303 case CAN_SPRT :
lolpcc 1:6877bb99aa17 304 c = 2;
lolpcc 1:6877bb99aa17 305 break;
lolpcc 1:6877bb99aa17 306 case CAN_EPRT :
lolpcc 1:6877bb99aa17 307 c = 3;
lolpcc 1:6877bb99aa17 308 break;
lolpcc 1:6877bb99aa17 309 case CAN_INT :
lolpcc 1:6877bb99aa17 310 c = 4;
lolpcc 1:6877bb99aa17 311 break;
lolpcc 1:6877bb99aa17 312 case CAN_TIME :
lolpcc 1:6877bb99aa17 313 c = 5;
lolpcc 1:6877bb99aa17 314 break;
lolpcc 1:6877bb99aa17 315 case CAN_S2 :
lolpcc 1:6877bb99aa17 316 c = 6;
lolpcc 1:6877bb99aa17 317 break;
lolpcc 1:6877bb99aa17 318 case CAN_S3 :
lolpcc 1:6877bb99aa17 319 c = 7;
lolpcc 1:6877bb99aa17 320 break;
lolpcc 1:6877bb99aa17 321 case CAN_S4 :
lolpcc 1:6877bb99aa17 322 c = 8;
lolpcc 1:6877bb99aa17 323 break;
lolpcc 1:6877bb99aa17 324 case CAN_S5 :
lolpcc 1:6877bb99aa17 325 c = 9;
lolpcc 1:6877bb99aa17 326 break;
lolpcc 1:6877bb99aa17 327 case CAN_S6 :
lolpcc 1:6877bb99aa17 328 c = 0xa;
lolpcc 1:6877bb99aa17 329 break;
lolpcc 1:6877bb99aa17 330 case CAN_S7 :
lolpcc 1:6877bb99aa17 331 c = 0xb;
lolpcc 1:6877bb99aa17 332 break;
lolpcc 1:6877bb99aa17 333 case CAN_S8 :
lolpcc 1:6877bb99aa17 334 c = 0xc;
lolpcc 1:6877bb99aa17 335 break;
lolpcc 1:6877bb99aa17 336 case CAN_S9 :
lolpcc 1:6877bb99aa17 337 c = 0xd;
lolpcc 1:6877bb99aa17 338 break;
lolpcc 1:6877bb99aa17 339 case CAN_WHOIS :
lolpcc 1:6877bb99aa17 340 c = 0xe;
lolpcc 1:6877bb99aa17 341 break;
lolpcc 1:6877bb99aa17 342 case CAN_IAM :
lolpcc 1:6877bb99aa17 343 c = 0xf;
lolpcc 1:6877bb99aa17 344 break;
lolpcc 1:6877bb99aa17 345 case CAN_PRT :
lolpcc 1:6877bb99aa17 346 c = 0x80;
lolpcc 1:6877bb99aa17 347 break;
lolpcc 1:6877bb99aa17 348 default :
lolpcc 1:6877bb99aa17 349 lprintf("CAN Message Selector switch, unknown message %d\n",cmd);
lolpcc 1:6877bb99aa17 350 return(-1);
lolpcc 1:6877bb99aa17 351 }
lolpcc 1:6877bb99aa17 352 /* Build the message ID */
lolpcc 1:6877bb99aa17 353 id = c | add | dst;
lolpcc 1:6877bb99aa17 354 return(id);
lolpcc 1:6877bb99aa17 355 }
lolpcc 1:6877bb99aa17 356 /******************************************/
lolpcc 1:6877bb99aa17 357 /* */
lolpcc 1:6877bb99aa17 358 /* Get the data from the can message ID */
lolpcc 1:6877bb99aa17 359 /* */
lolpcc 1:6877bb99aa17 360 /******************************************/
lolpcc 1:6877bb99aa17 361 int can_decode_id(int id, int what)
lolpcc 1:6877bb99aa17 362 {
lolpcc 1:6877bb99aa17 363 switch(what){
lolpcc 1:6877bb99aa17 364 case CAN_SENDER_ID : /* Who sent the message */
lolpcc 1:6877bb99aa17 365 return((id & 0xf00)>>8);
lolpcc 1:6877bb99aa17 366 case CAN_OUR_ID : /* who is it for */
lolpcc 1:6877bb99aa17 367 return((id &0x070)>>4);
lolpcc 1:6877bb99aa17 368 case CAN_IS_PRT : /* is it a string packet */
lolpcc 1:6877bb99aa17 369 return((id &0x080));
lolpcc 1:6877bb99aa17 370 case CAN_GET_CNT : /* Get the packet count value */
lolpcc 1:6877bb99aa17 371 return((id & 0x00f));
lolpcc 1:6877bb99aa17 372 case CAN_GET_CMD : /* count and cmd live on the first 4 bits */
lolpcc 1:6877bb99aa17 373 if(can_decode_id(id,CAN_IS_PRT))
lolpcc 1:6877bb99aa17 374 return(CAN_PRT);
lolpcc 1:6877bb99aa17 375 return((id & 0x00f));
lolpcc 1:6877bb99aa17 376 default :
lolpcc 1:6877bb99aa17 377 lprintf("Unknown CAN Id decode request %02x\n",what);
lolpcc 1:6877bb99aa17 378 return(0);
lolpcc 1:6877bb99aa17 379 }
lolpcc 1:6877bb99aa17 380 }
lolpcc 1:6877bb99aa17 381 /******************************************/
lolpcc 1:6877bb99aa17 382 /* */
lolpcc 1:6877bb99aa17 383 /* Build a buffer for transmit, from a */
lolpcc 1:6877bb99aa17 384 /* source buffer, of variable length */
lolpcc 1:6877bb99aa17 385 /* this code is re-entrant, state held */
lolpcc 1:6877bb99aa17 386 /* in the parent routine */
lolpcc 1:6877bb99aa17 387 /* Safe for raw, and string data */
lolpcc 1:6877bb99aa17 388 /* */
lolpcc 1:6877bb99aa17 389 /******************************************/
lolpcc 1:6877bb99aa17 390 int can_build_data(int len, int pt, unsigned char *data, unsigned char *buffer)
lolpcc 1:6877bb99aa17 391 {
lolpcc 1:6877bb99aa17 392 int a = 0;
lolpcc 1:6877bb99aa17 393 int px;
lolpcc 1:6877bb99aa17 394
lolpcc 1:6877bb99aa17 395 px = pt;
lolpcc 1:6877bb99aa17 396
lolpcc 1:6877bb99aa17 397 while(a!=MAX_CAN_BUF){
lolpcc 1:6877bb99aa17 398 if(px<=len){
lolpcc 1:6877bb99aa17 399 buffer[a] = data[px];
lolpcc 1:6877bb99aa17 400 px++;
lolpcc 1:6877bb99aa17 401 } else {
lolpcc 1:6877bb99aa17 402 buffer[a] = 0x00;
lolpcc 1:6877bb99aa17 403 }
lolpcc 1:6877bb99aa17 404 a++;
lolpcc 1:6877bb99aa17 405 }
lolpcc 1:6877bb99aa17 406 if(px <= len)
lolpcc 1:6877bb99aa17 407 return(px);
lolpcc 1:6877bb99aa17 408 else
lolpcc 1:6877bb99aa17 409 return(0);
lolpcc 1:6877bb99aa17 410 }
lolpcc 1:6877bb99aa17 411 /******************************************/
lolpcc 1:6877bb99aa17 412 /* */
lolpcc 1:6877bb99aa17 413 /* Clear the TX buffer to Zero's */
lolpcc 1:6877bb99aa17 414 /* Safe for raw, and string data */
lolpcc 1:6877bb99aa17 415 /* */
lolpcc 1:6877bb99aa17 416 /******************************************/
lolpcc 1:6877bb99aa17 417 void can_clear_data(unsigned char *buffer)
lolpcc 1:6877bb99aa17 418 {
lolpcc 1:6877bb99aa17 419 int a = 0;
lolpcc 1:6877bb99aa17 420 while(a != MAX_CAN_BUF){
lolpcc 1:6877bb99aa17 421 buffer[a] = 0x00;
lolpcc 1:6877bb99aa17 422 a++;
lolpcc 1:6877bb99aa17 423 }
lolpcc 1:6877bb99aa17 424 }
lolpcc 1:6877bb99aa17 425 /******************************************/
lolpcc 1:6877bb99aa17 426 /* */
lolpcc 1:6877bb99aa17 427 /* Dump the TX buffer to the user */
lolpcc 1:6877bb99aa17 428 /* Safe for raw, and string data */
lolpcc 1:6877bb99aa17 429 /* */
lolpcc 1:6877bb99aa17 430 /******************************************/
lolpcc 1:6877bb99aa17 431 void can_dump_buffer(unsigned char *buffer)
lolpcc 1:6877bb99aa17 432 {
lolpcc 1:6877bb99aa17 433 int a = 0;
lolpcc 1:6877bb99aa17 434 lprintf(" ");
lolpcc 1:6877bb99aa17 435 while(a != MAX_CAN_BUF){
lolpcc 1:6877bb99aa17 436 lprintf("%02x",buffer[a]);
lolpcc 1:6877bb99aa17 437 if(buffer[a] > 0x20 & buffer[a] < 0x7f)
lolpcc 1:6877bb99aa17 438 lprintf("(%c),",buffer[a]);
lolpcc 1:6877bb99aa17 439 else
lolpcc 1:6877bb99aa17 440 lprintf(", ");
lolpcc 1:6877bb99aa17 441 a++;
lolpcc 1:6877bb99aa17 442 }
lolpcc 1:6877bb99aa17 443 }
lolpcc 1:6877bb99aa17 444 /******************************************/
lolpcc 1:6877bb99aa17 445 /* */
lolpcc 1:6877bb99aa17 446 /* Create a new string buffer for can RX */
lolpcc 1:6877bb99aa17 447 /* */
lolpcc 1:6877bb99aa17 448 /******************************************/
lolpcc 1:6877bb99aa17 449 char *can_buffer_create(int size)
lolpcc 1:6877bb99aa17 450 {
lolpcc 1:6877bb99aa17 451 char *str;
lolpcc 1:6877bb99aa17 452 int pt;
lolpcc 1:6877bb99aa17 453
lolpcc 1:6877bb99aa17 454 str = (char *)malloc(sizeof(char)*size);
lolpcc 1:6877bb99aa17 455 pt = 0;
lolpcc 1:6877bb99aa17 456 while(pt!=size){
lolpcc 1:6877bb99aa17 457 str[pt]='\0';
lolpcc 1:6877bb99aa17 458 pt++;
lolpcc 1:6877bb99aa17 459 }
lolpcc 1:6877bb99aa17 460 return(str);
lolpcc 1:6877bb99aa17 461 }
lolpcc 1:6877bb99aa17 462