Example #1
0
        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;
            }
        }
Example #2
0
 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;
     }
 }