示例#1
0
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;
}
示例#2
0
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);
}
示例#3
0
文件: sir.cpp 项目: Aleyasen/Alaki
/////////////////////////////////////////////////
// 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;
  }
}
示例#4
0
文件: sir.cpp 项目: Aleyasen/Alaki
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());
  }
}
示例#5
0
文件: sir.cpp 项目: Aleyasen/Alaki
// 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;
  }
}