diff --git a/MainWindow.xaml b/MainWindow.xaml
index 3d0ebd7..ecaef1e 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -45,12 +45,12 @@
-
-
+
+
-
-
+
+
@@ -99,31 +99,30 @@
-
+
-
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
@@ -132,23 +131,22 @@
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -156,29 +154,59 @@
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
@@ -200,12 +228,12 @@
-
-
-
+
+
+
-
+
@@ -213,35 +241,35 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -249,34 +277,34 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index 1295904..e8a9481 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -3,9 +3,11 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
+using System.IO;
using System.Linq;
using System.Net;
using System.Text;
+using System.Text.Json;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
@@ -55,6 +57,9 @@ namespace FAtoPA.Net
// Isi VX Table
ObservableCollection VXTableMember { get; set; }
+ // tabel translation FSM Status String to Modbus Register Value
+ public ObservableCollection> ModbusTranslationTable { get; set; }
+
public List ConditionON;
public List ConditionOFF;
@@ -65,6 +70,8 @@ namespace FAtoPA.Net
// Di-isi dengan user input di Tab Fire Alarm
FSMSIID = new ObservableCollection();
+
+
// Isinya ada di Window_Loaded
ModbusRegisters = new ObservableCollection();
FsmTableMember = new ObservableCollection();
@@ -105,17 +112,121 @@ namespace FAtoPA.Net
siType.ItemsSource = Enum.GetValues(typeof(SIType)).Cast().ToList();
- this.DataContext = this;
//TODO : Add Condition for ON and OFF
ConditionON = new List();
ConditionON.Add(SILogicalState.ACTIVATION.ToString());
ConditionON.Add(SILogicalState.FIRE.ToString());
-
+
ConditionOFF = new List();
ConditionOFF.Add(SILogicalState.NORMAL.ToString());
+
+ Load_ModbusTranslationTable();
+
+ DataContext = this;
+
}
+ ///
+ /// Load Modbus Translation Table from JSON File
+ ///
+ private void Load_ModbusTranslationTable()
+ {
+ if (File.Exists("ModbusTranslationTable.json"))
+ {
+ String loadedJson = File.ReadAllText("ModbusTranslationTable.json");
+ try
+ {
+ ModbusTranslationTable = JsonSerializer.Deserialize>>(loadedJson);
+ Debug.WriteLine("ModbusTranslationTable loaded");
+ }
+ catch (Exception ex)
+ {
+ Debug.WriteLine("Error loading ModbusTranslationTable : " + ex.Message);
+ Create_Default_ModbusTranslationTable();
+ }
+ } else
+ {
+ Debug.WriteLine("ModbusTranslationTable.json not found, creating default");
+ Create_Default_ModbusTranslationTable();
+ }
+
+ }
+
+ ///
+ /// Create Default Modbus Translation Table
+ /// It also save the default table to JSON File
+ ///
+ private void Create_Default_ModbusTranslationTable()
+ {
+ ModbusTranslationTable = new ObservableCollection>();
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.INVALID.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.NORMAL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.TROUBLE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.FIRE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.FIRE_PRE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.VERIFY_FIRE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.HEAT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.SUPERVISORY.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.SMOKE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.ACTIVATION.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.ACTIVATION_FAILED.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.TAMPER.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.COVER_OPEN.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.PAPER_OUT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WARNING.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.TROUBLE_LIGHT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WATCHDOGRESTART.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.ON.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.OFF.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.POLLUTION.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.POLLUTION_LIGHT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.MONITOR.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WATER.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.POWERFAIL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.MANUAL_ALARM.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.PAS_WAIT_FOR_ACK.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.PAS_INVESTIGATE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.AC_CHANGED.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.AC_COUNTDOWN_STARTED.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.AC_TAMPER.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.FIRE_INT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.ERROR.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.UNKNOWN.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.MATCHALL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.NET_CONFIG_MISMATCH.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.UNKNOWN_ITEM.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.MISSING_ITEM.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.INCOMPATIBLE_SOFTWARE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.INCOMPATIBLE_NET_PROTOCOL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.INFO_ALARM.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.CHEMICAL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WARNING_HEAT.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WARNING_SMOKE.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.WARNING_CHEMICAL.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.REBOOT_READY.ToString(), 0));
+ ModbusTranslationTable.Add(new KeyValuePair(SILogicalState.LASTLOGICAL.ToString(), 0));
+ Save_ModbusTranslationTable();
+ }
+
+ ///
+ /// Save Modbus Translation Table to JSON File
+ ///
+ private void Save_ModbusTranslationTable()
+ {
+ try
+ {
+ String json = JsonSerializer.Serialize(ModbusTranslationTable);
+ File.WriteAllText("ModbusTranslationTable.json", json);
+ Debug.WriteLine("ModbusTranslationTable saved");
+ } catch (Exception e)
+ {
+ Debug.WriteLine("Error saving ModbusTranslationTable : " + e.Message);
+ }
+
+ }
+
+
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Window Loaded");
@@ -167,6 +278,7 @@ namespace FAtoPA.Net
FSMTable.ItemsSource = FsmTableMember;
ModbusTable.ItemsSource = ModbusTableMember;
VXTable.ItemsSource = VXTableMember;
+ FSMtoModbusTranslationTable.ItemsSource = ModbusTranslationTable;
// Load FSM
fsmEvent = new FSMEvent(this.firealarmstatusbar);
@@ -198,6 +310,7 @@ namespace FAtoPA.Net
fsm.AddListener(new FSMTableUpdater(FsmTableMember, DetectedSIID, DetectedSIIDCount));
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave, ConditionON, ConditionOFF));
fsm.AddListener(new VXTriggerFromFSM(FsmTableMember, VXTableMember, vx3k, ConditionON, ConditionOFF));
+
}
private void Timer1s_Tick(object sender, EventArgs e)
@@ -788,33 +901,6 @@ namespace FAtoPA.Net
}
}
- private void btnAddSIID_Click(object sender, RoutedEventArgs e)
- {
- SIID selected = GetSIID();
- if (selected != null)
- {
- MessageBoxResult result = MessageBox.Show("Add SIID " + selected.ToString() + " ?", "Add SIID", MessageBoxButton.YesNo);
- if (result == MessageBoxResult.Yes)
- {
- if (database != null)
- {
- //TODO Manual Add SIID, perlukah ?
-
- //FSMData f = new FSMData(selected.ToString());
- //if (database.AddFSMData(f))
- //{
- // FSMTable.ItemsSource = database.GetFSMDatas();
- // FSMSIID.Add(selected.ToString());
- //}
- //else MessageBox.Show("Failed to add to database");
- }
- else MessageBox.Show("Database is null");
- }
- }
- else MessageBox.Show("Invalid Selection");
-
- }
-
private void btnDelSIID_Click(object sender, RoutedEventArgs e)
{
if (FSMTable != null)
@@ -846,39 +932,6 @@ namespace FAtoPA.Net
}
}
- private SIID GetSIID()
- {
- int netgroup = 0;
- int netnode = 0;
- SIType sitype = 0;
- int sinumber = 0;
- int sisub = 0;
-
- if (netGroupNumber.SelectedItem != null)
- {
- netgroup = (int)netGroupNumber.SelectedItem;
- if (netNodeNumber.SelectedItem != null)
- {
- netnode = (int)netNodeNumber.SelectedItem;
- if (siType.SelectedItem != null)
- {
- sitype = (SIType)siType.SelectedItem;
- if (siNumber.SelectedItem != null)
- {
- sinumber = (int)siNumber.SelectedItem;
- if (siSub.SelectedItem != null)
- {
- sisub = (int)siSub.SelectedItem;
-
- return new SIID((byte)netgroup, (byte)netnode, sitype, (ushort)sinumber, (byte)sisub);
- }
- }
- }
- }
- }
- return null;
-
- }
private void btnAddModbus_Click(object sender, RoutedEventArgs e)
{
@@ -1123,9 +1176,68 @@ namespace FAtoPA.Net
else MessageBox.Show("Selected SIID dont have NodeData");
} else MessageBox.Show("No SIID Selected");
}
+
+
+ private void FSMtoModbusTranslationTable_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
+ {
+ Debug.WriteLine("FSMtoModbusTranslationTable_AutoGeneratingColumn : " + e.PropertyName);
+ switch (e.PropertyName)
+ {
+ case "Key":
+ e.Column.Width = DataGridLength.Auto;
+ break;
+ case "Value":
+ e.Column.Width = DataGridLength.Auto;
+ break;
+
+ }
+ }
+
+ private void FSMtoModbusTranslationTable_MouseDoubleClick(object sender, MouseButtonEventArgs e)
+ {
+ var selected = (sender as DataGrid).SelectedItem;
+
+ if (selected != null)
+ {
+ try
+ {
+
+ KeyValuePair vv = (KeyValuePair)selected;
+ Debug.WriteLine($"Selected Key={vv.Key}, Value={vv.Value}");
+ //TODO create InputBox to select Value for Key
+ } catch(Exception exception)
+ {
+ Debug.WriteLine("FSMtoModbusTranslationTable_MouseDoubleClick Error : " + exception.Message);
+ }
+
+ }
+ else Debug.WriteLine("Not selected yet");
+ }
+
+ private void ResetFSMtoModbusTranslationTable_Click(object sender, RoutedEventArgs e)
+ {
+ var result = MessageBox.Show($"Reset FSM to Modbus Translation Table ?", "Reset FSM to Modbus Translation Table", MessageBoxButton.YesNo);
+ if (result == MessageBoxResult.Yes)
+ {
+ Create_Default_ModbusTranslationTable();
+ }
+
+ }
+
+ private void SetFSMtoModbusTranslationTable_Click(object sender, RoutedEventArgs e)
+ {
+ var result = MessageBox.Show($"Save FSM to Modbus Translation Table ?", "Save FSM to Modbus Translation Table", MessageBoxButton.YesNo);
+ if (result == MessageBoxResult.Yes)
+ {
+ Save_ModbusTranslationTable();
+ }
+
+ }
}
- // event handler for VX3K
+ ///
+ /// Event Handler for VX3K
+ ///
class VX3KEvent : EventInterface
{
private TextBlock statusbar;
@@ -1150,6 +1262,9 @@ namespace FAtoPA.Net
}
}
+ ///
+ /// Event Handler for Modbus
+ ///
class ModbusEvent : ModbusSlaveEvent
{
private TextBlock statusbar;
@@ -1173,12 +1288,8 @@ namespace FAtoPA.Net
connectedlist.Items.Clear();
foreach (ModbusClientRecord client in ModbusSlave)
{
- TextBlock l = new TextBlock();
- l.Width = connectedlist.Width;
- l.Margin = new Thickness(5, 0, 5, 0);
- l.TextWrapping = TextWrapping.Wrap;
+ TextBlock l = new TextBlock() { Margin=new Thickness(5,0,5,0), TextWrapping=TextWrapping.Wrap, Width=connectedlist.Width, Tag = client, Height=50 };
UpdateLabel(l, client);
- l.Tag = client;
connectedlist.Items.Add(l);
}
@@ -1233,6 +1344,9 @@ namespace FAtoPA.Net
}
}
+ ///
+ /// Event Handler for Bosch FSM
+ ///
class FSMEvent : EventInterface
{
private TextBlock statusbar;
@@ -1275,7 +1389,9 @@ namespace FAtoPA.Net
}
}
- // Class ini untuk update Table FSM
+ ///
+ /// Class ini untuk update Table FSM
+ ///
class FSMTableUpdater : FSMResultInterface
{
// dari database
@@ -1289,6 +1405,11 @@ namespace FAtoPA.Net
this.countlabel = countlabel;
}
+ ///
+ /// Method ini untuk menambahkan SIID yang muncul dari FSM ke Listbox
+ ///
+ /// SIID yang muncul
+ /// Tipe nya
public void DiscoveredSIID(string SIID, NodeData type)
{
Debug.WriteLine($"Discovered SIID={SIID} Label={type.Label} Type={type.Description}");
@@ -1299,7 +1420,7 @@ namespace FAtoPA.Net
// yang punya Label dan Description saja yang masuk ke Listbox dan dihitung
Application.Current.Dispatcher.Invoke(() =>
{
- listbox.Items.Add(new Label() { Content = $"{SIID} : {type.Label} : {type.Description}", Tag = type });
+ listbox.Items.Add(new Label() { Content = $"{SIID} : {type.Label} : {type.Description}", Tag = type, Height=50 });
countlabel.Content = "Count : " + listbox.Items.Count;
});
}
@@ -1308,7 +1429,12 @@ namespace FAtoPA.Net
}
-
+ ///
+ /// Method ini untuk mengupdate State SIID yang ada di FSM
+ ///
+ /// SIID yang muncul
+ /// Previous State kalau ada
+ /// State sekarang
public void NewState(string SIID, NodeState previous, NodeState current)
{
Debug.WriteLine("New State : " + SIID + " Previous : " + previous?.LogicalState + " Current : " + current.LogicalState);
@@ -1334,7 +1460,9 @@ namespace FAtoPA.Net
}
- // Class ini untuk Update Modbus Register dari FSM Update
+ ///
+ /// Class ini untuk Update Modbus Register dari FSM Update
+ ///
class ModbusTriggerFromFSM : FSMResultInterface
{
// dari database
@@ -1351,12 +1479,19 @@ namespace FAtoPA.Net
ConditionON = conditionON;
ConditionOFF = conditionOFF;
}
- public void DiscoveredSIID(string SIID, NodeData type)
- {
- }
+ ///
+ /// Tidak dipakai
+ ///
+ void FSMResultInterface.DiscoveredSIID(string SIID, NodeData type) { }
+ ///
+ /// Ada State baru dari FSM, Action to Modbus
+ ///
+ /// SIID yang muncul
+ /// Previous State kalau ada
+ /// State sekarang
public void NewState(string SIID, NodeState previous, NodeState current)
{
@@ -1427,7 +1562,9 @@ namespace FAtoPA.Net
}
}
- // Class ini untuk Trigger VX3K dari FSM Update
+ ///
+ /// Class ini untuk Trigger VX3K dari FSM Update
+ ///
class VXTriggerFromFSM : FSMResultInterface
{
ObservableCollection data;
@@ -1443,12 +1580,19 @@ namespace FAtoPA.Net
ConditionON = conditionON;
ConditionOFF = conditionOFF;
}
- public void DiscoveredSIID(string SIID, NodeData type)
- {
- }
+ ///
+ /// Event Discovered SIID, tidak dipakai di sini
+ ///
+ void FSMResultInterface.DiscoveredSIID(string SIID, NodeData type) { }
+ ///
+ /// Ada State baru dari FSM, Action to VX 3K
+ ///
+ /// SIID yang muncul
+ /// Previous state kalau ada
+ /// State sekarang
public void NewState(string SIID, NodeState previous, NodeState current)
{
FSMData src = null;