diff --git a/Database.cs b/Database.cs
index 47722dc..b545ff6 100644
--- a/Database.cs
+++ b/Database.cs
@@ -666,6 +666,49 @@ namespace FAtoPA
}
}
+ class FSMConditionVX : INotifyPropertyChanged
+ {
+ private string _condition;
+ public string Condition
+ {
+ get => _condition;
+ set
+ {
+ if (_condition != value)
+ {
+ _condition = value;
+ OnPropertyChanged(nameof(Condition));
+ }
+ }
+ }
+
+ private short _status;
+ public short Status
+ {
+ get { return _status; }
+ set
+ {
+ if (_status != value)
+ {
+ _status = value;
+ OnPropertyChanged(nameof(Status));
+ }
+ }
+ }
+
+ public FSMConditionVX(string condition,short status)
+ {
+ this._condition = condition;
+ this._status = status;
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+ protected void OnPropertyChanged(string propertyName)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
+ }
+
class VXData : INotifyPropertyChanged
{
private String _siid;
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 141636b..5db0960 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -182,8 +182,8 @@
-
-
+
+
@@ -261,7 +261,7 @@
-
+
@@ -317,12 +317,20 @@
-
+
-
+
+
+
+
+
+
+
+
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index 830ce9d..9b2c9aa 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -59,6 +59,9 @@ namespace FAtoPA.Net
// tabel translation FSM Status String to Modbus Register Value
ObservableCollection ModbusTranslationTable;
+
+
+ ObservableCollection FSMConditionTable;
@@ -111,7 +114,8 @@ namespace FAtoPA.Net
siType.ItemsSource = Enum.GetValues(typeof(SIType)).Cast().ToList();
- Load_ModbusTranslationTable();
+ Load_ModbusTranslationTable();
+ Load_ConditionTable();
DataContext = this;
@@ -216,6 +220,95 @@ namespace FAtoPA.Net
}
+ private void Load_ConditionTable()
+ {
+ if (File.Exists("FSMConditionTable.json"))
+ {
+ String loadedJson = File.ReadAllText("FSMConditionTable.json");
+ try
+ {
+ FSMConditionTable = JsonSerializer.Deserialize>(loadedJson);
+ Debug.WriteLine("FSMConditionTable loaded");
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("Error loading FSMConditionTable : " + ex.Message);
+ Create_Default_ConditionTable();
+ }
+ }
+ else
+ {
+ Debug.WriteLine("FSMConditionTable.json not found, creating default");
+ Create_Default_ConditionTable();
+ }
+ }
+
+ private void Create_Default_ConditionTable()
+ {
+ FSMConditionTable = new ObservableCollection();
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.INVALID.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.NORMAL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.TROUBLE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.FIRE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.FIRE_PRE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.VERIFY_FIRE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.HEAT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.SUPERVISORY.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.SMOKE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.ACTIVATION.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.ACTIVATION_FAILED.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.TAMPER.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.COVER_OPEN.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.PAPER_OUT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WARNING.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.TROUBLE_LIGHT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WATCHDOGRESTART.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.ON.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.OFF.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.POLLUTION.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.POLLUTION_LIGHT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.MONITOR.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WATER.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.POWERFAIL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.MANUAL_ALARM.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.PAS_WAIT_FOR_ACK.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.PAS_INVESTIGATE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.AC_CHANGED.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.AC_COUNTDOWN_STARTED.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.AC_TAMPER.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.FIRE_INT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.ERROR.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.UNKNOWN.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.MATCHALL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.NET_CONFIG_MISMATCH.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.UNKNOWN_ITEM.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.MISSING_ITEM.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.INCOMPATIBLE_SOFTWARE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.INCOMPATIBLE_NET_PROTOCOL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.INFO_ALARM.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.CHEMICAL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WARNING_HEAT.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WARNING_SMOKE.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.WARNING_CHEMICAL.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.REBOOT_READY.ToString(), 0));
+ FSMConditionTable.Add(new FSMConditionVX(SILogicalState.LASTLOGICAL.ToString(), 0));
+ Save_ConditionTable();
+ }
+
+ private void Save_ConditionTable()
+ {
+ try
+ {
+ String json = JsonSerializer.Serialize(FSMConditionTable);
+ File.WriteAllText("FSMConditionTable.json", json);
+ Debug.WriteLine("FSMConditionTable saved");
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine("Error saving FSMConditionTable : " + e.Message);
+ }
+ }
+
private void Window_Loaded(object sender, RoutedEventArgs e)
{
@@ -269,6 +362,7 @@ namespace FAtoPA.Net
ModbusTable.ItemsSource = ModbusTableMember;
VXTable.ItemsSource = VXTableMember;
FSMtoModbusTranslationTable.ItemsSource = ModbusTranslationTable;
+ ConditionTable.ItemsSource = FSMConditionTable;
// Load FSM
fsmEvent = new FSMEvent(this.firealarmstatusbar);
@@ -309,7 +403,7 @@ namespace FAtoPA.Net
fsm.AddListener(new FSMTableUpdater(FsmTableMember, DetectedSIID, DetectedSIIDCount));
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave, ModbusTranslationTable));
fsm.AddListener(new VXTriggerFromFSM(FsmTableMember, VXTableMember, vx3k, ConditionON, ConditionOFF));
-
+ VerifyDataGridBinding(ConditionTable);
}
private void Timer1s_Tick(object sender, EventArgs e)
@@ -1117,7 +1211,6 @@ namespace FAtoPA.Net
break;
}
}
-
private void VXTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
@@ -1256,21 +1349,53 @@ namespace FAtoPA.Net
Debug.WriteLine("ConditionTable_AutoGeneratingColumn : " + e.PropertyName);
switch (e.PropertyName)
{
- case "No":
+ case "condition":
e.Column.Width = DataGridLength.Auto;
break;
- case "Condition":
- e.Column.Width = DataGridLength.Auto;
- break;
- case "PAS Status":
+ case "status":
e.Column.Width = DataGridLength.Auto;
break;
}
}
- private void VXTable_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ private void btnResetFSMCon_Click(object sender, RoutedEventArgs e)
{
+ var result = MessageBox.Show($"Reset FSM Condition Table ?", "Reset FSM Condition Table", MessageBoxButton.YesNo);
+ if (result == MessageBoxResult.Yes)
+ {
+ Create_Default_ConditionTable();
+ }
+ }
+ private void btnSetFSMCon_Click(object sender, RoutedEventArgs e)
+ {
+ var result = MessageBox.Show($"Save FSM Condition Table ?", "Save FSM Condition Table", MessageBoxButton.YesNo);
+ if (result == MessageBoxResult.Yes)
+ {
+ Save_ConditionTable();
+ }
+ }
+ // Method to verify if the DataGrid is correctly bound to the data source
+ private void VerifyDataGridBinding(DataGrid dataGrid)
+ {
+ if (dataGrid.ItemsSource == null)
+ {
+ Debug.WriteLine("DataGrid is not bound to any data source.");
+ return;
+ }
+
+ var dataSourceType = dataGrid.ItemsSource.GetType();
+ Debug.WriteLine($"DataGrid is bound to data source of type: {dataSourceType.Name}");
+
+ // Check if the data source is an ObservableCollection
+ if (dataSourceType.IsGenericType && dataSourceType.GetGenericTypeDefinition() == typeof(ObservableCollection<>))
+ {
+ Debug.WriteLine("DataGrid is bound to an ObservableCollection.");
+ }
+ else
+ {
+ Debug.WriteLine("DataGrid is bound to a different type of collection.");
+ }
}
}