private void OnCommReceive(string command) { // System.Diagnostics.Debug.WriteLine("Recv: " + command); // If there's no data, continue. if (command.Length == 0) { return; } MicroBitMessageReader reader = new MicroBitMessageReader(command); // If there's no data, continue. char evt; if (!reader.ReadChar(out evt)) { return; } _lastMsgRecvTime = DateTime.Now; // Process ping reply messages. switch (evt) { case Protocol.EVT_PING_REPLY: OnEvtPingReply(reader); break; } // Don't read messages other than ping replies until device is ready. if (_status != EDeviceStatus.READY) { return; } // Device is ready. Process remaining message types. switch (evt) { case Protocol.EVT_SYSMSG: OnEvtSysMsg(reader); break; case Protocol.EVT_ACCEL_GESTURE: OnEvtAccelGesture(reader); break; case Protocol.EVT_BUTTON_STATE: OnEvtButtonState(reader); break; case Protocol.EVT_DISPLAY_FREE: OnEvtDisplayFree(reader); break; case Protocol.EVT_PIN_FREE: OnEvtPinFree(reader); break; case Protocol.EVT_SAMPLED_STATE: OnEvtSampledState(reader); break; } }
private void OnEvtSampledState(MicroBitMessageReader reader) { // Copy the current state to the previous state. _prev = _curr; // Read the new current state. while (true) { short accX, accY, accZ; // int accPitch, accRoll; // int heading; int pinCount; int buttonA; int buttonB; PinState[] pins = new PinState[3]; // Read button states if (!reader.Consume('b')) { break; } if (!reader.ReadU8Hex(out buttonA)) { break; } if (!reader.ReadU8Hex(out buttonB)) { break; } // Read accelerometer if (!reader.Consume('a')) { break; } if (!reader.ReadSignedU16Hex(out accX)) { break; } if (!reader.ReadSignedU16Hex(out accY)) { break; } if (!reader.ReadSignedU16Hex(out accZ)) { break; } // if (!reader.ReadU16Hex(out accPitch)) break; // if (!reader.ReadU16Hex(out accRoll)) break; // Read compass // if (!reader.Consume('c')) break; // if (!reader.ReadU16Hex(out heading)) break; // Read input pins if (!reader.Consume('p')) { break; } if (!reader.ReadU8Hex(out pinCount)) { break; } int pinsRemaining = pinCount; // Make sure we're in range. if (pinsRemaining > 3) { break; } while (pinsRemaining > 0) { int pinId, pinValue; char pinMode; if (!reader.ReadU8Hex(out pinId)) { break; } if (pinId > 2) { break; } if (!reader.ReadChar(out pinMode)) { break; } if (pinMode != 'a' && pinMode != 'd') { break; } if (!reader.ReadU16Hex(out pinValue)) { break; } pins[pinId] = new PinState(pinId); pins[pinId].Direction = EPinDirection.Input; pins[pinId].Mode = pinMode == 'a' ? EPinOperatingMode.Analog : EPinOperatingMode.Digital; pins[pinId].Value = pinValue; pinsRemaining--; } // If we didn't read all the pins then something is wrong with the message. if (pinsRemaining > 0) { break; } // Apply button states _curr.Buttons[0].State = (EButtonState)buttonA; _curr.Buttons[1].State = (EButtonState)buttonB; // Apply accelerometer accX = MyMath.Clamp(accX, MinAccel, MaxAccel); accY = MyMath.Clamp(accY, MinAccel, MaxAccel); accZ = MyMath.Clamp(accZ, MinAccel, MaxAccel); Vector3 acc = new Vector3(accY, accX, accZ); acc.Normalize(); _curr.Acc = MyMath.NanProtect(acc, Vector3.Zero); // _curr.AccPitch = accPitch; // _curr.AccRoll = accRoll; // Apply compass // _curr.Heading = heading; // Apply pins for (int i = 0; i < pinCount; ++i) { _curr.Pins[pins[i].Id] = pins[i]; } // Inc generation _curr.Generation += 1; break; } }