You are here: Forum Home → ANT+ Forums → ANT+ Bike Power → Thread
stCalculatedStdCTFData.ulCTFAverageCadence = (ULONG)(((ulCTFEventCountDiff<<6)*1875)/ulCTFTimeStampDiff);
stCalculatedStdCTFData.ulCTFTorqueFrequency = (ULONG)((((ulCTFTorqueTickStampDiff<<4)*125)/ulCTFTimeStampDiff) - usCTFOffset);
stCalculatedStdCTFData.ulCTFAverageTorque = (ULONG)((10*stCalculatedStdCTFData.ulCTFTorqueFrequency)/pstPage32Data.usCTFSlope);
stCalculatedStdCTFData.ulCTFAveragePower = (ULONG)(((stCalculatedStdCTFData.ulCTFAverageTorque*stCalculatedStdCTFData.ulCTFAverageCadence*BPS_PI_CONSTANT)/15)>>9);
ucCTFEventCountPrev = pstPage32Data.ucCTFEventCount;
usCTFTimeStampPrev = pstPage32Data.usCTFTimeStamp;
usCTFTorqueTickStampPrev = pstPage32Data.usCTFTorqueTickStamp;
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com
case ANT_CRANKSRM_POWER: //0x20 - crank torque (SRM)
{
/// --- Decode ------------------
currentMessage_page0x20.eventCount = stMessage.aucData[2];
currentMessage_page0x20.slope = stMessage.aucData[4] + (stMessage.aucData[3]<<8); // bigendian
currentMessage_page0x20.period = stMessage.aucData[6] + (stMessage.aucData[5]<<8); // bigendian
currentMessage_page0x20.torque = stMessage.aucData[8] + (stMessage.aucData[7]<<8); // bigendian
if (!firstMessage0x20) {
/// ----------calculate with last message ---------------
uint16_t period = currentMessage_page0x20.period - lastMessage_page0x20.period;
uint16_t torque = currentMessage_page0x20.torque - lastMessage_page0x20.torque;
float time = (float)period / (float)2000.00;
if (time && currentMessage_page0x20.slope && period) {
nullCount_page0x20 = 0;
float torque_freq = torque / time - 420/*srm_offset*/;
float nm_torque = 10.0 * torque_freq / currentMessage_page0x20.slope;
float cadence = 2000.0 * 60 * (currentMessage_page0x20.eventCount - lastMessage_page0x20.eventCount) / period;
float power = 3.14159 * nm_torque * cadence / 30;
}
}
...
}
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com
float torque_freq = torque / time - 420/*srm_offset*/;
//replace with
float torque_freq = torque / time - srm_offset
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com
//code causing wrong offset decoding
//NB BIG ENDIAN
pstPage1Data.stBPSCalibrationData.stBPSPage1_CID16_CTFID1_Data.usCID16_CTFID1_OffsetData |= (USHORT)(stMessage.aucData[ucDataOffset+6]<<8);
pstPage1Data.stBPSCalibrationData.stBPSPage1_CID16_CTFID1_Data.usCID16_CTFID1_OffsetData = (USHORT)stMessage.aucData[ucDataOffset+7];
USHORT usCTFOffset = pstPage1Data.stBPSCalibrationData.stBPSPage1_CID16_CTFID1_Data.usCID16_CTFID1_OffsetData;
//good code
uint16_t zeroOffset = stMessage.aucData[8] + (stMessage.aucData[7]<<8);
——————————————————
Free Indoor Cycling Software - https://maximumtrainer.com