static msg_t can_rx(void *p) { struct can_instance *cip = p; EventListener el; CANRxFrame rxmsg; (void)p; chRegSetThreadName("receiver"); chEvtRegister(&cip->canp->rxfull_event, &el, 0); #if SPC5_CAN_USE_FILTERS rxFlag = chEvtGetAndClearFlagsI(&el); #endif while(!chThdShouldTerminate()) { if (chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(100)) == 0) continue; #if !SPC5_CAN_USE_FILTERS while (canReceive(cip->canp, CAN_ANY_MAILBOX, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { /* Process message.*/ palTogglePad(PORT_D, cip->led); } #else while (canReceive(cip->canp, rxFlag, &rxmsg, TIME_IMMEDIATE) == RDY_OK) { /* Process message.*/ palTogglePad(PORT_D, cip->led); } #endif } chEvtUnregister(&CAND1.rxfull_event, &el); return 0; }
flagsmask_t EvtListener::getAndClearFlagsI(void) { return chEvtGetAndClearFlagsI(&ev_listener); }
/** * @brief Reads a whole line from the input channel. * * @param[in] chp pointer to a @p BaseChannel object * @param[in] line pointer to the line buffer * @param[in] size buffer maximum length * @return The operation status. * @retval TRUE the channel was reset or CTRL-D pressed. * @retval FALSE operation successful. */ static bool getConsoleLine(BaseSequentialStream *chp, char *line, unsigned size) { char *p = line; while (true) { if (!isCommandLineConsoleReady()) { // we better do not read from USB serial before it is ready chThdSleepMilliseconds(10); continue; } short c = (short) streamGet(chp); onDataArrived(); #if defined(EFI_CONSOLE_UART_DEVICE) || defined(__DOXYGEN__) if (isCommandLineConsoleOverTTL()) { uint32_t flags; chSysLock() ; flags = chEvtGetAndClearFlagsI(&consoleEventListener); chSysUnlock() ; if (flags & SD_OVERRUN_ERROR) { // firmwareError(OBD_PCM_Processor_Fault, "serial overrun"); } } #endif #if EFI_UART_ECHO_TEST_MODE /** * That's test code - let's test connectivity */ consolePutChar((uint8_t) c); continue; #endif if (c < 0 || c == 4) { return true; } if (c == 8) { if (p != line) { // backspace consolePutChar((uint8_t) c); consolePutChar(0x20); consolePutChar((uint8_t) c); p--; } continue; } if (c == '\r') { consolePutChar('\r'); consolePutChar('\n'); *p = 0; return false; } if (c == '\n') { consolePutChar('\n'); *p = 0; return false; } if (c < 0x20) { continue; } if (p < line + size - 1) { consolePutChar((uint8_t) c); *p++ = (char) c; } } }