public CustomAlarmSetControl(AlarmConfig ac)
 {
     InitializeComponent();
     groupBox1.Text = ac.Name;
     AlarmConfig    = ac;
     Init();
 }
Example #2
0
        private void Scheduler_TimeChanged(object sender, EventArgs e)
        {
            Scheduler s = sender as Scheduler;

            foreach (var item in ConfigData.AlarmConfigRoot.AlarmConfigs)
            {
                if (s.Time >= item.Starttime && s.Time <= item.Endtime)
                {
                    item.InTime = true;
                }
                else
                {
                    item.InTime = false;
                }
            }
            List <AlarmConfig> currentAlarms = ConfigData.AlarmConfigRoot.AlarmConfigs.FindAll(ala => ala.InDate && ala.InTime);

            if (currentAlarms != null && currentAlarms.Count > 0)
            {
                CurrentAlarmCfg = currentAlarms[currentAlarms.Count - 1];
            }
            else
            {
                SetAlarmNull();
            }
        }
Example #3
0
        public void ConnectToServer(string ip, string port, string connectionstring)
        {
            IP               = ip;
            Port             = port;
            ConnectionString = connectionstring;

            ProcessConnectionServer = Activator.GetObject(typeof(IProcessConnectionServer), "tcp://" + IP + ":" + Port + "/" + ConnectionString) as IProcessConnectionServer;
            AlarmConfig.LoadAlarmsConfigFile();
            AlarmEvents.ClearAlarmEvents();
        }
Example #4
0
 public static bool UpdateAcknowladgeFromHigherLevelIfExist(AlarmConfig alarmConfiguration, string lowerAlarmLevelName, string higherAlarmLevelName)
 {
     try
     {
         alarmConfiguration.AlarmTerminalSet.First(s => s.AlarmLevelName == lowerAlarmLevelName).Acknowledged = alarmConfiguration.AlarmTerminalSet.First(s => s.AlarmLevelName == higherAlarmLevelName).Acknowledged;
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
Example #5
0
        private bool CheckIfDisabled(AlarmConfig timer)
        {
            var enabled = timer.Enable;

            if (!enabled)
            {
                return(true);
            }

            this.Log(LogLevel.Warning, "Configuring {0} is allowed only when it is disabled", timer);
            return(false);
        }
Example #6
0
 private static bool AlarmExist(AlarmConfig alarmConfiguration, string alarmLevelName)
 {
     try
     {
         var alarm = alarmConfiguration.AlarmTerminalSet.First(s => s.AlarmLevelName == alarmLevelName);
         return(alarm != null);
     }
     catch (Exception)
     {
         return(false);
     }
 }
Example #7
0
 public static bool RemoveAlarmIfExist(PowerMonitoringModelContainer context, AlarmConfig alarmConfiguration, string alarmLevelName)
 {
     try
     {
         var alarm = alarmConfiguration.AlarmTerminalSet.First(s => s.AlarmLevelName == alarmLevelName);
         context.DeleteObject(alarm);
         return(true);
     }
     catch (Exception)
     {
         return(false);
     }
 }
Example #8
0
        private void NewItem(AlarmConfig item)
        {
            ToolStripMenuItem tsmItem = new ToolStripMenuItem(item.Name);

            tsmItem.Name = item.Name;
            menuStrip1.Items.Insert(0, tsmItem);
            CustomAlarmSetControl scg = new CustomAlarmSetControl(item);

            scg.Parent     = panel1;
            scg.Dock       = DockStyle.Fill;
            tsmItem.Tag    = scg;
            tsmItem.Click += TsmItem_Click;
        }
Example #9
0
    public void loadJSON()
    {
        config = null;
        menu.DirectoryCheck();

        //ファイルがない場合: 初期設定ファイルの生成
        if (!File.Exists(jsonPath))
        {
            config = new AlarmConfig();
            makeJSON();
        }

        //ファイルの読込を試行
        try
        {
            //ファイルの内容を一括読み出し
            string jsonString = File.ReadAllText(jsonPath, new UTF8Encoding(false));
            //設定クラスをJSONデコードして生成
            config = JsonUtility.FromJson <AlarmConfig>(jsonString);

            //ファイルのバージョンが古い場合は、デフォルト設定にして警告(nullの可能性も考慮してtry内)
            if (config.jsonVer != jsonVerMaster)
            {
                menu.ShowDialogOKCancel(LanguageManager.config.jsonloaders.OLD_CONFIG_HEAD, "" + jsonPath + LanguageManager.config.jsonloaders.OLD_CONFIG_BODY, 3f, () => {
                    //OK
                    makeJSON();
                }, () => {
                    //キャンセル
                });
                config = new AlarmConfig();
            }
        }
        catch (System.Exception e)
        {
            //JSONデコードに失敗した場合
            Debug.Log(e.ToString());
            config = null;
        }

        //デコード失敗した場合は、デフォルト設定にして警告
        if (config == null)
        {
            config = new AlarmConfig();
            menu.ShowDialogOKCancel(LanguageManager.config.jsonloaders.CORRUPT_CONFIG_HEAD, "" + jsonPath + LanguageManager.config.jsonloaders.CORRUPT_CONFIG_BODY, 3f, () => {
                //OK
                makeJSON();
            }, () => {
                //キャンセル
            });
        }
    }
Example #10
0
        public static bool UpdateAlarmAndReturnIsActive(float currentValue, AlarmConfig alarmConfiguration, string alarmLevelName, double alarmConfigurationLevelChange, bool alarmConfigurationEnable, Usporedi delegateUsporedi, PowerMonitoringModelContainer context)
        {
            AlarmTerminal alarmTerminal;

            try
            {
                alarmTerminal = alarmConfiguration.AlarmTerminalSet.First(s => s.AlarmLevelName == alarmLevelName);
            }
            catch (Exception)
            {
                alarmTerminal = null;
            }

            if (delegateUsporedi(currentValue, alarmConfigurationLevelChange) && alarmConfigurationEnable)
            {
                if (alarmTerminal == null)
                {
                    alarmTerminal = AlarmTerminal.CreateAlarmTerminal(-1, true, false, alarmLevelName, currentValue, DateTime.Now, DateTime.Now, alarmConfigurationLevelChange, 1, -1);
                    alarmConfiguration.AlarmTerminalSet.Add(alarmTerminal);
                }
                else
                {
                    alarmTerminal.Active = true;
                    if (delegateUsporedi(currentValue, alarmTerminal.MaxValue))
                    {
                        alarmTerminal.MaxValue     = currentValue;
                        alarmTerminal.MaxValueTime = DateTime.Now;
                    }
                }
            }
            else
            {
                if (alarmTerminal != null)
                {
                    alarmTerminal.Active = false;
                    if (alarmTerminal.Acknowledged)
                    {
                        context.AlarmTerminalSet.DeleteObject(alarmTerminal);
                    }
                }
            }

            return(alarmTerminal != null && alarmTerminal.Active);
        }
Example #11
0
        /// <su
        public string GetCommandString()
        {
            try
            {
                string str = "TABLE:IO_PARA#IO_ADDRESS:" + IO_ADDRESS;

                str += "#IO_ALERT_ENABLE:" + IO_ALERT_ENABLE;
                str += "#IO_COMM_ID:" + IO_COMM_ID;
                str += "#IO_DATATYPE:" + IO_DATATYPE;
                str += "#IO_DEVICE_ID:" + IO_DEVICE_ID;
                str += "#IO_ENABLEALARM:" + IO_ENABLEALARM;
                str += "#IO_ENABLERANGECONVERSION:" + IO_ENABLERANGECONVERSION;
                str += "#IO_HISTORY:" + IO_HISTORY;
                str += "#IO_ID:" + IO_ID;
                str += "#IO_INITALVALUE:" + IO_INITALVALUE;
                str += "#IO_LABEL:" + IO_LABEL;
                str += "#IO_MAXVALUE:" + IO_MAXVALUE;
                str += "#IO_MINVALUE:" + IO_MINVALUE;
                str += "#IO_NAME:" + IO_NAME;
                str += "#IO_ONE:" + IO_ONE;
                str += "#IO_OUTLIES:" + IO_OUTLIES;
                str += "#IO_PARASTRING:" + IO_PARASTRING.Replace("#", "//").Replace(":", "\\");
                str += "#IO_POINTTYPE:" + IO_POINTTYPE;
                str += "#IO_RANGEMAX:" + IO_RANGEMAX;
                str += "#IO_RANGEMIN:" + IO_RANGEMIN;
                str += "#IO_SERVER_ID:" + IO_SERVER_ID;
                str += "#IO_SYSTEM:" + IO_SYSTEM;
                str += "#IO_UNIT:" + IO_UNIT;
                str += "#IO_ZERO:" + IO_ZERO;
                str += "#IO_FORMULA:" + IO_FORMULA;
                str += "#IO_DATASOURCE:" + this.IO_DATASOURCE;
                //增加报警信息的配置
                str += "#" + AlarmConfig.GetCommandString2();//把报警信息一并传过来

                return(str);
            }
            catch
            {
                return("");
            }
        }
Example #12
0
 void SetAlarm(AlarmConfig ac)
 {
     foreach (var fd in ConfigData.allFields)
     {
         fd.Alarm = ac.AlarmField.Find(af => af.Name == fd.Name);
     }
     foreach (ToolStripMenuItem item in menuStrip1.Items)
     {
         if (InvokeRequired)
         {
             this.Invoke(new Action(() =>
             {
                 if (item.Name == ac.Name)
                 {
                     item.BackColor = Color.BlueViolet;
                     item.ForeColor = Color.White;
                     TsmItem_Click(item, null);
                 }
                 else
                 {
                     item.BackColor = Color.Transparent;
                     item.ForeColor = Color.Black;
                 }
             }));
         }
         else
         {
             if (item.Name == ac.Name)
             {
                 item.BackColor = Color.BlueViolet;
                 item.ForeColor = Color.White;
                 TsmItem_Click(item, null);
             }
             else
             {
                 item.BackColor = Color.Transparent;
                 item.ForeColor = Color.Black;
             }
         }
     }
 }
    public List <AlarmConfig> GetConfigs()
    {
        List <AlarmConfig> list = new List <AlarmConfig>();

        foreach (RadListBoxItem item in listBoxSelectedSites.Items)
        {
            AlarmConfig c = new AlarmConfig();
            c.SiteId  = item.Value;
            c.PhoneNr = TextBoxPhoneNr.Text;
            c.Note    = TextBoxDescription.Text;
            c.Ena     = CheckBoxEnable.Checked;
            c.Ena2    = CheckBoxEnableDelay.Checked;
            c.Ena3    = CheckBoxEnableDiff.Checked;
            c.Ena4    = CheckBoxEnablePress.Checked;
            if (!string.IsNullOrEmpty(c.PhoneNr))
            {
                list.Add(c);
            }
        }

        return(list);
    }
Example #14
0
        private void 确定ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            string name = null;

            if (!string.IsNullOrWhiteSpace(toolStripTextBox2.Text))
            {
                name = toolStripTextBox2.Text;
            }
            else
            {
                return;
            }
            AlarmConfig ac = new AlarmConfig();

            ac.AlarmField = new List <AlarmField>();
            ac.AllDate    = true;
            ac.AllTime    = true;
            ac.Name       = name;
            listAlarm.Add(ac);
            NewItem(ac);
            toolStripComboBox1.Items.Add(ac);
            Utils.ToFile(ConfigurationManager.AppSettings["预警配置文件"], ConfigData.AlarmConfigRoot);
        }
Example #15
0
        public void UpdateVariableSingle(string name, float currentValue, DateTime timeStamp)
        {
            if (_time == null)
            {
                _longTimer      = DateTime.UtcNow.Second;
                _time           = new Timer(1000);
                _time.Elapsed  += TimeElapsed;
                _time.AutoReset = true;
                _time.Start();
            }

            ServiceVariable serviceVariable;

            //ako postoji variabla pod imenom na servisu updejtaj vrijednost ako ne postoji kreiraj
            try
            {
                serviceVariable = (from v in ServiceVariables
                                   where v.VariableDto.VariableName == name
                                   select v).First();
                serviceVariable.VariableDto.CurrentValue = currentValue.ToString(CultureInfo.InvariantCulture);
            }
            catch (Exception)
            {
                var variableDto = new VariableDto
                {
                    CurrentValue = currentValue.ToString(CultureInfo.InvariantCulture),
                    VariableName = name,
                };
                serviceVariable = new ServiceVariable(variableDto);
                ServiceVariables.Add(serviceVariable);
            }

            using (var context = new PowerMonitoringModelContainer())
            {
                //ako ne postoji entity na sevicu pogledaj dali variajbla postoji u bazi ako ne postoji kreiraj
                // provaj je naći u bazi pod imenom ako ne postoji kreiraj
                Variable variableEnty;
                try
                {
                    variableEnty = (from v in context.VariableSet
                                    where v.Name == name
                                    select v).First();
                }
                catch (Exception)
                {
                    variableEnty = Variable.CreateVariable(-1, name, _singleTypeString, true);
                    context.AddToVariableSet(variableEnty);
                    context.SaveChanges();
                }

                if (variableEnty == null)
                {
                    return;
                }

                //logiranje
                if (variableEnty.DataLoggingEnabled)
                {
                    if (variableEnty.Type == _singleTypeString)
                    {
                        variableEnty.SingleLogSet.Add(SingleLog.CreateSingleLog(-1, currentValue, timeStamp, -1));
                    }
                    if (variableEnty.Type == _doubleTypeString)
                    {
                        variableEnty.DoubleLogSet.Add(DoubleLog.CreateDoubleLog(-1, currentValue, timeStamp, -1));
                    }
                }
                context.SaveChanges();

                AlarmConfig alarmConfiguration = variableEnty.AlarmConfigSet;
                if (alarmConfiguration == null)
                {
                    return;
                }

                //High
                if (AlarmTools.UpdateAlarmAndReturnIsActive(currentValue, alarmConfiguration, "HI", alarmConfiguration.HI_LevelChange, alarmConfiguration.HI_Enable, AlarmTools.UsporediHi, context) == false)
                {
                    AlarmTools.RemoveLowerAlarmIfHigherLevelExist(context, alarmConfiguration, "HI", "HIHI");
                }
                else
                {
                    AlarmTools.UpdateAcknowladgeFromHigherLevelIfExist(alarmConfiguration, "HI", "HIHI");
                }

                if (AlarmTools.UpdateAlarmAndReturnIsActive(currentValue, alarmConfiguration, "HIHI", alarmConfiguration.HIHI_LevelChange, alarmConfiguration.HIHI_Enable, AlarmTools.UsporediHi, context))
                {
                    AlarmTools.RemoveAlarmIfExist(context, alarmConfiguration, "HI");
                }

                //Low
                if (AlarmTools.UpdateAlarmAndReturnIsActive(currentValue, alarmConfiguration, "LO", alarmConfiguration.LO_LevelChange, alarmConfiguration.LO_Enable, AlarmTools.UsporediLo, context) == false)
                {
                    AlarmTools.RemoveLowerAlarmIfHigherLevelExist(context, alarmConfiguration, "LO", "LOLO");
                }
                else
                {
                    AlarmTools.UpdateAcknowladgeFromHigherLevelIfExist(alarmConfiguration, "LO", "LOLO");
                }
                if (AlarmTools.UpdateAlarmAndReturnIsActive(currentValue, alarmConfiguration, "LOLO", alarmConfiguration.LOLO_LevelChange, alarmConfiguration.LOLO_Enabled, AlarmTools.UsporediLo, context))
                {
                    AlarmTools.RemoveAlarmIfExist(context, alarmConfiguration, "LO");
                }

                context.SaveChanges();
            }
        }
Example #16
0
 public static bool RemoveLowerAlarmIfHigherLevelExist(PowerMonitoringModelContainer context, AlarmConfig alarmConfiguration, string lowerAlarmLevelName, string higherAlarmLevelName)
 {
     return(AlarmExist(alarmConfiguration, higherAlarmLevelName) && RemoveAlarmIfExist(context, alarmConfiguration, lowerAlarmLevelName));
 }
Example #17
0
 UpdateAlarmConfigAsync(AlarmConfig data) => await UpdateDataAsync("alarm/config", data);
Example #18
0
        public STM32F4_RTC(Machine machine)
        {
            mainTimer = new TimerConfig(this);
            alarmA    = new AlarmConfig(this, mainTimer);
            alarmB    = new AlarmConfig(this, mainTimer);

            AlarmIRQ             = new GPIO();
            ticker               = new LimitTimer(machine.ClockSource, 1, this, nameof(ticker), 1, direction: Direction.Ascending, eventEnabled: true);
            ticker.LimitReached += UpdateState;
            ResetInnerTimers();

            IFlagRegisterField syncFlag = null;

            var registerMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.TimeRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 4, name: "SU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Second, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Second, Rank.Units))
                  .WithValueField(4, 3, name: "ST",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Second, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Second, Rank.Tens))
                  .WithReservedBits(7, 1)
                  .WithValueField(8, 4, name: "MU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Minute, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Minute, Rank.Units))
                  .WithValueField(12, 3, name: "MT",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Minute, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Minute, Rank.Tens))
                  .WithReservedBits(15, 1)
                  .WithValueField(16, 4, name: "HU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Hour, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Hour, Rank.Units))
                  .WithValueField(20, 2, name: "HT",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.TimeRegister, DateTimeSelect.Hour, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Hour, Rank.Tens))
                  .WithFlag(22, name: "PM",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfInInitMode(Registers.TimeRegister) && CheckIfUnlocked(Registers.TimeRegister))
                        {
                            mainTimer.PM = value;
                        }
                    },
                            valueProviderCallback: _ => mainTimer.PM)
                  .WithReservedBits(23, 9) },
                { (long)Registers.DateRegister, new DoubleWordRegister(this, 0x2101)
                  .WithValueField(0, 4, name: "DU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Day, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Day, Rank.Units))
                  .WithValueField(4, 2, name: "DT",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Day, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Day, Rank.Tens))
                  .WithReservedBits(6, 2)
                  .WithValueField(8, 4, name: "MU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Month, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Month, Rank.Units))
                  .WithValueField(12, 1, name: "MT",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Month, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Month, Rank.Tens))
                  .WithValueField(13, 3, name: "WDU",
                                  writeCallback: (_, value) =>
                    {
                        if (CheckIfInInitMode(Registers.DateRegister) && CheckIfUnlocked(Registers.DateRegister))
                        {
                            if (value == 0)
                            {
                                this.Log(LogLevel.Warning, "Writting value 0 to WeekDay register is forbidden");
                                return;
                            }
                            mainTimer.WeekDay = (DayOfTheWeek)value;
                        }
                    },
                                  valueProviderCallback: _ => (uint)mainTimer.WeekDay)
                  .WithValueField(16, 4, name: "YU",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Year, Rank.Units, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Year, Rank.Units))
                  .WithValueField(20, 4, name: "YT",
                                  writeCallback: (_, value) => UpdateMainTimer(Registers.DateRegister, DateTimeSelect.Year, Rank.Tens, value),
                                  valueProviderCallback: _ => mainTimer.Read(DateTimeSelect.Year, Rank.Tens))
                  .WithReservedBits(24, 8) },
                { (long)Registers.ControlRegister, new DoubleWordRegister(this)
                  .WithTag("WUCKSEL", 0, 3)
                  .WithTag("TSEDGE", 3, 1)
                  .WithTag("REFCKON", 4, 1)
                  .WithTag("BYPSHAD", 5, 1)
                  .WithFlag(6, name: "FMT",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ControlRegister))
                        {
                            AMPMFormat = value;

                            mainTimer.ConfigureAMPM();
                            alarmA.ConfigureAMPM();
                            alarmB.ConfigureAMPM();
                        }
                    },
                            valueProviderCallback: _ => AMPMFormat)
                  .WithTag("DCE", 7, 1)
                  .WithFlag(8, name: "ALRAE",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ControlRegister))
                        {
                            alarmA.Enable = value;
                        }
                    },
                            valueProviderCallback: _ => alarmA.Enable)
                  .WithFlag(9, name: "ALRBE",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ControlRegister))
                        {
                            alarmB.Enable = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.Enable)
                  .WithTag("WUTE", 10, 1)  // Wakeup Timer not supported
                  .WithTag("TSE", 11, 1)   // Timestamp not supported
                  .WithFlag(12, name: "ALRAIE",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ControlRegister))
                        {
                            alarmA.InterruptEnable = value;
                        }
                    },
                            valueProviderCallback: _ => alarmA.InterruptEnable)
                  .WithFlag(13, name: "ALRBIE",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ControlRegister) && value)
                        {
                            alarmB.InterruptEnable = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.InterruptEnable)
                  .WithTag("WUTIE", 14, 1)  // Wakeup Timer not supported
                  .WithTag("TSIE", 15, 1)   // Timestamp not supported
                  .WithTag("ADD1H", 16, 1)
                  .WithTag("SUB1H", 17, 1)
                  .WithTag("BKP", 18, 1)
                  .WithTag("COSEL", 19, 1)
                  .WithTag("POL", 20, 1)
                  .WithTag("OSEL", 21, 2)
                  .WithTag("COE", 23, 1)
                  .WithReservedBits(24, 8) },
                { (long)Registers.ISR, new DoubleWordRegister(this, 0x7)
                  .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => !alarmA.Enable, name: "ALRAWF")
                  .WithFlag(1, FieldMode.Read, valueProviderCallback: _ => !alarmB.Enable, name: "ALRBWF")
                  .WithTag("WUTWF", 2, 1)
                  .WithTag("SHPF", 3, 1)
                  .WithFlag(4, FieldMode.Read, valueProviderCallback: _ => mainTimer.TimeState.Year != 2000, name: "INITS")
                  .WithFlag(5, out syncFlag, FieldMode.Read | FieldMode.WriteZeroToClear, name: "RSF",
                            readCallback: (_, curr) =>
                    {
                        // this strange logic is required by the Zephyr driver;
                        // it wants to read 0 before reading 1, otherwise it times-out
                        if (!curr)
                        {
                            syncFlag.Value = true;
                        }
                    })
                  .WithFlag(6, FieldMode.Read, valueProviderCallback: _ => initMode, name: "INITF")
                  .WithFlag(7, FieldMode.Write, name: "INIT",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfUnlocked(Registers.ISR))
                        {
                            ticker.Enabled = !value;
                            initMode       = value;
                        }
                    })
                  .WithFlag(8, FieldMode.WriteZeroToClear | FieldMode.Read, name: "ALRAF",
                            changeCallback: (_, __) =>
                    {
                        alarmA.Flag = false;
                    },
                            valueProviderCallback: _ => alarmA.Flag)
                  .WithFlag(9, FieldMode.WriteZeroToClear | FieldMode.Read, name: "ALRBF",
                            changeCallback: (_, __) =>
                    {
                        alarmB.Flag = false;
                    },
                            valueProviderCallback: _ => alarmB.Flag)
                  .WithTag("WUTF", 10, 1)
                  .WithTag("TSF", 11, 1)
                  .WithTag("TSOVF", 12, 1)
                  .WithTag("TAMP1F", 13, 1)
                  .WithTag("TAMP2F", 14, 1)
                  .WithReservedBits(15, 1)
                  .WithTag("RECALPF", 16, 1)
                  .WithReservedBits(17, 15) },
                { (long)Registers.PrescalerRegister, new DoubleWordRegister(this)
                  .WithTag("PREDIV_S", 0, 15)
                  .WithReservedBits(15, 1)
                  .WithTag("PREDIV_A", 16, 7)
                  .WithReservedBits(23, 9) },
                { (long)Registers.WakeupTimerRegister, new DoubleWordRegister(this, 0x7F00FF)
                  .WithTag("WUT", 0, 16)
                  .WithReservedBits(16, 16) },
                { (long)Registers.CalibrationRegister, new DoubleWordRegister(this)
                  .WithTag("DC", 0, 5)
                  .WithReservedBits(5, 2)
                  .WithTag("DCS", 7, 1)
                  .WithReservedBits(8, 24) },
                { (long)Registers.AlarmARegister, new DoubleWordRegister(this)
                  .WithValueField(0, 4, name: "SU",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Second, Rank.Units, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Second, Rank.Units))
                  .WithValueField(4, 3, name: "ST",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Second, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Second, Rank.Tens))
                  .WithFlag(7, name: "MSK1",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmA) && CheckIfUnlocked(Registers.AlarmARegister))
                        {
                            alarmA.SecondsMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmA.SecondsMask)
                  .WithValueField(8, 4, name: "MU",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Minute, Rank.Units, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Minute, Rank.Units))
                  .WithValueField(12, 3, name: "MT",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Minute, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Minute, Rank.Tens))
                  .WithFlag(15, name: "MSK2",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmA) && CheckIfUnlocked(Registers.AlarmARegister))
                        {
                            alarmA.MinutesMask = value;
                        }
                    }, valueProviderCallback: _ => alarmA.MinutesMask)
                  .WithValueField(16, 4, name: "HU",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Hour, Rank.Units, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Hour, Rank.Units))
                  .WithValueField(20, 2, name: "HT",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Hour, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Hour, Rank.Tens))
                  .WithFlag(22, name: "PM",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmA) && CheckIfUnlocked(Registers.AlarmARegister))
                        {
                            alarmA.PM = value;
                        }
                    },
                            valueProviderCallback: _ => alarmA.PM)
                  .WithFlag(23, name: "MSK3",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmA) && CheckIfUnlocked(Registers.AlarmARegister))
                        {
                            alarmA.HoursMask = value;
                        }
                    }, valueProviderCallback: _ => alarmA.HoursMask)
                  .WithValueField(24, 4, name: "DU",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Day, Rank.Units, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Day, Rank.Units))
                  .WithValueField(28, 2, name: "DT",
                                  writeCallback: (_, value) => UpdateTimerA(DateTimeSelect.Day, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmA.Read(DateTimeSelect.Day, Rank.Tens))
                  .WithTag("WDSEL", 30, 1)   // Weekday instead of date units usupported
                  .WithFlag(31, name: "MSK4",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmA) && CheckIfUnlocked(Registers.AlarmARegister))
                        {
                            alarmA.DaysMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmA.DaysMask) },
                { (long)Registers.AlarmBRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 4, name: "SU",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Second, Rank.Units, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Second, Rank.Units))
                  .WithValueField(4, 3, name: "ST",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Second, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Second, Rank.Tens))
                  .WithFlag(7, name: "MSK1",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmB) && CheckIfUnlocked(Registers.AlarmBRegister))
                        {
                            alarmB.SecondsMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.SecondsMask)
                  .WithValueField(8, 4, name: "MU",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Minute, Rank.Units, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Minute, Rank.Units))
                  .WithValueField(12, 3, name: "MT",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Minute, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Minute, Rank.Tens))
                  .WithFlag(15, name: "MSK2",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmB) && CheckIfUnlocked(Registers.AlarmBRegister))
                        {
                            alarmB.MinutesMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.MinutesMask)
                  .WithValueField(16, 4, name: "HU",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Hour, Rank.Units, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Hour, Rank.Units))
                  .WithValueField(20, 2, name: "HT",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Hour, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Hour, Rank.Tens))
                  .WithFlag(22, name: "PM",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmB) && CheckIfUnlocked(Registers.AlarmBRegister))
                        {
                            alarmB.PM = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.PM)
                  .WithFlag(23, name: "MSK3",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmB) && CheckIfUnlocked(Registers.AlarmBRegister))
                        {
                            alarmB.HoursMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.HoursMask)
                  .WithValueField(24, 4, name: "DU",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Day, Rank.Units, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Day, Rank.Units))
                  .WithValueField(28, 2, name: "DT",
                                  writeCallback: (_, value) => UpdateTimerB(DateTimeSelect.Day, Rank.Tens, value),
                                  valueProviderCallback: _ => alarmB.Read(DateTimeSelect.Day, Rank.Tens))
                  .WithTag("WDSEL", 30, 1)   // Weekday instead of date units usupported
                  .WithFlag(31, name: "MSK4",
                            writeCallback: (_, value) =>
                    {
                        if (CheckIfDisabled(alarmB) && CheckIfUnlocked(Registers.AlarmBRegister))
                        {
                            alarmB.DaysMask = value;
                        }
                    },
                            valueProviderCallback: _ => alarmB.DaysMask) },
                { (long)Registers.WriteProtectionRegister, new DoubleWordRegister(this)
                  .WithValueField(0, 8, name: "KEY",
                                  writeCallback: (_, value) =>
                    {
                        if (value == UnlockKey1 && !firstStageUnlocked)
                        {
                            firstStageUnlocked = true;
                        }
                        else if (value == UnlockKey2 && firstStageUnlocked)
                        {
                            registersUnlocked = true;
                        }
                        else
                        {
                            firstStageUnlocked = false;
                            registersUnlocked  = false;
                        }
                    },
                                  valueProviderCallback: _ => 0)
                  .WithReservedBits(8, 24) },
                { (long)Registers.SubSecondRegister, new DoubleWordRegister(this)
                  .WithTag("SS", 0, 16)
                  .WithReservedBits(16, 16) },
                { (long)Registers.ShiftControlRegister, new DoubleWordRegister(this)
                  .WithTag("SUBFS", 0, 15)
                  .WithReservedBits(15, 16)
                  .WithTag("ADD1S", 31, 1) },
                { (long)Registers.TimestampTimeRegister, new DoubleWordRegister(this)
                  .WithTag("Second", 0, 7)
                  .WithReservedBits(7, 1)
                  .WithTag("Minute", 8, 7)
                  .WithReservedBits(15, 1)
                  .WithTag("Hour", 16, 6)
                  .WithTag("PM", 22, 1)
                  .WithReservedBits(23, 9) },
                { (long)Registers.TimestampDateRegister, new DoubleWordRegister(this)
                  .WithTag("Day", 0, 6)
                  .WithReservedBits(6, 2)
                  .WithTag("Month", 8, 5)
                  .WithTag("WDU", 13, 3)
                  .WithReservedBits(16, 16) },
                { (long)Registers.TimestampSubSecondRegister, new DoubleWordRegister(this)
                  .WithTag("SS", 0, 16)
                  .WithReservedBits(16, 16) },
                { (long)Registers.ClockCalibrationRegister, new DoubleWordRegister(this)
                  .WithTag("CALM", 0, 9)
                  .WithReservedBits(9, 4)
                  .WithTag("CALW16", 13, 1)
                  .WithTag("CALW8", 14, 1)
                  .WithTag("CALP", 15, 1)
                  .WithReservedBits(16, 16) },
                { (long)Registers.TamperAndAlternateFunctionConfigurationRegister, new DoubleWordRegister(this)
                  .WithTag("TAMP1E", 0, 1)
                  .WithTag("TAMP1TRG", 1, 1)
                  .WithTag("TAMPIE", 2, 1)
                  .WithTag("TAMP2E", 3, 1)
                  .WithTag("TAMP2TRG", 4, 1)
                  .WithReservedBits(5, 2)
                  .WithTag("TAMPTS", 7, 1)
                  .WithTag("TAMPFREQ", 8, 3)
                  .WithTag("TAMPFLT", 11, 2)
                  .WithTag("TAMPPRCH", 13, 2)
                  .WithTag("TAMPPUDIS", 15, 1)
                  .WithTag("TAMP1INSEL", 16, 1)
                  .WithTag("TSINSEL", 17, 1)
                  .WithTag("ALARMOUTTYPE", 18, 1)
                  .WithReservedBits(19, 13) },
                { (long)Registers.AlarmASubSecondRegister, new DoubleWordRegister(this)
                  .WithTag("SS", 0, 15)
                  .WithReservedBits(15, 9)
                  .WithTag("MASKSS", 24, 4)
                  .WithReservedBits(28, 4) },
                { (long)Registers.AlarmBSubSecondRegister, new DoubleWordRegister(this)
                  .WithTag("SS", 0, 15)
                  .WithReservedBits(15, 9)
                  .WithTag("MASKSS", 24, 4)
                  .WithReservedBits(28, 4) },
            };

            registers = new DoubleWordRegisterCollection(this, registerMap);
        }