/// <summary> /// /// </summary> /// <param name="validConditionCheck"></param> /// <param name="data_byte"></param> /// <param name="passState"></param> /// <param name="failState"></param> /// <returns></returns> void processNextState(bool validConditionCheck, byte data_byte, MiltiWiiPacketState passState, MiltiWiiPacketState failState) { // detemrine if the packet check is valid if (validConditionCheck == true) { // if condition is true, then add the data to the packes and update the next state m_packetData[m_length_of_packet++] = data_byte; m_packetParserState = passState; } else { m_packetParserState = failState; m_length_of_packet = 0; } }
/// <summary> /// /// </summary> /// <param name="data_byte"></param> /// <returns></returns> void processHeaderCommand(byte data_byte) { m_packetData[m_length_of_packet++] = data_byte; m_checksum ^= data_byte; // determine if there is data associated with the packet if (m_dataSize == 0) m_packetParserState = MiltiWiiPacketState.CHECKSUM; else m_packetParserState = MiltiWiiPacketState.COMMAND_DATA; }
/// <summary> /// /// </summary> /// <param name="data_byte"></param> /// <returns></returns> void processDataSize(byte data_byte) { // now we are expecting the payload size if (data_byte > INBUF_SIZE) // Data is too large go back to idle { m_packetParserState = MiltiWiiPacketState.IDLE; m_length_of_packet = 0; } else { m_packetParserState = MiltiWiiPacketState.HEADER_COMMAND; m_dataSize = data_byte; m_checksum = 0; m_offset = 0; m_checksum ^= data_byte; m_packetData[m_length_of_packet++] = data_byte; } }
/// <summary> /// /// </summary> /// <param name="data_byte"></param> void processCommandData(byte data_byte) { m_checksum ^= data_byte; m_packetData[m_length_of_packet++] = data_byte; m_offset++; if (m_offset == m_dataSize) m_packetParserState = MiltiWiiPacketState.CHECKSUM; }
/// <summary> /// /// </summary> /// <param name="data_byte"></param> void processChecksum(byte data_byte) { m_packetData[m_length_of_packet++] = data_byte; if (m_checksum == data_byte) { // compare calculated and transferred checksum if (m_packetData[2] == '<') { m_packetParserState = MiltiWiiPacketState.VALID_TX_CMD; } else { m_packetParserState = MiltiWiiPacketState.VALID_RX_CMD; } } else { m_packetParserState = MiltiWiiPacketState.IDLE; m_length_of_packet = 0; } }
/// <summary> /// /// </summary> public MultiWiiPacket() { m_packetData = new byte[255]; m_length_of_packet = 0; m_packetParserState = MiltiWiiPacketState.IDLE; }