public void AddWaterTank(WaterTanks.FluidTank waterTank)
 {
     Message.AddValue(ADMService.MessageSchema.DEVICE_ID, waterTank.ID);
     Message.AddValue(ADMService.MessageSchema.DEVICE_NAME, waterTank.Name);
     Message.AddValue("Capacity", waterTank.Capacity);
     Message.AddValue("PercentFull", waterTank.PercentFull);
     Message.AddValue("Remaining", waterTank.Remaining);
     Message.AddValue("Level", waterTank.Level);
     Message.AddValue("Distance", waterTank.Distance);
     Message.AddValue("Enabled", waterTank.Enabled);
 }
        override public bool HandleCommand(Connection cnn, Message message, String cmd, List <Object> args, Message response)
        {
            //return value of true/false determines whether response message is broadcast or not

            EngineRoomMessageSchema schema = new EngineRoomMessageSchema(response);
            Engine        engine;
            List <Engine> engines;
            bool          enable;

            Pump pump;

            switch (cmd)
            {
            case EngineRoomMessageSchema.COMMAND_TEST:
                //schema.AddPompaCelup(_pompaCelup);
                //Message alert = BBAlarmsService.BBAlarmsService.EngineRoomMessageSchema.RaiseAlarm(_pompaCelup.ID, true, "Test raising alarm");
                //Broadcast(alert);

                //Message
                return(false);

            case EngineRoomMessageSchema.COMMAND_LIST_ENGINES:
                engines = GetEngines();
                List <String> engineIDs = new List <String>();

                foreach (Engine eng in engines)
                {
                    if (eng.Enabled)
                    {
                        engineIDs.Add(eng.ID);
                    }
                }
                response.AddValue("Engines", engineIDs);
                return(true);

            case EngineRoomMessageSchema.COMMAND_ENGINE_STATUS:
                if (args == null || args.Count == 0 || args[0] == null)
                {
                    throw new Exception("No engine specified");
                }
                engine = GetEngine(args[0].ToString());
                if (engine == null)
                {
                    throw new Exception("Cannot find engine with ID " + args[0]);
                }
                schema.AddEngine(engine);

                if (engine.RPM != null)
                {
                    Task.Run(() => {
                        System.Threading.Thread.Sleep(250);
                        EngineRoomMessageSchema sc = new EngineRoomMessageSchema(new Message(MessageType.DATA, response.Target));
                        sc.AddRPM(engine.RPM);
                        SendMessage(sc.Message);
                    });
                }

                if (engine.OilSensor != null)
                {
                    Task.Run(() => {
                        System.Threading.Thread.Sleep(250);
                        EngineRoomMessageSchema sc = new EngineRoomMessageSchema(new Message(MessageType.DATA, response.Target));
                        sc.AddOilSensor(engine.OilSensor);
                        SendMessage(sc.Message);
                    });
                }

                if (engine.TempSensor != null)
                {
                    Task.Run(() => {
                        System.Threading.Thread.Sleep(250);
                        EngineRoomMessageSchema sc = new EngineRoomMessageSchema(new Message(MessageType.DATA, response.Target));
                        sc.AddDS18B20Sensor(engine.TempSensor);
                        SendMessage(sc.Message);
                    });
                }

                return(true);

            case EngineRoomMessageSchema.COMMAND_ENABLE_ENGINE:
                if (args == null || args.Count < 1)
                {
                    throw new Exception("No engine specified");
                }
                engine = GetEngine(args[0].ToString());
                if (engine == null)
                {
                    throw new Exception("Cannot find engine with ID " + args[0]);
                }
                enable = args.Count > 1 ? System.Convert.ToBoolean(args[1]) : true;
                if (enable != engine.Enabled)
                {
                    engine.Enable(enable);
                    EngineRoomServiceDB.LogEventType let = engine.Enabled ? EngineRoomServiceDB.LogEventType.ENABLE : EngineRoomServiceDB.LogEventType.DISABLE;
                    _erdb.LogEvent(let, engine.ID, let.ToString() + " engine " + engine.ID);
                    schema.AddEngine(engine);
                }
                return(true);

            case EngineRoomMessageSchema.COMMAND_PUMP_STATUS:
                if (args == null || args.Count == 0 || args[0] == null)
                {
                    throw new Exception("No pump specified");
                }
                pump = GetPump(args[0].ToString());
                schema.AddPump(pump);
                response.Type = MessageType.DATA;
                return(true);

            case EngineRoomMessageSchema.COMMAND_ENABLE_PUMP:
                if (args == null || args.Count == 0 || args[0] == null)
                {
                    throw new Exception("No pump specified");
                }
                pump   = GetPump(args[0].ToString());
                enable = args.Count > 1 ? System.Convert.ToBoolean(args[1]) : true;
                if (enable != pump.Enabled)
                {
                    pump.Enable(enable);
                    EngineRoomServiceDB.LogEventType let = pump.Enabled ? EngineRoomServiceDB.LogEventType.ENABLE : EngineRoomServiceDB.LogEventType.DISABLE;
                    _erdb.LogEvent(let, pump.ID, let.ToString() + " pump " + pump.ID);
                    schema.AddPump(pump);
                }
                return(true);

            case EngineRoomMessageSchema.COMMAND_WATER_TANK_STATUS:
                if (args == null || args.Count == 0 || args[0] == null)
                {
                    throw new Exception("No tank specified");
                }
                WaterTanks.FluidTank waterTank = (WaterTanks.FluidTank)_waterTanks.GetDevice(args[0].ToString());
                schema.AddWaterTank(waterTank);
                response.Type = MessageType.DATA;
                return(true);

            case EngineRoomMessageSchema.COMMAND_WATER_STATUS:
                schema.AddWaterTanks(_waterTanks);
                return(true);

            case EngineRoomMessageSchema.COMMAND_ENABLE_WATER:
                enable = args.Count > 0 ? System.Convert.ToBoolean(args[0]) : true;
                if (enable != _waterTanks.Enabled)
                {
                    _waterTanks.Enable(enable);
                    EngineRoomServiceDB.LogEventType let = _waterTanks.Enabled ? EngineRoomServiceDB.LogEventType.ENABLE : EngineRoomServiceDB.LogEventType.DISABLE;
                    _erdb.LogEvent(let, _waterTanks.ID, let.ToString() + " water tanks");
                    schema.AddWaterTanks(_waterTanks);
                }
                return(true);

            case BBAlarmsService.AlarmsMessageSchema.COMMAND_ALARM_STATUS:
                OnMonitorEngineRoomTimer(null, null);
                return(true);

            case BBAlarmsService.AlarmsMessageSchema.COMMAND_RAISE_ALARM:
                if (args == null || args.Count < 1)
                {
                    throw new Exception("No alarm specified");
                }
                String alarmID = args[0].ToString();
                BBAlarmsService.AlarmState alarmState = BBAlarmsService.AlarmState.CRITICAL;
                BBAlarmsService.AlarmsMessageSchema.RaiseAlarm(this, alarmID, alarmState, "Raised alarm", true);
                return(true);

            case BBAlarmsService.AlarmsMessageSchema.COMMAND_LOWER_ALARM:
                if (args == null || args.Count < 1)
                {
                    throw new Exception("No alarm specified");
                }
                BBAlarmsService.AlarmsMessageSchema.LowerAlarm(this, args[0].ToString(), BBAlarmsService.AlarmState.OFF, "Lowered alarm", true);
                return(true);

            default:
                return(base.HandleCommand(cnn, message, cmd, args, response));
            }
        }
        //React to data coming from ADM
        protected override void HandleADMMessage(ADMMessage message, ArduinoDeviceManager adm)
        {
            ArduinoDevice           dev;
            EngineRoomMessageSchema schema = new EngineRoomMessageSchema(message);

            switch (message.Type)
            {
            case MessageType.DATA:
                if (message.Sender == null)
                {
                    dev = adm.GetDeviceByBoardID(message.TargetID);
                    if (dev is DS18B20Array)
                    {
                        schema.AddDS18B20Array((DS18B20Array)dev);
                        foreach (var sensor in ((DS18B20Array)dev).ConnectedSensors)
                        {
                            //outputSampleData(sensor.Sampler.GetSubjectData(sensor));
                            if (Output2Console)
                            {
                                Console.WriteLine("------------------------------> Average temp {0}: {1}", sensor.ID, sensor.AverageTemperature);
                            }
                        }
                    }

                    if (dev is WaterTanks.FluidTank)
                    {
                        schema.AddWaterTanks(_waterTanks);
                        WaterTanks.FluidTank ft = ((WaterTanks.FluidTank)dev);
                        schema.AddWaterTank(ft);
                        if (Output2Console)
                        {
                            Console.WriteLine("****************>: Water Tank {0} distance / average distance / percent / percent full: {1} / {2} / {3} / {4}", ft.ID, ft.Distance, ft.AverageDistance, ft.Percentage, ft.PercentFull);
                        }
                    }
                }
                else
                {
                    dev = adm.GetDevice(message.Sender);
                    if (dev == _pompaCelup)
                    {
                        schema.AddPump(_pompaCelup);
                        if (Output2Console)
                        {
                            Console.WriteLine("+++++++++++++++> Pump {0} {1}", dev.ID, _pompaCelup.IsOn);
                        }
                    }

                    if (dev == _pompaSolar)
                    {
                        schema.AddPump(_pompaSolar);
                        _erdb.LogEvent(_pompaSolar.IsOn ? EngineRoomServiceDB.LogEventType.ON : EngineRoomServiceDB.LogEventType.OFF, _pompaSolar.ID, "Pompa Solar");
                        if (Output2Console)
                        {
                            Console.WriteLine("+++++++++++++++> Pump {0} {1}", dev.ID, _pompaSolar.IsOn);
                        }
                    }

                    if (dev is Engine.OilSensorSwitch)
                    {
                        Engine.OilSensorSwitch os = (Engine.OilSensorSwitch)dev;
                        schema.AddOilSensor(os);
                        if (Output2Console)
                        {
                            Console.WriteLine("+++++++++++++++> Oil Sensor {0} {1}", os.ID, os.IsOn);
                        }
                    }
                }
                break;

            case MessageType.COMMAND_RESPONSE:
                dev = adm.GetDeviceByBoardID(message.TargetID);
                if (dev is RPMCounter)
                {
                    RPMCounter rpm = (RPMCounter)dev;
                    schema.AddRPM(rpm);
                    message.Type = MessageType.DATA;     //change the type so that it's more meaingful for listeners...

                    //TODO: remove
                    if (Output2Console)
                    {
                        Console.WriteLine("===============================> RPM {0}: {1}", rpm.ID, rpm.AverageRPM);
                    }
                }
                break;

            case MessageType.NOTIFICATION:
                break;

            case MessageType.CONFIGURE_RESPONSE:
                dev = adm.GetDeviceByBoardID(message.TargetID);
                if (dev is DS18B20Array)
                {
                    Tracing?.TraceEvent(TraceEventType.Information, 0, "Temperature array {0} on board {1} configured {2} sensors on one wire pin {3}", dev.ID, adm.BoardID, ((DS18B20Array)dev).ConnectedSensors.Count, message.GetInt(DS18B20Array.PARAM_ONE_WIRE_PIN));
                }
                break;

            case MessageType.PING_RESPONSE:
                //Console.WriteLine("Ping received from {0} ... gives AI={1}, FM={2},  MS={3}", adm.BoardID, message.GetValue("AI"), message.GetValue("FM"), message.GetValue("MS")); ;
                break;

            case MessageType.ERROR:
                try
                {
                    _erdb.LogEvent(EngineRoomServiceDB.LogEventType.ERROR, message.HasValue("ErrorSource") ? message.GetString("ErrorSource") : adm.PortAndNodeID, message.Value);
                } catch (Exception e)
                {
                    Tracing?.TraceEvent(TraceEventType.Error, 0, e.Message);
                }
                break;
            }
            base.HandleADMMessage(message, adm);
        }