bool TRf24Radio::Set(const uint16& NodeId, const TIntPrV& ValIdValPrV) { Notify->OnNotifyFmt(TNotifyType::ntInfo, "Calling multiple SET for node %d ...", NodeId); bool Success = true; const int NMsgs = ceil(double(ValIdValPrV.Len()) / double(VALS_PER_PAYLOAD)); int RemainN = ValIdValPrV.Len(); for (int MsgN = 0; MsgN < NMsgs; MsgN++) { const int PayloadSize = TMath::Mn(RemainN, VALS_PER_PAYLOAD); TVec<TRadioValue> ValV(PayloadSize); for (int ValN = 0; ValN < PayloadSize; ValN++) { const TIntPr& ValIdValPr = ValIdValPrV[MsgN*VALS_PER_PAYLOAD + ValN]; TRadioValue& RadioVal = ValV[ValN]; RadioVal.SetValId((char) ValIdValPr.Val1); RadioVal.SetVal(ValIdValPr.Val2); } TMem Payload; TRadioProtocol::GenSetPayload(ValV, Payload); Success &= Send(NodeId, REQUEST_SET, Payload); RemainN -= VALS_PER_PAYLOAD; } return Success; }
bool TRf24Radio::Set(const uint16& NodeId, const int& ValId, const int& Val) { Notify->OnNotifyFmt(TNotifyType::ntInfo, "Calling SET for node %d, valId: %d, value %d ...", NodeId, ValId, Val); TVec<TRadioValue> ValV(1,1); ValV[0].SetValId((char) ValId); ValV[0].SetVal(Val); TMem Payload; TRadioProtocol::GenSetPayload(ValV, Payload); return Send(NodeId, REQUEST_SET, Payload); }
///////////////////////////////////////////////// // Epidemiological modeling and model fitting void TEpidemModel::RunModel(const TFltV& StartValV, const double& StartT, const double& StopT, const int& NSteps, TVec<TFltV>& OutValV) { TFltV ValV(StartValV), dydx(StartValV.Len()), ValV2(StartValV.Len()); OutValV.Clr(false); for (int v = 0; v < StartValV.Len(); v++) { OutValV.Add(); OutValV[v].Clr(false); OutValV[v].Add(StartValV[v]); } const double h = (StopT-StartT) / NSteps; double x = StartT; for (int k = 0; k < NSteps; k++) { GetDerivs(x, ValV, dydx); RungeKutta(ValV, dydx, x, h, ValV2); for (int v = 0; v < ValV2.Len(); v++) { double X = ValV2[v]; if (X < 0 || _isnan(X) || !_finite(X)) { X = 0; } OutValV[v].Add(X); } ValV = ValV2; x += h; } }
void TEpidemModel::RunEuler(const TFltV& StartValV, const double& StartT, const double& StopT, const int& NSteps, TVec<TFltV>& OutValV) { const double h = (StopT-StartT) / NSteps; TFltV ValV(StartValV), dydx(StartValV.Len()), ValV2(StartValV.Len()); for (int v = 0; v < StartValV.Len(); v++) { OutValV.Add(); OutValV[v].Clr(false); OutValV[v].Add(StartValV[v]); } OutValV.Add(); // x values OutValV.Last().Add(StartT); for (double x = StartT; x <= StopT; x += h) { GetDerivs(x, ValV, dydx); for (int v = 0; v < ValV.Len(); v++) { ValV[v] += h*dydx[v]; OutValV[v].Add(ValV[v]); } OutValV.Last().Add(x+h); } for (int v = 1; v < OutValV.Len(); v++) { IAssert(OutValV[v].Len()==OutValV[v-1].Len()); } }
// run the model internally with 10 times greater resolution void TEpidemModel::RunModel10(const TFltV& StartValV, const double& StartT, const double& StopT, const int& NSteps, TVec<TFltV>& OutValV) { TFltV ValV(StartValV), dydx(StartValV.Len()), ValV2(StartValV.Len()); OutValV.Clr(false); for (int v = 0; v < StartValV.Len(); v++) { OutValV.Add(); OutValV[v].Clr(false); OutValV[v].Add(StartValV[v]); } const double h = (StopT-StartT) / (10*NSteps); double x = StartT; for (int k = 0; k < 10*NSteps; k++) { GetDerivs(x, ValV, dydx); RungeKutta(ValV, dydx, x, h, ValV2); // take values at only every 10th step if (k % 10 == 0) { for (int v = 0; v < ValV2.Len(); v++) { OutValV[v].Add(ValV2[v]); } } ValV = ValV2; x += h; } }