Example #1
0
        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);
        }