private void OnEvtButtonState(MicroBitMessageReader reader) { while (true) { int button; int state; if (!reader.ReadU8Hex(out button)) { break; } if (!reader.ReadU8Hex(out state)) { break; } if (button == (int)EButton.A) { _curr.Buttons[0].State = (EButtonState)state; } if (button == (int)EButton.B) { _curr.Buttons[1].State = (EButtonState)state; } _curr.Generation += 1; break; } }
private void OnEvtAccelGesture(MicroBitMessageReader reader) { while (true) { int gesture; if (!reader.ReadU8Hex(out gesture)) { break; } _curr.AccGesture = (EAccelerometerGesture)gesture; _curr.Generation += 1; break; } }
private void OnEvtPingReply(MicroBitMessageReader reader) { while (true) { if (!reader.ReadU8Hex(out _version)) { break; } if (_version == KoduMicroBitVersion) { _status = EDeviceStatus.READY; } 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; } }