/* UCOM bulk EP_IN and EP_OUT endpoints handler */ static ErrorCode_t UCOM_bulk_hdlr(USBD_HANDLE_T hUsb, void *data, uint32_t event) { UCOM_DATA_T *pUcom = (UCOM_DATA_T *) data; switch (event) { /* A transfer from us to the USB host that we queued has completed. */ case USB_EVT_IN: pUcom->usbTxFlags &= ~UCOM_TX_BUSY; break; /* We received a transfer from the USB host . */ case USB_EVT_OUT: pUcom->usbRx_count = USBD_API->hw->ReadEP(hUsb, USB_CDC_OUT_EP, pUcom->usbRx_buff); if(pUcom->usbRx_count){ if(1 == pUcom->usbRx_count){ RingBuffer_Insert(&usb_rxrb, pUcom->usbRx_buff); }else { RingBuffer_InsertMult(&usb_rxrb, pUcom->usbRx_buff, pUcom->usbRx_count); } } if (pUcom->usbRxFlags & UCOM_RX_BUF_QUEUED) { pUcom->usbRxFlags &= ~UCOM_RX_BUF_QUEUED; if (pUcom->usbRx_count != 0) { pUcom->usbRxFlags |= UCOM_RX_BUF_FULL; } } break; case USB_EVT_OUT_NAK: /* queue free buffer for RX */ if ((pUcom->usbRxFlags & (UCOM_RX_BUF_FULL | UCOM_RX_BUF_QUEUED)) == 0) { pUcom->usbRx_count = USBD_API->hw->ReadReqEP(hUsb, USB_CDC_OUT_EP, pUcom->usbRx_buff, UCOM_RX_BUF_SZ); if(pUcom->usbRx_count){ if(1 == pUcom->usbRx_count){ RingBuffer_Insert(&usb_rxrb, pUcom->usbRx_buff); }else { RingBuffer_InsertMult(&usb_rxrb, pUcom->usbRx_buff, pUcom->usbRx_count); } } pUcom->usbRxFlags |= UCOM_RX_BUF_QUEUED; } break; default: break; } return LPC_OK; }
int RFpushDataToBuffer(unsigned char *data, int count) { int ret = 0; /* Add additional data to transmit ring buffer if possible */ while (ret < count) { int inserted = RingBuffer_InsertMult(&nordicTxBuffer, (data + ret), (count - ret)); if (inserted == 0) { break; } ret += inserted; //If the buffer has enough data to be sent, try to send it right away while (RingBuffer_GetCount(&nordicTxBuffer) >= NRF24L01P_TX_FIFO_SIZE) { if (!RFmoveBufferToTransmission(NRF24L01P_PIPE_P0)) { break; } } } if (RingBuffer_GetCount(&nordicTxBuffer) > 0) { //If there is data to be sent, start a timeout for transmission //If there was a previous transmission no need to do this if (nRF24L01P.mode & NRF24L01P_MODE_TX) { nRF24L01P.transmissionTimeout = NRF24L01P_TX_TIMEOUT; } else if (nRF24L01P.mode & NRF24L01P_MODE_RX) { nRF24L01P.transmissionTimeout = NRF24L01P_TX_TIMEOUT_ACK; } } return count - ret; }
/* Populate a transmit ring buffer and start UART transmit */ uint32_t Chip_UART_SendRB(LPC_USART_T *pUART, RINGBUFF_T *pRB, const void *data, int bytes) { uint32_t ret; uint8_t *p8 = (uint8_t *) data; /* Don't let UART transmit ring buffer change in the UART IRQ handler */ Chip_UART_IntDisable(pUART, UART_IER_THREINT); /* Move as much data as possible into transmit ring buffer */ ret = RingBuffer_InsertMult(pRB, p8, bytes); Chip_UART_TXIntHandlerRB(pUART, pRB); /* Add additional data to transmit ring buffer if possible */ ret += RingBuffer_InsertMult(pRB, (p8 + ret), (bytes - ret)); /* Enable UART transmit interrupt */ Chip_UART_IntEnable(pUART, UART_IER_THREINT); return ret; }
inline uint32_t skynet_cdc_write_buffered(uint8_t *pBuf, uint32_t len) { return RingBuffer_InsertMult(&usb_tx_ringbuf, pBuf, len); }
void main(int argc, int* argv) { int i; int rv; start_gui("hellO",args,arg,0,DEF_CB,"draw_hello",draw_hello,DONE); create_window("Hello",0,0,200,100,0,SET_PROP,"ON_REDRAW",1,"draw_hello",DONE); run_event_loop(&rv); printf("Opening %s... ",BTSERIAL); //can_board = fopen(BTSERIAL,"r+"); can_board = open(BTSERIAL,O_RDWR|O_NONBLOCK); hdlc_frame = malloc(sizeof(HDLC_OBJ_T)); ringbuffer = malloc(sizeof(RINGBUFF_T)); RingBuffer_Init(ringbuffer, rb_data, rb_itemSize, RB_LEN); printf("Ringbuffer initialized\r\n"); hdlc_init(); if (can_board != 0) { printf("Success\r\n"); printf("1 - Send command\r\n" "2 - Listen only\r\n"); while(1) { if(inputAvailable()) { printf("Input available\r\n"); scanf("%d",&input); if(input == 1) { sendCommand(); } else if (input == 2) { while(1) { //fscanf(can_board, "%s",(char *)buffer); numread = read(can_board,buffer,64); if(numread > 0) { printf("%s\r\n",(char *)buffer); } } } printf("1 - Send command\r\n" "2 - Listen only\r\n"); } // else { // printf("no input available"); // } //numread = fread(buffer,1,64,can_board); numread = read(can_board,buffer,64); if(numread > 0) { printf("Read something:"); RingBuffer_InsertMult(ringbuffer, buffer,numread); for(i = 0; i< numread; i++){ printf(" %x",buffer[i]); } printf("\r\n"); hdlc_frame_parser(ringbuffer); } else { printf("Nothing read\r\n"); } sleep(1); } // fclose(can_board); close(can_board); } return; }