예제 #1
0
파일: receive.c 프로젝트: skitty1213/Motors
void RECEIVE_Tasks(void) {
    char letter;
    while (1) {
        xQueueReceive(rcvData.rcvQueue, &letter, portMAX_DELAY);
        checkReceive(letter);
    }
}
예제 #2
0
//==============================================================================
// 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);
            }
        }
    }
}
예제 #3
0
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();
    }
}
예제 #4
0
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;
}