static void ICACHE_FLASH_ATTR user_rx_task(os_event_t *events) { if(events->sig == 0){ uint8 fifo_len = (READ_PERI_REG(UART_STATUS(UART0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT; uint8 d_tmp = 0; uint8 idx=0; for(idx=0;idx<fifo_len;idx++) { d_tmp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF; uart_tx_one_char(UART0, d_tmp); if( has_space() ) { serial_buffer[putpos++ & POS_MASK] = d_tmp; } } WRITE_PERI_REG(UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR); uart_rx_intr_enable(UART0); if( serial_datalen() && user_rx_callback ) { user_rx_callback(serial_datalen()); } }
/********************************************************* * recvTask: got BRK terminated data sequence * * needs a bit more polish... * * *******************************************************/ static void ICACHE_FLASH_ATTR recvTask(os_event_t *events) { uint8_t crc = 0; uint8_t *pRcvMsgBuff, *pReadPos, *pWritePos; uint8_t *ems_gw_buffer, ems_gw_buffer_size; uint8_t *pMsg, *msg; uint8_t ems_raw_buffer[64], ems_raw_size; // buffer w/o debug header WRITE_PERI_REG(0X60000914, 0x73); // WTD reset pMsg = msg = (uint8_t *)os_zalloc(256); // msg buffer for debug ems_gw_buffer = msg; // should hold the real ems gw buffer ems_raw_size = 0; // get UART MsgBuff info pRcvMsgBuff = pReadPos = emsRxBuf->pRcvMsgBuff; pWritePos = emsRxBuf->pWritePos; // allocate new UART Rx buffer emsRxBuf->BuffState = EMPTY; emsRxBuf->pRcvMsgBuff = (uint8_t *)os_zalloc(emsRxBuf->RcvBuffSize); emsRxBuf->pReadPos = emsRxBuf->pWritePos = emsRxBuf->pRcvMsgBuff; uart_rx_intr_enable(UART0); // enable RX INTR // process EMS telegram up to CRC char while (pReadPos < (pWritePos -2)) { uint8_t byte, d = 0; // check for debug header if ( pReadPos[0] == (uint8_t)0x1a && pReadPos[1] == (uint8_t)0xe5 ) { EMS_DebugHeader emsDbgHdr; os_memcpy(&emsDbgHdr, pReadPos, sizeof(EMS_DebugHeader)); if (flash_param->ems_debug) { static uint32_t laststamp = 0; // last pckg receive time uint32_t rxDelta = emsDbgHdr.rtc_time - laststamp; // Telegram Delta in uS laststamp = emsDbgHdr.rtc_time; pMsg += os_sprintf(pMsg, "[%10u.%06u %3d.%03d %03x %3d] ", emsDbgHdr.rtc_time / 1000000, emsDbgHdr.rtc_time % 1000000, rxDelta / 1000, rxDelta % 1000, emsDbgHdr.uart_int_st, emsDbgHdr.uart_fifo_len & 0xff); } pReadPos += sizeof(EMS_DebugHeader); } ems_raw_buffer[ems_raw_size++] = byte = *(pReadPos++); // calculate checksum if (crc & 0x80) { crc ^= 0xc; d = 1; } crc <<= 1; crc &= 0xfe; crc |= d; crc = crc ^ byte; if (flash_param->ems_debug) pMsg += os_sprintf(pMsg, "%02x ", byte); // debug msg } // prepend checksum to recv buffer, overwrites brk char pWritePos[-1] = crc; if (flash_param->ems_debug) { if (ems_raw_size > 2) { pMsg += os_sprintf(pMsg, "? %02x", *(pReadPos++)); // emit EMS CRC pMsg += os_sprintf(pMsg, ":%02x", *(pReadPos++)); // CRC } *pMsg++ = '\n'; *pMsg = 0x00; } ems_gw_buffer_size = pMsg - msg; if (flash_param->ems_enable) { // send rxBuf over the wire... int cnt; for (cnt = 0; cnt < MAX_CONN; ++cnt) { if (connData[cnt].conn) { if (ems_raw_size > 2) { if (flash_param->ems_debug) os_printf("#%d ", cnt); espconn_sent(connData[cnt].conn, ems_gw_buffer, ems_gw_buffer_size); } else { // handle poll request if (ems_raw_buffer[0] == 0x8b) { // we got a poll request // TODO: send an empty response package } } } } } if (flash_param->ems_debug) os_printf(msg); os_free(msg); os_free(pRcvMsgBuff); // free RX FIFO Buffer }