public override MacroResult TranslateCall(MacroCall call) { var args = call.Arguments.Select(ASTHelpers.IgnoreExprSourcePos).ToArray(); if (args.All(a => a.IsValue)) { var sum = call.Arguments.Sum(a => ((Literal.Int)((Expression.Value)a).Value).Value); return(MacroResult.NewMacroOk(Expression.NewValue(Literal.NewInt(sum)))); } else { return(MacroResult.MacroFallback); } }
public MacroResult MacroCompute(Macro macro) { var weeklyKNO3Dose = GramsSalt(macro.Nitrogen, macro.AquaLiters, Percent(KNO3ContentN)); var weeklyKH2PO4Dose = GramsSalt(macro.Phosphorus, macro.AquaLiters, Percent(KH2PO4ContentP)); var NO3Kppm = Ppm(Percent(KNO3ContentK), macro.AquaLiters); var KH2SPO4Kppm = Ppm(Percent(KH2PO4ContentK), macro.AquaLiters); var K2SO4Other = macro.Potassium - (NO3Kppm + KH2SPO4Kppm) > 0 ? macro.Potassium - (NO3Kppm + KH2SPO4Kppm) : 0; var weeklyK2SO4Dose = GramsSalt(K2SO4Other, macro.AquaLiters, Percent(K2SO4ContentK)); var weeklyMgSO4Dose = GramsSalt(macro.Magnesium, macro.AquaLiters, Percent(MgSO47H2OContentMg)); double fertililizerWeeklyDose = 0; fertililizerWeeklyDose += Solubility(weeklyKNO3Dose, KNO3SolubilityGramsPer100Ml); fertililizerWeeklyDose += Solubility(weeklyKH2PO4Dose, KH2PO4SolubilityGramsPer100Ml); fertililizerWeeklyDose += Solubility(weeklyK2SO4Dose, K2SO4SolubilityGramsPer100Ml); fertililizerWeeklyDose += Solubility(weeklyMgSO4Dose, MgSO4SolubilityGramsPer100Ml); fertililizerWeeklyDose = Math.Round(fertililizerWeeklyDose, MidpointRounding.ToEven); while (fertililizerWeeklyDose % macro.TimesAWeek != 0) { fertililizerWeeklyDose++; } var saltMultiplier = macro.ContainerCapacity / fertililizerWeeklyDose; var macroResult = new MacroResult { SingleDose = fertililizerWeeklyDose / macro.TimesAWeek, Kno3 = Math.Round((weeklyKNO3Dose * saltMultiplier), 2), Kh2po4 = Math.Round((weeklyKH2PO4Dose * saltMultiplier), 2), K2so4 = Math.Round((weeklyK2SO4Dose * saltMultiplier), 2), Mgso4 = Math.Round((weeklyMgSO4Dose * saltMultiplier), 2) }; return(macroResult); }