/*************************************************************************************************** * @fn MT_TransportSend * * @brief Fill in SOP and FCS then send out the msg * * @param uint8 *pBuf - pointer to the message that contains CMD, length, data and FCS * * @return None ***************************************************************************************************/ void MT_TransportSend(uint8 *pBuf) { uint8 *msgPtr; uint8 dataLen = pBuf[0]; /* Data length is on byte #1 from the pointer */ /* Move back to the SOP */ msgPtr = pBuf-1; /* Insert SOP */ msgPtr[0] = MT_UART_SOF; /* Insert FCS */ msgPtr[SPI_0DATA_MSG_LEN - 1 + dataLen] = MT_UartCalcFCS (pBuf, (3 + dataLen)); /* Send to UART */ #ifdef MT_UART_DEFAULT_PORT HalUARTWrite(MT_UART_DEFAULT_PORT, msgPtr, dataLen + SPI_0DATA_MSG_LEN); #endif /* Deallocate */ osal_msg_deallocate(msgPtr); }
/*************************************************************************************************** * @fn MT_UartProcessZToolData * * @brief | SOP | Data Length | CMD | Data | FCS | * | 1 | 1 | 2 | 0-Len | 1 | * * Parses the data and determine either is SPI or just simply serial data * then send the data to correct place (MT or APP) * * @param port - UART port * event - Event that causes the callback * * * @return None ***************************************************************************************************/ void MT_UartProcessZToolData ( uint8 port, uint8 event ) { uint8 ch; uint8 bytesInRxBuffer; (void)event; // Intentionally unreferenced parameter while (Hal_UART_RxBufLen(port)) { HalUARTRead (port, &ch, 1); switch (state) { case SOP_STATE: if (ch == MT_UART_SOF) state = LEN_STATE; break; case LEN_STATE: LEN_Token = ch; tempDataLen = 0; /* Allocate memory for the data */ pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t ) + MT_RPC_FRAME_HDR_SZ + LEN_Token ); if (pMsg) { /* Fill up what we can */ pMsg->hdr.event = CMD_SERIAL_MSG; pMsg->msg = (uint8*)(pMsg+1); pMsg->msg[MT_RPC_POS_LEN] = LEN_Token; state = CMD_STATE1; } else { state = SOP_STATE; return; } break; case CMD_STATE1: pMsg->msg[MT_RPC_POS_CMD0] = ch; state = CMD_STATE2; break; case CMD_STATE2: pMsg->msg[MT_RPC_POS_CMD1] = ch; /* If there is no data, skip to FCS state */ if (LEN_Token) { state = DATA_STATE; } else { state = FCS_STATE; } break; case DATA_STATE: /* Fill in the buffer the first byte of the data */ pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen++] = ch; /* Check number of bytes left in the Rx buffer */ bytesInRxBuffer = Hal_UART_RxBufLen(port); /* If the remain of the data is there, read them all, otherwise, just read enough */ if (bytesInRxBuffer <= LEN_Token - tempDataLen) { HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen], bytesInRxBuffer); tempDataLen += bytesInRxBuffer; } else { HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen], LEN_Token - tempDataLen); tempDataLen += (LEN_Token - tempDataLen); } /* If number of bytes read is equal to data length, time to move on to FCS */ if ( tempDataLen == LEN_Token ) state = FCS_STATE; break; case FCS_STATE: FSC_Token = ch; /* Make sure it's correct */ if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ + LEN_Token) == FSC_Token)) { osal_msg_send( App_TaskID, (byte *)pMsg ); } else { /* deallocate the msg */ osal_msg_deallocate ( (uint8 *)pMsg ); } /* Reset the state, send or discard the buffers at this point */ state = SOP_STATE; break; default: break; } } }
/*************************************************************************************************** * @fn MT_ProcessIncomingCommand * * @brief * * Process Event Messages. * * @param byte *msg - pointer to event message * * @return ***************************************************************************************************/ void MT_ProcessIncomingCommand( mtOSALSerialData_t *msg ) { byte deallocate; byte *msg_ptr; byte len; /* A little setup for AF, CB_FUNC and MT_SYS_APP_RSP_MSG */ msg_ptr = msg->msg; deallocate = true; /* Use the first byte of the message as the command ID */ switch ( msg->hdr.event ) { case CMD_SERIAL_MSG: MT_ProcessIncoming(msg->msg); break; case CMD_DEBUG_MSG: MT_ProcessDebugMsg( (mtDebugMsg_t *)msg ); break; case CB_FUNC: /* Build SPI message here instead of redundantly calling MT_BuildSPIMsg because we have copied data already in the allocated message */ /* msg_ptr is the beginning of the intended SPI message */ len = SPI_0DATA_MSG_LEN + msg_ptr[DATALEN_FIELD]; /* FCS goes to the last byte in the message and is calculated over all the bytes except FCS and SOP */ msg_ptr[len-1] = MT_UartCalcFCS(msg_ptr + 1, (byte)(len-2)); #ifdef MT_UART_DEFAULT_PORT HalUARTWrite ( MT_UART_DEFAULT_PORT, msg_ptr, len ); #endif break; case CMD_DEBUG_STR: MT_ProcessDebugStr( (mtDebugStr_t *)msg ); break; #if !defined ( NONWK ) case MT_SYS_APP_RSP_MSG: len = SPI_0DATA_MSG_LEN + msg_ptr[DATALEN_FIELD]; MTProcessAppRspMsg( msg_ptr, len ); break; #endif // NONWK #if defined (MT_UTIL_FUNC) #if defined ZCL_KEY_ESTABLISH case ZCL_KEY_ESTABLISH_IND: MT_UtilKeyEstablishInd((keyEstablishmentInd_t *)msg); break; #endif #endif #ifdef MT_ZDO_CB_FUNC case ZDO_STATE_CHANGE: MT_ZdoStateChangeCB((osal_event_hdr_t *)msg); break; #endif default: break; } if ( deallocate ) { osal_msg_deallocate( (uint8 *)msg ); } }
void MT_UartProcessZToolByte ( uint8 ch ) { switch (state) { case SOP_STATE: if (ch == MT_UART_SOF) state = LEN_STATE; break; case LEN_STATE: LEN_Token = ch; tempDataLen = 0; /* Allocate memory for the data */ pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSerialData_t ) + MT_RPC_FRAME_HDR_SZ + LEN_Token ); if (pMsg) { /* Fill up what we can */ pMsg->hdr.event = CMD_SERIAL_MSG; pMsg->msg = (uint8*)(pMsg+1); pMsg->msg[MT_RPC_POS_LEN] = LEN_Token; state = CMD_STATE1; } else { state = SOP_STATE; return; } break; case CMD_STATE1: pMsg->msg[MT_RPC_POS_CMD0] = ch; state = CMD_STATE2; break; case CMD_STATE2: pMsg->msg[MT_RPC_POS_CMD1] = ch; /* If there is no data, skip to FCS state */ if (LEN_Token) { state = DATA_STATE; } else { state = FCS_STATE; } break; case DATA_STATE: /* Fill in the buffer the first byte of the data */ pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen++] = ch; /* If number of bytes read is equal to data length, time to move on to FCS */ if ( tempDataLen == LEN_Token ) state = FCS_STATE; break; case FCS_STATE: FSC_Token = ch; /* Make sure it's correct */ if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ + LEN_Token) == FSC_Token)) { osal_msg_send( App_TaskID, (byte *)pMsg ); } else { /* deallocate the msg */ osal_msg_deallocate ( (uint8 *)pMsg ); } /* Reset the state, send or discard the buffers at this point */ state = SOP_STATE; break; default: break; } }