Imports System.IO Module M_transitions #Region "variabili locali" Private sz_tokens As String() Private objWriter As StreamWriter Private sz_file_name As String #End Region #Region "Strutture" #End Region #Region "Lettura file regole " Sub Read_rule_file_transitions(ByVal sz_filename As String) Dim sz_TextLine As String, sz_temp As String Dim temp_rule As Rule, b_rules_definition As Boolean Dim n_line As Int16 n_line = 0 b_rules_definition = False sz_file_name = sz_filename If System.IO.File.Exists(sz_filename) = True Then Dim objfile As New System.IO.StreamReader(sz_filename) Do While objfile.Peek() <> -1 ' finche c'è vita sz_TextLine = Trim(objfile.ReadLine()) n_line = n_line + 1 If (Not String.IsNullOrEmpty(sz_TextLine)) Then ' linea vuota o commento ? If (Trim(sz_TextLine).Chars(0) <> "#") Then If InStr(sz_TextLine, ControlChars.Tab) > 0 Then ' sostituzione dei tab !!!! sz_TextLine = sz_TextLine.Replace(ControlChars.Tab, String.Empty) End If sz_tokens = sz_TextLine.Split(New Char() {":"c}) ' splitta sui ":" sz_temp = Trim(UCase$(Trim(sz_tokens(0)))) ' primo campo Select Case sz_temp Case "$DEFINITIONS" b_rules_definition = False Case "$NAME" sz_state_machine_name = UCase$(Trim(sz_tokens(1))) Case "$IDX" n_state_machine_index = my_CInt(Trim(sz_tokens(1))) Case "$N_STATES" n_states = my_CInt(Trim(sz_tokens(1))) Case "$N_BITS" n_bits = my_CInt(Trim(sz_tokens(1))) Case "$BIT" Bits.Add(UCase$(Trim(sz_tokens(2)))) Case "$STATE" States.Add(UCase$(Trim(sz_tokens(2)))) Case "$EVENT" Events_to_send.Add(UCase$(Trim(sz_tokens(2)))) Case "$RULES" b_rules_definition = True Case "$DO" b_rules_definition = False Call evaluate_transitions() Case Else If (b_rules_definition) Then temp_rule.state = sz_temp temp_rule.expression = (UCase$(Trim(sz_tokens(1)))) temp_rule.next_state = (UCase$(Trim(sz_tokens(2)))) temp_rule.event_to_send = (UCase$(Trim(sz_tokens(3)))) Rules.Add(temp_rule) Else MsgBox("bad keyword or no rule on line : " & sz_TextLine, MsgBoxStyle.Critical, "ERROR on line : " & n_line.ToString) End If End Select End If ' commento End If ' linea vuota Loop objfile.Close() Else MsgBox(Message.Msg(4), MsgBoxStyle.Critical, sz_filename) ' file non esiste End If ' file exists End Sub #End Region #Region "Evaluate" Private Sub evaluate_transitions() Dim sz_actual_state As String, sz_actual_bit As String, sz_line Dim i As Int16, n_input As Int16, n As Int16, n_mask As Int16, n_bit As Int16 Dim b_bit(20) As Boolean, b_invert As Boolean FrmMain.TextBox1.Text = "" Call open_mac_file(Path.GetDirectoryName(sz_file_name) & "\" & Path.GetFileNameWithoutExtension(sz_file_name) & ".csv", IniRead.sz_file_init_transitions) ' ciclo per ogni stato For i = 0 To n_states - 1 sz_actual_state = States(i) ' ciclo per ogni ingresso For n_input = 0 To ((2 ^ n_bits) - 1) ' calcolo true false per ogni bit dell' ingresso n_mask = 1 For n = 0 To (n_bits - 1) b_bit(n) = n_input And n_mask n_mask = n_mask << 1 Next n ' FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " state " & i.ToString & " - " & sz_actual_state & " --- input : " & n_input.ToString FrmMain.TextBox1.Text = " state " & i.ToString & " - " & sz_actual_state & " --- input : " & n_input.ToString ' ciclo per ogni regola For Each act_rule As Rule In Rules n_bit = -1 ' controllo se la regola attuale vale in questo stato If ((act_rule.state = "ALL_STATES") Or (act_rule.state = sz_actual_state)) Then If (act_rule.state = sz_actual_state) Then FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " state " & i.ToString & " - " & sz_actual_state & " --- input : " & n_input.ToString FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " parliamo della regola " & Rules.IndexOf(act_rule) & vbCrLf End If 'recupero il bit in questione b_invert = False sz_actual_bit = act_rule.expression If InStr(sz_actual_bit, "NOT") Then ' bit negato ??? b_invert = True sz_actual_bit = Trim(sz_actual_bit.Replace("NOT ", "")) End If ' bit negato ' cerca il nome del bit e ne trova l' indice da 0 n_bit = Bits.FindIndex(Function(bittolo) (sz_actual_bit.Equals(bittolo))) If n_bit = -1 Then MsgBox("Bit name error - " & sz_actual_bit & vbCrLf & act_rule.state & " - " & act_rule.expression & " next " & act_rule.next_state, MsgBoxStyle.Critical, "ERROR - bit " & n_bit.ToString & " -- " & " state " & i.ToString & " - " & sz_actual_state & " --- input : " & n_input.ToString) Exit For End If ' vera la espressione ? If (((Not b_invert) And b_bit(n_bit)) Or (b_invert And (Not b_bit(n_bit)))) Then ' FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " parliamo della regola " & Rules.IndexOf(act_rule) & vbCrLf ' FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " parliamo del bit " & n_bit.ToString & " - " & Bits(n_bit) ' FrmMain.TextBox1.Text = FrmMain.TextBox1.Text & " ------------->>scatta la regola " & act_rule.state & " - " & act_rule.expression & " next " & act_rule.next_state & vbCrLf & vbCrLf sz_line = "" If (States.IndexOf(act_rule.next_state) <> i) Then ' andrei allo stesso stato ? ' "IdxFamigliaIngresso;IdxMicroStato;ValoreIngresso;IdxTipoEvento;next_IdxMicroStato" sz_line = n_state_machine_index.ToString & ";" & i.ToString & ";" & n_input.ToString & ";" & Events_to_send.IndexOf(act_rule.event_to_send).ToString & ";" & States.IndexOf(act_rule.next_state).ToString() Call write_mac_file(sz_line) Else sz_line = "----" & n_state_machine_index.ToString & ";" & i.ToString & ";" & n_input.ToString & ";" & Events_to_send.IndexOf(act_rule.event_to_send).ToString & ";" & States.IndexOf(act_rule.next_state).ToString() 'Call write_mac_file(sz_line) End If ' andrei allo stesso stato Exit For ' esco da questo caso End If ' vera la espressione End If ' vale la regola Next ' ciclo per tutte le regole Next n_input ' ciclo per ogni ingresso Next i ' ciclo per ogni stato Call close_mac_file() End Sub #End Region End Module