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; } }
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; } } }