protected override void handleNonRxFailChannelResponse(ANT_Managed_Library.ANT_Response response)
        {
            if (response.responseID == (byte)ANT_Managed_Library.ANT_ReferenceLibrary.ANTMessageID.BROADCAST_DATA_0x4E)
            {
                int eventDiff     = 0;
                int timeDiff_1024 = 0;

                ushort curSpdTime_1024 = (ushort)(response.messageContents[5] + (response.messageContents[6] << 8));
                ushort curSpdEventNum  = (ushort)(response.messageContents[7] + (response.messageContents[8] << 8));

                if (isInitialized)
                {
                    //Calculate Speed
                    eventDiff = (int)curSpdEventNum - (int)lastSpdEventNum;
                    if (eventDiff != 0)
                    {
                        if (eventDiff < 0) //check for rollover
                        {
                            eventDiff = 65536 + eventDiff;
                        }

                        noSpeedEventCount = 0; //reset counter

                        //Distance change
                        calculatedDistIncrease = (double)eventDiff * wheelCircumfrence_m;

                        timeDiff_1024 = (int)curSpdTime_1024 - (int)lastSpdTime_1024;
                        if (timeDiff_1024 != 0)    //Ignore speed if time hasn't changed
                        {
                            if (timeDiff_1024 < 0) //check for rollover
                            {
                                timeDiff_1024 = 65536 + timeDiff_1024;
                            }

                            calculatedSpeed = calculatedDistIncrease / ((double)timeDiff_1024 / 1024); // distInc / time/1024 ticks/sec = m/s
                        }
                    }
                    else //Speed event unchanged
                    {
                        ++noSpeedEventCount;
                        if (noSpeedEventCount >= MAX_NO_EVENT_STOP_COUNT) //Are we stopped?
                        {
                            noSpeedEventCount = MAX_NO_EVENT_STOP_COUNT;  //Ensure we don't roll over
                            calculatedSpeed   = 0;
                        }
                        calculatedDistIncrease = 0; //If the wheel hasn't rotated, we haven't gone anywhere
                    }

                    incrementDistanceAndUpdate(calculatedDistIncrease, speedMs: calculatedSpeed);
                }
                else
                {
                    isInitialized = true;
                }

                // Update previous values
                lastSpdTime_1024 = curSpdTime_1024;
                lastSpdEventNum  = curSpdEventNum;
            }
        }
Example #2
0
        public override void handleChannelResponse(ANT_Managed_Library.ANT_Response response)
        {
            if (response.responseID == (byte)ANT_Managed_Library.ANT_ReferenceLibrary.ANTMessageID.BROADCAST_DATA_0x4E)
            {
                //In this decode we ignore page change toggle and page type, since the info we need is transmitted on every page


                int eventDiff     = 0;
                int timeDiff_1024 = 0;

                // Decode data page
                ushort curCadTime_1024 = (ushort)(response.messageContents[5] + (response.messageContents[6] << 8));
                ushort curCadEventNum  = (ushort)(response.messageContents[7] + (response.messageContents[8] << 8));

                // Initialize previous values on first message received
                if (isInitialized) //Otherwise just init values below
                {
                    //Calculate Cadence
                    eventDiff = (int)curCadEventNum - (int)lastCadEventNum;
                    if (eventDiff != 0)
                    {
                        if (eventDiff < 0) //check for rollover
                        {
                            eventDiff = 65536 + eventDiff;
                        }

                        noCadenceEventCount = 0; //reset counter

                        timeDiff_1024 = (int)curCadTime_1024 - (int)lastCadTime_1024;
                        if (timeDiff_1024 != 0)    //Ignore cadence if time hasn't changed
                        {
                            if (timeDiff_1024 < 0) //check for rollover
                            {
                                timeDiff_1024 = 65536 + timeDiff_1024;
                            }

                            calculatedCadence = (double)eventDiff / ((double)timeDiff_1024 / 61440); //events / time/61440 ticks/min = rpm
                        }
                    }
                    else //Cadence event unchanged
                    {
                        ++noCadenceEventCount;
                        if (noCadenceEventCount >= MAX_NO_EVENT_STOP_COUNT) //Are we coasting?
                        {
                            noCadenceEventCount = MAX_NO_EVENT_STOP_COUNT;  //Ensure we don't roll over
                            calculatedCadence   = 0;
                        }
                    }
                }
                else
                {
                    isInitialized = true;
                }

                // Update previous values
                lastCadTime_1024 = curCadTime_1024;
                lastCadEventNum  = curCadEventNum;

                //Ensure speed sensor is always running so we can always get the values
                if (!speedSensor.isInitialized)  //If speed sensor is not receiving data, we need to push our data
                {
                    incrementDistanceAndUpdate(0, cadence: calculatedCadence);
                }
                else if (!speedSensor.isRunning()) //If the speed sensor is receiving data, start it to push data to us
                {
                    speedSensor.start(newSpeedSensorPacket);
                }
            }
        }
        protected override void handleNonRxFailChannelResponse(ANT_Managed_Library.ANT_Response response)
        {
            if (response.responseID == (byte)ANT_Managed_Library.ANT_ReferenceLibrary.ANTMessageID.BROADCAST_DATA_0x4E)
            {
                int usDistance16;
                int usCadence;
                int usSpeed256;
                int ucStrideCount;

                switch (response.messageContents[1])                                     //Switch on pageNumber
                {
                case 1:                                                                  //Main page
                    usDistance16  = 0xFF0 & (response.messageContents[4] << 4);          // Distance, integer portion, in 1/16 seconds
                    usDistance16 += 0x00F & ((response.messageContents[5] & 0xF0) >> 4); // Distance, fractional part, in 1/16 seconds
                    usSpeed256    = 0xF00 & ((response.messageContents[5] & 0x0F) << 8); // Speed, in 1/256 seconds
                    usSpeed256   += 0x0FF & (response.messageContents[6]);               // Speed, fractional part, in 1/256 seconds
                    ucStrideCount = 0xFF & (response.messageContents[7]);                // Stride count
                    if (!mIsInitialized)
                    {                                                                    // Initialize previous values for calculation of cumulative values
                        ucPreviousStrideCount = ucStrideCount;
                        usPreviousDistance16  = usDistance16;
                        mIsInitialized        = true;
                    }
                    else if (ucStrideCount != ucPreviousStrideCount)      // Update data if dealing with a new event
                    {
                        // Update cumulative stride count
                        if (ucStrideCount > ucPreviousStrideCount)
                        {
                            ulAcumStrideCount += (ucStrideCount - ucPreviousStrideCount);
                        }
                        else
                        {
                            ulAcumStrideCount += 0xFF & (0xFF - ucPreviousStrideCount + ucStrideCount + 1);
                        }


                        // Determine increase in distance
                        double distIncrease;
                        if (usDistance16 > usPreviousDistance16)
                        {
                            distIncrease = (double)(usDistance16 - usPreviousDistance16) / 16;
                        }
                        else
                        {
                            distIncrease = (double)((0xFFF - usPreviousDistance16 + usDistance16 + 1) & 0x0FFF) / 16;
                        }


                        ucPreviousStrideCount = ucStrideCount;
                        usPreviousDistance16  = usDistance16;

                        incrementDistanceAndUpdate(distIncrease, (double)usSpeed256 / 256, lastCadence);
                    }

                    break;

                case 2:
                case 3:
                case 4:
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                case 10:
                case 11:
                case 12:
                case 13:
                case 14:
                case 15:                                                               // Intentional fall thru (pages 2 - 15 should have bytes 3,4,5, and 7 of the template on Page 2).
                    usCadence   = (response.messageContents[4] << 4);                  // Cadence (1/16 seconds)
                    usCadence  += (response.messageContents[5] & 0xF0) >> 4;
                    usSpeed256  = 0xF00 & ((response.messageContents[5] & 0x0F) << 8); // Speed, in 1/256 seconds
                    usSpeed256 += 0x0FF & (response.messageContents[6]);               // Speed, fractional part, in 1/256 seconds

                    //Use cadence value if it is valid
                    if (usCadence == 0)
                    {
                        lastCadence = -1;
                    }
                    else
                    {
                        lastCadence = (double)usCadence / 16;
                    }
                    break;

                default:
                    return;
                }
            }
        }