static msg_t CrossFromModemThread(void *arg) { chRegSetThreadName("CrossFromModem"); (void)arg; uint8_t c; while (!chThdShouldTerminate()) { c = sdGet(&SDGSM); sdPut(&SDDM, c); } return 0; }
static msg_t CrossToModemThread(void *arg) { chRegSetThreadName("CrossToModem"); (void)arg; uint8_t c; palClearPad(IOPORT2, PIOB_GSM_RTS); while (!chThdShouldTerminate()) { c = sdGet(&SDDM); sdPut(&SDGSM, c); } return 0; }
void flushInterface(void) { // empty output buffer while (sdPutWouldBlock(_interface)); // very small sleep to reduce chance of race conditions chThdSleepMilliseconds(1); // empty input buffer while (!sdGetWouldBlock(_interface)) sdGet(_interface); }
/** * RX handler */ static void handle_uart_rx(struct uart_periph *p) { // wait for next incoming byte uint8_t c = sdGet((SerialDriver*)(p->reg_addr)); struct SerialInit *init_struct = (struct SerialInit*)(p->init_struct); chMtxLock(init_struct->rx_mtx); uint16_t temp = (p->rx_insert_idx + 1) % UART_RX_BUFFER_SIZE;; // insert new byte p->rx_buf[p->rx_insert_idx] = c; // check for more room in queue if (temp != p->rx_extract_idx) { p->rx_insert_idx = temp; // update insert index } chMtxUnlock(init_struct->rx_mtx); chSemSignal(init_struct->rx_sem); }
static THD_FUNCTION( esp8266, arg ) { (void)arg; chRegSetThreadName( "esp8266" ); event_listener_t serialListener; /* Registering on the serial driver 6 as event 1, interested in * error flags and data-available only, other flags will not wakeup * the thread. */ chEvtRegisterMaskWithFlags( (struct event_source_t *)chnGetEventSource( &SD6 ), &serialListener, EVENT_MASK( 1 ), SD_FRAMING_ERROR | SD_PARITY_ERROR | CHN_INPUT_AVAILABLE ); while( true ) { // Waiting for any of the events we're registered on. eventmask_t evt = chEvtWaitAny( ALL_EVENTS ); // Serving events. if( evt & EVENT_MASK(1) ) { /* Event from the serial interface, getting serial * flags as first thing. */ eventflags_t flags = chEvtGetAndClearFlags( &serialListener ); //Handling errors first. if( flags & (SD_FRAMING_ERROR | SD_PARITY_ERROR) ) { DPRINT( 4, KRED "FRAMING/PARITY ERROR" ); } if( flags & CHN_INPUT_AVAILABLE ) { char c; c = sdGet( &SD6 ); sdPut( &SD3, c ); } } } }
/** * Read routine */ char get_char (void){ return sdGet(shell_sdp); }