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); }