Esempio n. 1
0
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());
        }
    }
Esempio n. 2
0
/*********************************************************
 * 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
}