void RECEIVE_Tasks(void) { char letter; while (1) { xQueueReceive(rcvData.rcvQueue, &letter, portMAX_DELAY); checkReceive(letter); } }
//============================================================================== // This function performs background tasks: // - receives and displays frames in auto // poll mode //------------------------------------------------------------------------------ void CAN232_Tasks() { if (lw232_CanChannelMode != LW232_STATUS_CAN_CLOSED && lw232_AutoPoll == LW232_AUTOPOLL_ON) { int recv = 0; while (CAN_MSGAVAIL == checkReceive() && recv++<5) { //printChar('+'); if (CAN_OK == receiveSingleFrame()) { printChar(LW232_CR); } } } }
void Can232::loopFunc() { if (stringComplete) { int len = inputString.length(); if (len > 0 && len < 29) { strcpy((char*)lw232Message, inputString.c_str()); exec(); } // clear the string: inputString = ""; stringComplete = false; } if (lw232CanChannelMode != LW232_STATUS_CAN_CLOSED) { int recv = 0; while (CAN_MSGAVAIL == checkReceive() && recv++<5) { dbg0('+'); if (CAN_OK == receiveSingleFrame()) { Serial.write(LW232_CR); } } Serial.flush(); } }
INT8U Can232::parseAndRunCommand() { INT8U ret = LW232_OK; INT8U idx = 0; INT8U err = 0; lw232LastErr = LW232_OK; switch (lw232Message[0]) { case LW232_CMD_SETUP: // Sn[CR] Setup with standard CAN bit-rates where n is 0-9. if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { idx = HexHelper::parseNibbleWithLimit(lw232Message[1], LW232_CAN_BAUD_NUM); lw232CanSpeedSelection = lw232CanBaudRates[idx]; } else { ret = LW232_ERR; } break; case LW232_CMD_SETUP_BTR: // sxxyy[CR] Setup with BTR0/BTR1 CAN bit-rates where xx and yy is a hex value. ret = LW232_ERR; break; case LW232_CMD_OPEN: // O[CR] Open the CAN channel in normal mode (sending & receiving). if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { ret = openCanBus(); if (ret == LW232_OK) { lw232CanChannelMode = LW232_STATUS_CAN_OPEN_NORMAL; } } else { ret = LW232_ERR; } break; case LW232_CMD_LISTEN: // L[CR] Open the CAN channel in listen only mode (receiving). if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { ret = openCanBus(); if (ret == LW232_OK) { lw232CanChannelMode = LW232_STATUS_CAN_OPEN_LISTEN; } } else { ret = LW232_ERR; } break; case LW232_CMD_CLOSE: // C[CR] Close the CAN channel. if (lw232CanChannelMode != LW232_STATUS_CAN_CLOSED) { lw232CanChannelMode = LW232_STATUS_CAN_CLOSED; } else { ret = LW232_ERR; } break; case LW232_CMD_TX11: // tiiildd...[CR] Transmit a standard (11bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanStdId(); lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); for (; idx < lw232PacketLen; idx++) { lw232Buffer[idx] = HexHelper::parseFullByte(lw232Message[LW232_OFFSET_STD_PKT_DATA + idx * 2], lw232Message[LW232_OFFSET_STD_PKT_DATA + idx * 2 + 1]); } INT8U mcpErr = sendMsgBuf(lw232CanId, 0, 0, lw232PacketLen, lw232Buffer); if (mcpErr != CAN_OK) { ret = LW232_ERR; } else if (lw232AutoPoll) { ret = LW232_OK_SMALL; } } else { ret = LW232_ERR; } break; case LW232_CMD_TX29: // Tiiiiiiiildd...[CR] Transmit an extended (29bit) CAN frame if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanExtId(); lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); for (; idx < lw232PacketLen; idx++) { lw232Buffer[idx] = HexHelper::parseFullByte(lw232Message[LW232_OFFSET_EXT_PKT_DATA + idx * 2], lw232Message[LW232_OFFSET_EXT_PKT_DATA + idx * 2 + 1]); } if (CAN_OK != sendMsgBuf(lw232CanId, 1, 0, lw232PacketLen, lw232Buffer)) { ret = LW232_ERR; } else if (lw232AutoPoll) { ret = LW232_OK_BIG; } else { ret = LW232_OK; } } break; case LW232_CMD_RTR11: // riiil[CR] Transmit an standard RTR (11bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanStdId(); lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_STD_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); if (CAN_OK != sendMsgBuf(lw232CanId, 0, 1, lw232PacketLen, lw232Buffer)) { ret = LW232_ERR; } else if (lw232AutoPoll) { ret = LW232_OK_SMALL; } } else { ret = LW232_ERR; } break; case LW232_CMD_RTR29: // Riiiiiiiil[CR] Transmit an extended RTR (29bit) CAN frame. if (lw232CanChannelMode == LW232_STATUS_CAN_OPEN_NORMAL) { parseCanExtId(); lw232PacketLen = HexHelper::parseNibbleWithLimit(lw232Message[LW232_OFFSET_EXT_PKT_LEN], LW232_FRAME_MAX_LENGTH + 1); if (CAN_OK != sendMsgBuf(lw232CanId, 1, 1, lw232PacketLen, lw232Buffer)) { ret = LW232_ERR; } else if (lw232AutoPoll) { ret = LW232_OK_SMALL; // not a typo. strangely can232_v3.pdf tells to return "z[CR]", not "Z[CR]" as in 29bit. todo: check if it is error in pdf??? } } else { ret = LW232_ERR; } break; case LW232_CMD_POLL_ONE: // P[CR] Poll incomming FIFO for CAN frames (single poll) if (lw232CanChannelMode != LW232_STATUS_CAN_CLOSED && lw232AutoPoll == LW232_AUTOPOLL_OFF) { if (CAN_MSGAVAIL == checkReceive()) { ret = receiveSingleFrame(); } } else { ret = LW232_ERR; } break; case LW232_CMD_POLL_MANY: // A[CR] Polls incomming FIFO for CAN frames (all pending frames) if (lw232CanChannelMode != LW232_STATUS_CAN_CLOSED && lw232AutoPoll == LW232_AUTOPOLL_OFF) { while (CAN_MSGAVAIL == checkReceive()) { ret = ret ^ receiveSingleFrame(); if (ret != CAN_OK) break; Serial.write(LW232_CR); } if (ret == CAN_OK) Serial.print(LW232_ALL); } else { ret = LW232_ERR; } break; case LW232_CMD_FLAGS: // F[CR] Read Status Flags. // LAWICEL CAN232 and CANUSB have some specific errors which differ from MCP2515/MCP2551 errors. We just return MCP2515 error. Serial.print(LW232_FLAG); if (lw232CAN.checkError(&err) == CAN_OK) err = 0; HexHelper::printFullByte(err & MCP_EFLG_ERRORMASK); break; case LW232_CMD_AUTOPOLL: // Xn[CR] Sets Auto Poll/Send ON/OFF for received frames. if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { lw232AutoPoll = (lw232Message[1] == LW232_ON_ONE) ? LW232_AUTOPOLL_ON : LW232_AUTOPOLL_OFF; //todo: save to eeprom } else { ret = LW232_ERR; } break; case LW232_CMD_FILTER: // Wn[CR] Filter mode setting. By default CAN232 works in dual filter mode (0) and is backwards compatible with previous CAN232 versions. ret = LW232_ERR_NOT_IMPLEMENTED; break; case LW232_CMD_ACC_CODE: // Mxxxxxxxx[CR] Sets Acceptance Code Register (ACn Register of SJA1000). // we use MCP2515, ret = LW232_ERR_NOT_IMPLEMENTED; break; case LW232_CMD_ACC_MASK: // mxxxxxxxx[CR] Sets Acceptance Mask Register (AMn Register of SJA1000). ret = LW232_ERR_NOT_IMPLEMENTED; break; case LW232_CMD_UART: // Un[CR] Setup UART with a new baud rate where n is 0-6. idx = HexHelper::parseNibbleWithLimit(lw232Message[1], LW232_UART_BAUD_NUM); Serial.begin(lw232SerialBaudRates[idx]); break; case LW232_CMD_VERSION1: case LW232_CMD_VERSION2: // V[CR] Get Version number of both CAN232 hardware and software Serial.print(LW232_LAWICEL_VERSION_STR); break; case LW232_CMD_SERIAL: // N[CR] Get Serial number of the CAN232. Serial.print(LW232_LAWICEL_SERIAL_NUM); break; case LW232_CMD_TIMESTAMP: // Zn[CR] Sets Time Stamp ON/OFF for received frames only. Z0 - OFF, Z1 - Lawicel's timestamp 2 bytes, Z2 - arduino timestamp 4 bytes. if (lw232CanChannelMode == LW232_STATUS_CAN_CLOSED) { // lw232TimeStamp = (lw232Message[1] == LW232_ON_ONE); if (lw232Message[1] == LW232_ON_ONE) { lw232TimeStamp = LW232_TIMESTAMP_ON_NORMAL; } else if (lw232Message[1] == LW232_ON_TWO) { lw232TimeStamp = LW232_TIMESTAMP_ON_EXTENDED; } else { lw232TimeStamp = LW232_TIMESTAMP_OFF; } } else { ret = LW232_ERR; } break; case LW232_CMD_AUTOSTART: // Qn[CR] Auto Startup feature (from power on). if (lw232CanChannelMode != LW232_STATUS_CAN_CLOSED) { if (lw232Message[1] == LW232_ON_ONE) { lw232AutoStart = LW232_AUTOSTART_ON_NORMAL; } else if (lw232Message[1] == LW232_ON_TWO) { lw232AutoStart = LW232_AUTOSTART_ON_LISTEN; } else { lw232AutoStart = LW232_AUTOSTART_OFF; } //todo: save to eeprom } else { ret = LW232_ERR; } break; default: ret = LW232_ERR_UNKNOWN_CMD; } return ret; }