Rev 2198 | Rev 2200 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1922 | arune | 1 | |
| 2 | #include "sns_rfTransceive.h" |
||
| 3 | |||
| 1996 | arune | 4 | #if IR_RX_ENABLE==1 |
| 1922 | arune | 5 | StdCan_Msg_t rfTxMsg; |
| 6 | uint8_t rfRxChannel_newData; |
||
| 2199 | arune | 7 | uint8_t rfRxChannel_len; |
| 8 | uint8_t rfRxChannel_index; |
||
| 1922 | arune | 9 | uint8_t rfRxChannel_state; |
| 10 | Ir_Protocol_Data_t rfRxChannel_proto; |
||
| 1927 | arune | 11 | uint16_t rfRxChannel_buf[MAX_NR_TIMES]; |
| 1922 | arune | 12 | |
| 2198 | arune | 13 | void sns_rfTransceive_RX_done_callback(uint8_t channel, uint16_t *buffer, uint8_t len, uint8_t index) |
| 1922 | arune | 14 | { |
| 2198 | arune | 15 | #if IR_RX_CONTINUOUS_MODE==0 |
| 1922 | arune | 16 | rfRxChannel_newData = TRUE; |
| 2199 | arune | 17 | rfRxChannel_len = len; |
| 2198 | arune | 18 | #else |
| 19 | if (len > sns_rfTransceive_MIN_NUM_PULSES) |
||
| 20 | { |
||
| 21 | rfRxChannel_newData = TRUE; |
||
| 2199 | arune | 22 | rfRxChannel_len = len; |
| 23 | rfRxChannel_index = index; |
||
| 2198 | arune | 24 | } |
| 25 | #endif |
||
| 1922 | arune | 26 | } |
| 27 | #endif |
||
| 28 | |||
| 29 | |||
| 30 | #if IR_TX_ENABLE==1 |
||
| 1927 | arune | 31 | uint8_t rfTxChannel_sendComplete; |
| 32 | uint8_t rfTxChannel_state; |
||
| 2199 | arune | 33 | uint8_t rfTxChannel_len; |
| 1927 | arune | 34 | Ir_Protocol_Data_t rfTxChannel_proto; |
| 35 | uint16_t rfTxChannel_buf[MAX_NR_TIMES]; |
||
| 36 | uint8_t rfTxChannel_repeatCount; |
||
| 37 | uint8_t rfTxChannel_stopSend; |
||
| 38 | |||
| 1922 | arune | 39 | void sns_rfTransceive_TX_done_callback(uint8_t channel) |
| 40 | { |
||
| 41 | rfTxChannel_sendComplete = TRUE; |
||
| 42 | } |
||
| 43 | #endif |
||
| 44 | |||
| 45 | void sns_rfTransceive_Init(void) |
||
| 46 | { |
||
| 1996 | arune | 47 | #if IR_RX_ENABLE==1 |
| 1922 | arune | 48 | StdCan_Set_class(rfTxMsg.Header, CAN_MODULE_CLASS_SNS); |
| 49 | StdCan_Set_direction(rfTxMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
||
| 50 | rfTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_RFTRANSCEIVE; |
||
| 51 | rfTxMsg.Header.ModuleId = sns_rfTransceive_ID; |
||
| 1996 | arune | 52 | rfTxMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_IR; |
| 1922 | arune | 53 | rfTxMsg.Length = 8; |
| 54 | |||
| 55 | rfRxChannel_newData = FALSE; |
||
| 2199 | arune | 56 | rfRxChannel_len = 0; |
| 1922 | arune | 57 | rfRxChannel_proto.timeout=0; |
| 58 | rfRxChannel_proto.data=0; |
||
| 59 | rfRxChannel_proto.repeats=0; |
||
| 60 | rfRxChannel_proto.protocol=0; |
||
| 1927 | arune | 61 | #endif |
| 62 | |||
| 63 | #if IR_TX_ENABLE==1 |
||
| 1922 | arune | 64 | rfTxChannel_sendComplete = FALSE; |
| 2199 | arune | 65 | rfTxChannel_len = 0; |
| 1922 | arune | 66 | rfTxChannel_proto.data=0; |
| 67 | rfTxChannel_proto.repeats=0; |
||
| 68 | rfTxChannel_proto.framecnt=0; |
||
| 69 | rfTxChannel_proto.protocol=0; |
||
| 70 | rfTxChannel_repeatCount = 0; |
||
| 1927 | arune | 71 | #endif |
| 1922 | arune | 72 | |
| 73 | IrTransceiver_Init(); |
||
| 74 | /* TX-pin must be set in case transmitter is nexa */ |
||
| 75 | gpio_set_out(sns_rfTransceive_TX_PIN); |
||
| 76 | #if IR_TX_ACTIVE_LOW==1 |
||
| 77 | gpio_set_pin(sns_rfTransceive_TX_PIN); |
||
| 78 | #else |
||
| 79 | gpio_clr_pin(sns_rfTransceive_TX_PIN); |
||
| 80 | #endif |
||
| 81 | |||
| 1923 | arune | 82 | #if IR_RX_ENABLE==1 |
| 1927 | arune | 83 | IrTransceiver_InitRxChannel(0, rfRxChannel_buf, sns_rfTransceive_RX_done_callback, sns_rfTransceive_RX_PCINT, sns_rfTransceive_RX_PIN); |
| 1922 | arune | 84 | rfRxChannel_state = sns_rfTransceive_STATE_RECEIVING; |
| 1923 | arune | 85 | #endif |
| 1922 | arune | 86 | |
| 1923 | arune | 87 | #if IR_TX_ENABLE==1 |
| 1922 | arune | 88 | IrTransceiver_InitTxChannel(0, sns_rfTransceive_TX_done_callback, sns_rfTransceive_TX_PIN); |
| 89 | rfTxChannel_state = sns_rfTransceive_STATE_IDLE; |
||
| 1923 | arune | 90 | #endif |
| 1922 | arune | 91 | } |
| 92 | |||
| 2198 | arune | 93 | |
| 94 | ///////////// DEBUG!!!! |
||
| 95 | #if 0 |
||
| 96 | StdCan_Msg_t irTxMsg; |
||
| 97 | void send_debug(uint16_t *buffer, uint8_t len) { |
||
| 98 | |||
| 99 | /* the protocol is unknown so the raw ir-data is sent, makes it easier to develop a new protocol */ |
||
| 100 | |||
| 101 | StdCan_Set_class(irTxMsg.Header, CAN_MODULE_CLASS_SNS); |
||
| 102 | StdCan_Set_direction(irTxMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
||
| 103 | irTxMsg.Length = 8; |
||
| 104 | irTxMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_IRRECEIVE; |
||
| 105 | irTxMsg.Header.ModuleId = 0; |
||
| 106 | irTxMsg.Header.Command = CAN_MODULE_CMD_IRRECEIVE_IRRAW; |
||
| 107 | for (uint8_t i = 0; i < len>>2; i++) { |
||
| 108 | uint8_t index = i<<2; |
||
| 109 | |||
| 110 | irTxMsg.Data[0] = (buffer[index]>>8)&0xff; |
||
| 111 | irTxMsg.Data[1] = (buffer[index]>>0)&0xff; |
||
| 112 | irTxMsg.Data[2] = (buffer[index+1]>>8)&0xff; |
||
| 113 | irTxMsg.Data[3] = (buffer[index+1]>>0)&0xff; |
||
| 114 | irTxMsg.Data[4] = (buffer[index+2]>>8)&0xff; |
||
| 115 | irTxMsg.Data[5] = (buffer[index+2]>>0)&0xff; |
||
| 116 | irTxMsg.Data[6] = (buffer[index+3]>>8)&0xff; |
||
| 117 | irTxMsg.Data[7] = (buffer[index+3]>>0)&0xff; |
||
| 118 | |||
| 119 | /* buffers will be filled when sending more than 2-3 messages, so retry until sent */ |
||
| 120 | while (StdCan_Put(&irTxMsg) != StdCan_Ret_OK) {} |
||
| 121 | _delay_ms(1); |
||
| 122 | } |
||
| 123 | |||
| 124 | uint8_t lastpacketcnt = len&0x03; |
||
| 125 | if (lastpacketcnt > 0) { |
||
| 126 | irTxMsg.Length = lastpacketcnt<<1; |
||
| 127 | for (uint8_t i = 0; i < lastpacketcnt; i++) { |
||
| 128 | irTxMsg.Data[i<<1] = (buffer[(len&0xfc)|i]>>8)&0xff; |
||
| 129 | irTxMsg.Data[(i<<1)+1] = (buffer[(len&0xfc)|i]>>0)&0xff; |
||
| 130 | } |
||
| 131 | /* buffers will be filled when sending more than 2-3 messages, so retry until sent */ |
||
| 132 | while (StdCan_Put(&irTxMsg) != StdCan_Ret_OK) {} |
||
| 133 | _delay_ms(1); |
||
| 134 | } |
||
| 135 | |||
| 136 | } |
||
| 137 | #endif |
||
| 138 | |||
| 1922 | arune | 139 | void sns_rfTransceive_Process(void) |
| 140 | { |
||
| 141 | #if IR_RX_ENABLE==1 |
||
| 142 | switch (rfRxChannel_state) |
||
| 143 | { |
||
| 144 | case sns_rfTransceive_STATE_IDLE: |
||
| 145 | { |
||
| 1931 | arune | 146 | /* If known protocol and timeout is not 0 (0 means burst) */ |
| 147 | if (rfRxChannel_proto.protocol != IR_PROTO_UNKNOWN && rfRxChannel_proto.timeout != 0) { |
||
| 1922 | arune | 148 | /* Send button release command on CAN */ |
| 1996 | arune | 149 | rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED; |
| 1922 | arune | 150 | rfTxMsg.Data[1] = rfRxChannel_proto.protocol; |
| 2040 | arune | 151 | /* Data content is kept from last transmit (pressed) */ |
| 1922 | arune | 152 | |
| 153 | StdCan_Put(&rfTxMsg); |
||
| 154 | } |
||
| 155 | rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE; |
||
| 156 | break; |
||
| 157 | } |
||
| 158 | |||
| 159 | case sns_rfTransceive_STATE_START_RECEIVE: |
||
| 160 | cli(); |
||
| 161 | rfRxChannel_newData = FALSE; |
||
| 162 | sei(); |
||
| 163 | rfRxChannel_state = sns_rfTransceive_STATE_RECEIVING; |
||
| 164 | |||
| 165 | break; |
||
| 166 | |||
| 167 | case sns_rfTransceive_STATE_RECEIVING: |
||
| 168 | if (rfRxChannel_newData == TRUE) { |
||
| 169 | cli(); |
||
| 170 | rfRxChannel_newData = FALSE; |
||
| 171 | sei(); |
||
| 172 | /* Let protocol driver parse and then send on CAN */ |
||
| 2199 | arune | 173 | uint8_t res2 = parseProtocol(rfRxChannel_buf, rfRxChannel_len, rfRxChannel_index, &rfRxChannel_proto); |
| 1922 | arune | 174 | if (res2 == IR_OK && rfRxChannel_proto.protocol != IR_PROTO_UNKNOWN) { |
| 2199 | arune | 175 | //send_debug(rfRxChannel_buf, rfRxChannel_len); |
| 1931 | arune | 176 | /* If timeout is 0, protocol is burst protocol */ |
| 177 | if (rfRxChannel_proto.timeout > 0) |
||
| 178 | { |
||
| 1996 | arune | 179 | rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED; |
| 1931 | arune | 180 | rfRxChannel_state = sns_rfTransceive_STATE_START_PAUSE; |
| 181 | } |
||
| 182 | else |
||
| 183 | { |
||
| 1996 | arune | 184 | rfTxMsg.Data[0] = CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST; |
| 1931 | arune | 185 | rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE; |
| 186 | } |
||
| 1922 | arune | 187 | rfTxMsg.Data[1] = rfRxChannel_proto.protocol; |
| 188 | rfTxMsg.Data[2] = (rfRxChannel_proto.data>>40)&0xff; |
||
| 189 | rfTxMsg.Data[3] = (rfRxChannel_proto.data>>32)&0xff; |
||
| 190 | rfTxMsg.Data[4] = (rfRxChannel_proto.data>>24)&0xff; |
||
| 191 | rfTxMsg.Data[5] = (rfRxChannel_proto.data>>16)&0xff; |
||
| 192 | rfTxMsg.Data[6] = (rfRxChannel_proto.data>>8)&0xff; |
||
| 193 | rfTxMsg.Data[7] = rfRxChannel_proto.data&0xff; |
||
| 194 | |||
| 195 | StdCan_Put(&rfTxMsg); |
||
| 196 | } |
||
| 197 | else if (rfRxChannel_proto.protocol == IR_PROTO_UNKNOWN) |
||
| 198 | { |
||
| 199 | #if (sns_rfTransceive_SEND_DEBUG==1) |
||
| 2199 | arune | 200 | //send_debug(rfRxChannel_buf, rfRxChannel_len); |
| 1922 | arune | 201 | //rfRxChannel_proto.timeout=300; |
| 202 | #endif |
||
| 203 | rfRxChannel_state = sns_rfTransceive_STATE_START_RECEIVE; |
||
| 204 | } |
||
| 205 | } |
||
| 206 | break; |
||
| 207 | |||
| 208 | case sns_rfTransceive_STATE_START_PAUSE: |
||
| 209 | /* set a timer so we can send release button event when no new RF is arriving */ |
||
| 210 | Timer_SetTimeout(sns_rfTransceive_RX_REPEATE_TIMER, rfRxChannel_proto.timeout, TimerTypeOneShot, 0); |
||
| 211 | rfRxChannel_state = sns_rfTransceive_STATE_PAUSING; |
||
| 212 | break; |
||
| 213 | |||
| 214 | case sns_rfTransceive_STATE_PAUSING: |
||
| 215 | /* reset timer if new IR arrived */ |
||
| 216 | if (rfRxChannel_newData == TRUE) { |
||
| 217 | cli(); |
||
| 218 | rfRxChannel_newData = FALSE; |
||
| 219 | sei(); |
||
| 220 | |||
| 221 | Ir_Protocol_Data_t protoDummy; |
||
| 2199 | arune | 222 | if (parseProtocol(rfRxChannel_buf, rfRxChannel_len, rfRxChannel_index, &protoDummy) == IR_OK) { |
| 1922 | arune | 223 | if (protoDummy.protocol == rfRxChannel_proto.protocol) { |
| 224 | /* re-set timer so we can send release button event when no new RF is arriving */ |
||
| 225 | Timer_SetTimeout(sns_rfTransceive_RX_REPEATE_TIMER, rfRxChannel_proto.timeout, TimerTypeOneShot, 0); |
||
| 226 | } |
||
| 227 | } |
||
| 228 | } |
||
| 229 | |||
| 230 | if (Timer_Expired(sns_rfTransceive_RX_REPEATE_TIMER)) { |
||
| 231 | rfRxChannel_state = sns_rfTransceive_STATE_IDLE; |
||
| 232 | } |
||
| 233 | break; |
||
| 234 | |||
| 235 | default: |
||
| 236 | break; |
||
| 237 | } |
||
| 238 | #endif |
||
| 239 | |||
| 1927 | arune | 240 | #if IR_TX_ENABLE==1 |
| 241 | switch (rfTxChannel_state) |
||
| 1922 | arune | 242 | { |
| 1927 | arune | 243 | case sns_rfTransceive_STATE_IDLE: |
| 1922 | arune | 244 | { |
| 245 | /* transmission is started when a command is received on can */ |
||
| 1927 | arune | 246 | rfTxChannel_stopSend = FALSE; |
| 247 | rfTxChannel_repeatCount = 0; |
||
| 248 | rfTxChannel_proto.framecnt = 0; |
||
| 1922 | arune | 249 | break; |
| 250 | } |
||
| 251 | |||
| 1927 | arune | 252 | case sns_rfTransceive_STATE_START_TRANSMIT: |
| 1922 | arune | 253 | { |
| 254 | /* Expand protocol. */ |
||
| 2199 | arune | 255 | if (expandProtocol(rfTxChannel_buf, &rfTxChannel_len, &rfTxChannel_proto) != IR_OK) { |
| 1922 | arune | 256 | /* Failed to expand protocol -> enter idle state. */ |
| 1927 | arune | 257 | rfTxChannel_state = sns_rfTransceive_STATE_IDLE; |
| 1922 | arune | 258 | break; |
| 259 | } |
||
| 260 | |||
| 1927 | arune | 261 | /* Start RF transmission. */ |
| 2199 | arune | 262 | IrTransceiver_Transmit(0, rfTxChannel_buf, 0, rfTxChannel_len, rfTxChannel_proto.modfreq); |
| 1922 | arune | 263 | |
| 264 | /* Enter transmitting state. */ |
||
| 1927 | arune | 265 | rfTxChannel_state = sns_rfTransceive_STATE_TRANSMITTING; |
| 1922 | arune | 266 | break; |
| 267 | } |
||
| 268 | |||
| 1927 | arune | 269 | case sns_rfTransceive_STATE_TRANSMITTING: |
| 1922 | arune | 270 | { |
| 1927 | arune | 271 | if (rfTxChannel_sendComplete == TRUE) |
| 1922 | arune | 272 | { |
| 273 | cli(); |
||
| 1927 | arune | 274 | rfTxChannel_sendComplete = FALSE; |
| 1922 | arune | 275 | sei(); |
| 276 | |||
| 1927 | arune | 277 | rfTxChannel_state = sns_rfTransceive_STATE_START_PAUSE; |
| 1922 | arune | 278 | } |
| 279 | break; |
||
| 280 | } |
||
| 281 | |||
| 1927 | arune | 282 | case sns_rfTransceive_STATE_START_PAUSE: |
| 1922 | arune | 283 | { |
| 1927 | arune | 284 | if (rfTxChannel_repeatCount < rfTxChannel_proto.repeats) |
| 1922 | arune | 285 | { |
| 1927 | arune | 286 | rfTxChannel_repeatCount++; |
| 1922 | arune | 287 | } |
| 288 | |||
| 1927 | arune | 289 | Timer_SetTimeout(sns_rfTransceive_TX_REPEATE_TIMER, rfTxChannel_proto.timeout, TimerTypeOneShot, 0); |
| 1922 | arune | 290 | |
| 1927 | arune | 291 | if (rfTxChannel_proto.framecnt != 255) |
| 1922 | arune | 292 | { |
| 1927 | arune | 293 | rfTxChannel_proto.framecnt++; |
| 1922 | arune | 294 | } |
| 295 | |||
| 1927 | arune | 296 | rfTxChannel_state = sns_rfTransceive_STATE_PAUSING; |
| 1922 | arune | 297 | break; |
| 298 | } |
||
| 299 | |||
| 1927 | arune | 300 | case sns_rfTransceive_STATE_PAUSING: |
| 1922 | arune | 301 | { |
| 1927 | arune | 302 | if (Timer_Expired(sns_rfTransceive_TX_REPEATE_TIMER)) |
| 1922 | arune | 303 | { |
| 1927 | arune | 304 | rfTxChannel_state = sns_rfTransceive_STATE_START_TRANSMIT; |
| 1922 | arune | 305 | } |
| 306 | |||
| 307 | /* Transmission is stopped when such command is recevied on can */ |
||
| 1927 | arune | 308 | if (rfTxChannel_stopSend == TRUE && rfTxChannel_repeatCount >= rfTxChannel_proto.repeats) |
| 1922 | arune | 309 | { |
| 1927 | arune | 310 | rfTxChannel_state = sns_rfTransceive_STATE_IDLE; |
| 1922 | arune | 311 | } |
| 312 | break; |
||
| 313 | } |
||
| 314 | default: |
||
| 315 | break; |
||
| 316 | } |
||
| 317 | #endif |
||
| 318 | } |
||
| 319 | |||
| 320 | void sns_rfTransceive_HandleMessage(StdCan_Msg_t *rxMsg) |
||
| 321 | { |
||
| 322 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
||
| 323 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && |
||
| 324 | rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_RFTRANSCEIVE && |
||
| 325 | rxMsg->Header.ModuleId == sns_rfTransceive_ID) |
||
| 326 | { |
||
| 327 | switch (rxMsg->Header.Command) |
||
| 328 | { |
||
| 329 | #if IR_TX_ENABLE==1 |
||
| 1996 | arune | 330 | case CAN_MODULE_CMD_PHYSICAL_IR: |
| 1927 | arune | 331 | { |
| 2040 | arune | 332 | if (rfTxChannel_state == sns_rfTransceive_STATE_IDLE && |
| 1996 | arune | 333 | (rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED || |
| 334 | rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST)) |
||
| 335 | { |
||
| 336 | rfTxChannel_stopSend = (uint8_t)(rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST); |
||
| 1927 | arune | 337 | |
| 1996 | arune | 338 | rfTxChannel_proto.protocol = rxMsg->Data[1]; |
| 339 | rfTxChannel_proto.data = rxMsg->Data[2]; |
||
| 340 | rfTxChannel_proto.data = rfTxChannel_proto.data<<8; |
||
| 341 | rfTxChannel_proto.data |= rxMsg->Data[3]; |
||
| 342 | rfTxChannel_proto.data = rfTxChannel_proto.data<<8; |
||
| 343 | rfTxChannel_proto.data |= rxMsg->Data[4]; |
||
| 344 | rfTxChannel_proto.data = rfTxChannel_proto.data<<8; |
||
| 345 | rfTxChannel_proto.data |= rxMsg->Data[5]; |
||
| 346 | rfTxChannel_proto.data = rfTxChannel_proto.data<<8; |
||
| 347 | rfTxChannel_proto.data |= rxMsg->Data[6]; |
||
| 348 | rfTxChannel_proto.data = rfTxChannel_proto.data<<8; |
||
| 349 | rfTxChannel_proto.data |= rxMsg->Data[7]; |
||
| 350 | |||
| 351 | rfTxChannel_state = sns_rfTransceive_STATE_START_TRANSMIT; |
||
| 352 | } |
||
| 353 | else if (rfTxChannel_state != sns_rfTransceive_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED) |
||
| 354 | { |
||
| 355 | rfTxChannel_stopSend = TRUE; |
||
| 356 | } |
||
| 1927 | arune | 357 | } |
| 1922 | arune | 358 | #endif |
| 359 | } |
||
| 360 | } |
||
| 361 | } |
||
| 362 | |||
| 363 | void sns_rfTransceive_List(uint8_t ModuleSequenceNumber) |
||
| 364 | { |
||
| 365 | StdCan_Msg_t txMsg; |
||
| 366 | |||
| 367 | StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); |
||
| 368 | StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER); |
||
| 369 | txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_RFTRANSCEIVE; |
||
| 370 | txMsg.Header.ModuleId = sns_rfTransceive_ID; |
||
| 371 | txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST; |
||
| 372 | txMsg.Length = 6; |
||
| 373 | |||
| 1927 | arune | 374 | uint32_t HwId=BIOS_GetHwId(); |
| 375 | txMsg.Data[0] = HwId&0xff; |
||
| 376 | txMsg.Data[1] = (HwId>>8)&0xff; |
||
| 377 | txMsg.Data[2] = (HwId>>16)&0xff; |
||
| 378 | txMsg.Data[3] = (HwId>>24)&0xff; |
||
| 1922 | arune | 379 | |
| 380 | txMsg.Data[4] = NUMBER_OF_MODULES; |
||
| 381 | txMsg.Data[5] = ModuleSequenceNumber; |
||
| 382 | |||
| 383 | while (StdCan_Put(&txMsg) != StdCan_Ret_OK); |
||
| 384 | } |