static THD_FUNCTION(Reader, arg) { (void)arg; chRegSetThreadName("reader"); while (true) { msg_t msg = usbReceive(&USBD2, USBD2_DATA_AVAILABLE_EP, rxbuf, sizeof (rxbuf)); if (msg == MSG_RESET) chThdSleepMilliseconds(500); } }
EzspStatus serialResponseReceived(void) { EzspStatus status; EzspBuffer *buffer; EzspBuffer *dropBuffer = NULL; if (!checkConnection()) { ezspTraceEzspVerbose("serialResponseReceived(): EZSP_NOT_CONNECTED"); return EZSP_NOT_CONNECTED; } // ashSendExec(); // status = ashReceiveExec(); status = usbReceive(); if (status != EZSP_SUCCESS && status != EZSP_ASH_IN_PROGRESS && status != EZSP_NO_RX_DATA) { ezspTraceEzspVerbose("serialResponseReceived(): 0x%x", status); return status; } if (waitingForResponse && elapsedTimeInt16u(waitStartTime, halCommonGetInt16uMillisecondTick()) > WAIT_FOR_RESPONSE_TIMEOUT) { waitingForResponse = false; ezspTraceEzspFrameId("no response", ezspFrameContents); ezspTraceEzspVerbose("serialResponseReceived(): EZSP_ERROR_NO_RESPONSE"); return EZSP_ERROR_NO_RESPONSE; } status = EZSP_NO_RX_DATA; buffer = ezspQueuePrecedingEntry(&rxQueue, NULL); while (buffer != NULL) { // While we are waiting for a response to a command, we use the asynch // callback flag to ignore asynchronous callbacks. This allows our caller // to assume that no callbacks will appear between sending a command and // receiving its response. if (waitingForResponse && (buffer->data[EZSP_FRAME_CONTROL_INDEX] & EZSP_FRAME_CONTROL_ASYNCH_CB) ) { if (ezspFreeListLength(&rxFree) == 0) { dropBuffer = buffer; } buffer = ezspQueuePrecedingEntry(&rxQueue, buffer); } else { ezspTraceEzspVerbose("serialResponseReceived(): ID=0x%x Seq=0x%x Buffer=%u", buffer->data[EZSP_FRAME_ID_INDEX], buffer->data[EZSP_SEQUENCE_INDEX], buffer); ezspRemoveQueueEntry(&rxQueue, buffer); memcpy(ezspFrameContents, buffer->data, buffer->len); ezspTraceEzspFrameId("got response", buffer->data); ezspFrameLength = buffer->len; ezspFreeBuffer(&rxFree, buffer); ezspTraceEzspVerbose("serialResponseReceived(): ezspFreeBuffer(): %u", buffer); buffer = NULL; status = EZSP_SUCCESS; waitingForResponse = false; } } if (dropBuffer != NULL) { ezspRemoveQueueEntry(&rxQueue, dropBuffer); ezspFreeBuffer(&rxFree, dropBuffer); ezspTraceEzspFrameId("dropping", dropBuffer->data); ezspTraceEzspVerbose("serialResponseReceived(): ezspFreeBuffer(): drop %u", dropBuffer); ezspTraceEzspVerbose("serialResponseReceived(): ezspErrorHandler(): EZSP_ERROR_QUEUE_FULL"); ezspErrorHandler(EZSP_ERROR_QUEUE_FULL); } return status; }