Пример #1
0
        public override void HandleMessage(ADMMessage message)
        {
            base.HandleMessage(message);

            if (ADMMessage.IsCommandType(message.CommandID, (byte)ArduinoCommand.CommandType.READ))
            {
                Mode mode = (Mode)ADMMessage.GetCommandIndex(message.CommandID);
                switch (mode)
                {
                case Mode.COUNT:
                    Count    = message.ArgumentAsLong(0);
                    Interval = message.ArgumentAsLong(1);
                    Mgr.Sampler.ProvideSample(this, (double)Count, Interval);

                    message.AddValue(PARAM_COUNT, Count);
                    message.AddValue(PARAM_INTERVAL, Interval);
                    break;

                case Mode.RATE:
                    Rate = message.ArgumentAsFloat(0);
                    Mgr.Sampler.ProvideSample(this, (double)Rate);

                    message.AddValue(PARAM_RATE, Rate);
                    break;
                }
            }
        }
Пример #2
0
        protected override void OnConnect(ADMMessage message)
        {
            base.OnConnect(message);

            message.AddValue("SensorIndex", message.ArgumentAsInt(0));
            message.AddValue("SensorCount", message.ArgumentAsInt(1));
        }
Пример #3
0
        public override void AddConfig(ADMMessage message)
        {
            base.AddConfig(message);

            message.AddArgument(_counterPin);
            message.AddArgument(_countState);
            message.AddArgument(RateInterval);
        }
Пример #4
0
        public override void AddConfig(ADMMessage message)
        {
            base.AddConfig(message);

            //this should be arguments with indices 3 and 4 (argument values are retrieved by numerical index on the arduino)
            message.AddArgument(_transmitPin);
            message.AddArgument(_receivePin);
        }
Пример #5
0
        private void HandleSilenceTimer(Object sender, System.Timers.ElapsedEventArgs ea)
        {
            //turn off timer and set buzzer pin to whatever the buzzer state really is
            Unsilence();
            ADMMessage message = new ADMMessage();

            message.Type = Messaging.MessageType.NOTIFICATION;
            message.AddValue("Silenced", _silenced);
            message.Value = "Silenced timer ended";
            Broadcast(message);
        }
        protected override void OnADMDevicesConnected(ArduinoDeviceManager adm, ADMMessage message)
        {
            base.OnADMDevicesConnected(adm, message);

            if (Sampler.IsRunning)
            {
                _erdb.LogEvent(EngineRoomServiceDB.LogEventType.START, "Sampler", String.Format("Sampling started with timer interval of {0} for {1} subjects", Sampler.TimerInterval, Sampler.SubjectCount));
                _timerStateLog.Start();
                _timerMonitorEngineRoom.Start();
            }
        }
Пример #7
0
        public override void HandleMessage(ADMMessage message)
        {
            //check if the transmit pin is viable
            if (_transmitPin == ArduinoPin.BOARD_SPECIFIED && message.HasValue("TP"))
            {
                int tp = message.GetInt("TP");
                ConfigurePin(tp, PinMode.PwmOutput);
                Mgr.UpdateDevice(this);
                _transmitPin = tp;
            }

            base.HandleMessage(message);
        }
Пример #8
0
        virtual protected void OnStateChange(bool newState)
        {
            if (newState)
            {
                LastOn = DateTime.Now;
            }
            else
            {
                LastOff = DateTime.Now;
            }

            ADMMessage message = new ADMMessage();

            message.Type = BroadcastStateChangeAs;
            message.AddValue("State", newState);
            Broadcast(message);
        }
Пример #9
0
        public override void HandleMessage(ADMMessage message)
        {
            base.HandleMessage(message);
            if (!IsConnected)
            {
                return;
            }

            switch (message.Type)
            {
            case Messaging.MessageType.DATA:
                if (message.HasValues("Code", "Protocol", "Bits"))
                {
                    long ircode   = message.GetLong("Code");
                    int  protocol = message.GetInt("Protocol");
                    int  bits     = message.GetInt("Bits");

                    processCode(ircode, protocol, bits);
                }
                break;
            }
        }
Пример #10
0
        public override void HandleMessage(ADMMessage message)
        {
            base.HandleMessage(message);

            if (message.Type == MessageType.DATA)
            {
                double duration = message.ArgumentAsLong(0); //this is in microseconds
                if (duration > 0)
                {
                    double speedInMicros = Measurement.ConvertUnit(SpeedOfSound, Measurement.Unit.MICROSECOND, Measurement.Unit.SECOND);
                    Distance = 0.5 * Measurement.ConvertUnit(speedInMicros * duration, Measurement.Unit.METER, MeasurementUnit);
                }
                else
                {
                    Distance = 0;
                }

                Sampler?.ProvideSample(this, Distance);

                message.AddValue(PARAM_DISTANCE, Distance);
                message.AddValue(PARAM_UNITS, MeasurementUnit);
            }
        } //end HandleMessage
Пример #11
0
        public override void AddConfig(ADMMessage message)
        {
            base.AddConfig(message);

            message.AddArgument(_receivePin);
        }
Пример #12
0
        protected override void OnConnect(ADMMessage message)
        {
            base.OnConnect(message);

            RequestState();
        }
 public override void AddConfig(ADMMessage message)
 {
     base.AddConfig(message);
     message.AddArgument(REPEAT_COMMAND_INDEX); //repeat command index
 }
        //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);
        }
        protected override void AddADMDevices(ArduinoDeviceManager adm, ADMMessage message)
        {
            if (adm == null || adm.BoardID == 0)
            {
                Tracing?.TraceEvent(TraceEventType.Error, 0, "adm is null or does not have a BoardID value");
                return;
            }

            adm.Tracing = Tracing;

            DS18B20Array temp;
            Engine       engine;
            RPMCounter   rpm;

            Engine.OilSensorSwitch oilSensor;
            String desc;

            switch (adm.BoardID)
            {
            case BOARD_ER1:
                //Temperature array for all engines connected to a board
                //Important!: this must come first as it disrupts subsequent messages if not first
                temp = new DS18B20Array(4, "temp_arr");
                temp.SampleInterval = TEMP_SAMPLE_INTERVAL;
                temp.SampleSize     = TEMP_SAMPLE_SIZE;
                temp.AddSensor(INDUK_ID + "_temp");
                temp.AddSensor(BANTU_ID + "_temp");
                adm.AddDevice(temp);

                //Pompa celup
                _pompaCelup = new Pump(10, POMPA_CELUP_ID);
                _pompaCelup.MaxOnDuration = 12 * 60;     //raise an alarm if on for more than 15 minutes
                _pompaCelup.Initialise(_erdb);
                _pompaCelup.SampleInterval = REQUEST_STATE_INTERVAL;
                _pompaCelup.SampleSize     = 1;
                adm.AddDevice(_pompaCelup);

                //Pompa solar
                _pompaSolar = new Pump(11, POMPA_SOLAR_ID);
                _pompaSolar.MaxOnDuration = 15 * 60;     //raise an alarm if on for more than 15 minutes
                _pompaSolar.Initialise(_erdb);
                _pompaSolar.SampleInterval = REQUEST_STATE_INTERVAL;
                _pompaSolar.SampleSize     = 1;
                adm.AddDevice(_pompaSolar);

                //Induk
                rpm = new RPMCounter(5, INDUK_ID + "_rpm", "RPM");
                rpm.SampleInterval  = RPM_SAMPLE_INTERVAL;
                rpm.SampleSize      = RPM_SAMPLE_SIZE;
                rpm.SamplingOptions = RPM_SAMPLING_OPTIONS;
                rpm.Calibration     = RPM_CALIBRATION_INDUK;

                oilSensor = new Engine.OilSensorSwitch(8, INDUK_ID + "_oil");
                oilSensor.SampleInterval = REQUEST_STATE_INTERVAL;
                oilSensor.SampleSize     = 1;

                engine = new Engine(INDUK_ID, rpm, oilSensor, temp.GetSensor(INDUK_ID + "_temp"));
                engine.Initialise(_erdb);
                adm.AddDeviceGroup(engine);

                //Bantu
                rpm = new RPMCounter(6, BANTU_ID + "_rpm", "RPM");
                rpm.SampleInterval  = RPM_SAMPLE_INTERVAL;
                rpm.SampleSize      = RPM_SAMPLE_SIZE;
                rpm.SamplingOptions = RPM_SAMPLING_OPTIONS;
                rpm.Calibration     = RPM_CALIBRATION_BANTU;

                oilSensor = new Engine.OilSensorSwitch(9, BANTU_ID + "_oil");
                oilSensor.SampleInterval = REQUEST_STATE_INTERVAL;
                oilSensor.SampleSize     = 1;

                engine = new Engine(BANTU_ID, rpm, oilSensor, temp.GetSensor(BANTU_ID + "_temp"));
                engine.Initialise(_erdb);
                adm.AddDeviceGroup(engine);
                break;

            case BOARD_ER2:
                //temperature array for all engines connected to a board
                temp = new DS18B20Array(4, "temp_arr");
                temp.SampleInterval = 2 * TEMP_SAMPLE_INTERVAL;
                temp.SampleSize     = TEMP_SAMPLE_SIZE;
                temp.AddSensor(GENSET2_ID + "_temp");
                temp.AddSensor(GENSET1_ID + "_temp");
                adm.AddDevice(temp);

                //genset 1
                rpm = new RPMCounter(6, GENSET1_ID + "_rpm", "RPM");
                rpm.SampleInterval  = RPM_SAMPLE_INTERVAL;
                rpm.SampleSize      = RPM_SAMPLE_SIZE;
                rpm.SamplingOptions = RPM_SAMPLING_OPTIONS;
                rpm.Calibration     = RPM_CALIBRATION_GENSET1;

                oilSensor = new Engine.OilSensorSwitch(9, GENSET1_ID + "_oil");
                oilSensor.SampleInterval = REQUEST_STATE_INTERVAL;
                oilSensor.SampleSize     = 1;

                engine = new Engine(GENSET1_ID, rpm, oilSensor, temp.GetSensor(GENSET1_ID + "_temp"));
                engine.Initialise(_erdb);
                adm.AddDeviceGroup(engine);

                //genset 2
                rpm = new RPMCounter(5, GENSET2_ID + "_rpm", "RPM");
                rpm.SampleInterval  = RPM_SAMPLE_INTERVAL;
                rpm.SampleSize      = RPM_SAMPLE_SIZE;
                rpm.SamplingOptions = RPM_SAMPLING_OPTIONS;
                rpm.Calibration     = RPM_CALIBRATION_GENSET2;

                oilSensor = new Engine.OilSensorSwitch(8, GENSET2_ID + "_oil");
                oilSensor.SampleInterval = REQUEST_STATE_INTERVAL;
                oilSensor.SampleSize     = 1;

                engine = new Engine(GENSET2_ID, rpm, oilSensor, temp.GetSensor(GENSET2_ID + "_temp"));
                engine.Initialise(_erdb);
                adm.AddDeviceGroup(engine);
                break;

            case BOARD_ER3:
                _waterTanks = new WaterTanks();
                _waterTanks.AddTank("wt1", 4, 5, 1200, 28, 102);
                _waterTanks.AddTank("wt2", 6, 7, 1100, 28, 110);
                _waterTanks.AddTank("wt3", 8, 9, 1100, 28, 100);
                _waterTanks.AddTank("wt4", 10, 11, 1100, 32, 100);
                _waterTanks.Initialise(_erdb);
                adm.AddDeviceGroup(_waterTanks);
                break;
            } //end board switch
        }