VC31 explanation
Espruino recently added a blob from the manufacturer of the HRM sensor, VCare, to improve its accuracy. This post will try to explain the Algo_Input function.
Decompilation
void Algo_Input(int* param_1, int param_2, int param_3, int param_4)
{
undefined4 uVar1;
int iVar2;
int iVar3;
int iVar4;
int iVar5;
int iVar6;
uint uVar7;
uint uVar8;
int iVar9;
uint uVar10;
bool bVar11;
bool bVar12;
undefined4 uVar13;
int* piVar14;
int iVar15;
undefined4 local_c0[3];
int local_b4;
undefined auStack_ac[96];
undefined4 local_4c;
undefined4 local_48[2];
int local_40;
int local_3c;
undefined4 local_38;
int* piStack_34;
int iStack_30;
int iStack_2c;
int local_28;
local_4c = 0;
local_48[0] = 0;
local_40 = 0;
local_3c = 0;
isBusy = 1;
uVar8 = 0;
uVar10 = 0;
interTime = interTime + param_2;
iVar2 = interCnt + 1;
if (param_2 > 60) {
iVar2 = interCnt;
}
interCnt = iVar2;
piStack_34 = param_1;
iStack_30 = param_2;
iStack_2c = param_3;
local_28 = param_4;
if (interTime > 970) {
uVar8 = 25 - interCnt;
if ((int)uVar8 < 0) {
uVar8 = 0;
}
interCnt = 0;
interTime = 0;
if ((int)uVar8 < 18) {
if ((int)uVar8 < 1)
goto label_6;
} else {
uVar8 = 18;
}
uVar10 = 1;
}
do {
if (uVar8 == 0 || uVar10 == 0) {
preRawdata._12_4_ = param_1[3];
preRawdata._16_4_ = param_1[4];
preRawdata._0_4_ = *param_1;
preRawdata._4_4_ = param_1[1];
preRawdata._8_4_ = param_1[2];
if (param_3 == 18) {
preRawdata._0_4_ = preRawdata._0_4_ << 2;
preRawdata._4_4_ = preRawdata._4_4_ << 2;
preRawdata._8_4_ = preRawdata._8_4_ << 2;
}
}
if ((uVar8 == 0) && (uVar10 != 0)) {
preRawdata._12_4_ = preRawdata._12_4_ + 4096;
}
modle5_2(preRawdata, local_c0, &local_3c);
iVar2 = local_b4;
if (preAccnorm == 0) {
preAccnorm = local_3c;
}
iVar9 = local_3c - preAccnorm;
bus = iVar9 * 16;
if (bus < 0) {
bus = iVar9 * -16;
}
prePPGUC = prePPGUC + ((bus - prePPGUC) * 261 + 16384 >> 15);
if (prePPGUC > 255) {
prePPGUC = 256;
}
if (prePPGUC < -255) {
prePPGUC = -256;
}
if (iVar9 < 0) {
iVar9 = -iVar9;
}
preAccnorm = local_3c;
if (accGapMax <= iVar9) {
accGapMax = iVar9;
}
if (param_3 == 1) {
param_3 = 2;
label_1:
if (prePPGAfterFilter == 0) {
prePPGAfterFilter = local_b4;
}
iVar3 = prePPGAfterFilter - local_b4;
if (iVar3 < 0) {
iVar3 = -iVar3;
}
if (iVar3 > 4799) {
ppgPower25Hz = local_b4;
local_b4 = prePPGAfterFilter;
}
prePPGAfterFilter = iVar2;
} else if (param_3 == 2)
goto label_1;
uVar1 = modle5_11(local_b4);
PPGpowerReal = modle5_10(local_b4);
modle5_17(local_c0, param_3, iVar9);
iVar2 = modle5_1();
iVar9 = modle5_9(preRawdata);
iVar3 = modle5_18(preRawdata, local_c0[0]);
local_38 = modle5_7();
iVar4 = modle5_3(iVar3);
bigbus = iVar4;
modle5_13(iVar2 << 4, RLCGroup, auStack_ac);
oneSecondCnt = oneSecondCnt + '';
if (prePPGUC < 96) {
absoluteStillCnt = absoluteStillCnt + 1;
} else {
absoluteStillCnt = 0;
}
if (local_28 == 0) {
absoluteStillCnt = 0;
} else if (199 < absoluteStillCnt) {
absoluteStillCnt = 200;
}
if ('' < oneSecondCnt) {
oneSecondCnt = '