Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
Imports DDC.Mil1553.Emace

Public Class Form1

    Const DBLK1 = 1
    Const DBLK2 = 2

    Const MSG1 = 1
    Const MSG2 = 2

    Const OP1 = 1
    Const OP2 = 2

    Const OPCAL1 = 3

    Const MNR1 = 1

    Const MJR1 = 2


    Public wBuffer1() As UShort = {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0}
    Public wBuffer2() As UShort = {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0}

    Dim MonitorThread
    Dim DevNum
    Dim MonitorStop

    Private Sub ButtonStartBC_Click(sender As Object, e As EventArgs) Handles ButtonStartBC.Click
        MonitorThread = New Thread(AddressOf Monitor)
        DevNum = 0

        Dim wResult As DDC.Mil1553.Emace.AceError
        'Initialize Device in BC Mode
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceInitialize(DevNum, DDC.Mil1553.Emace.ConfigAccess.ACE_ACCESS_CARD, DDC.Mil1553.Emace.ConfigMode.ACE_MODE_BC, 0, 0, 0)
        If (wResult <> DDC.Mil1553.Emace.AceError.ACE_ERR_SUCCESS) Then
            MsgBox("INITIALIZE FAILED")
            Return
        Else
            ButtonStartBC.BackColor = Color.YellowGreen
        End If

        'Create Host Buffer 
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCInstallHBuf(DevNum, 32 * 5000)

        CreateDataBlocks(DevNum)
        CreateMessageBlocks(DevNum)
        CreateMessageOpcodes(DevNum)
        CreateMessageMinorMajorFrames(DevNum)
        StartBC(DevNum)

        MonitorStop = False

        MonitorThread.Start()
    End Sub

    Private Sub ButtonStopBC_Click(sender As Object, e As EventArgs) Handles ButtonStopBC.Click
        MonitorStop = True
        'MonitorThread.Abort()
        StopBC(DevNum)
        ButtonStartBC.BackColor = Color.Red
        ButtonStartBC.Enabled = True
    End Sub

    Private Sub Monitor()
        Do While MonitorStop <> True    'Loop until the Worker thread (and thus the Worker object's Start() method) is done
            'DDC.Mil1553.Emace.EmaceBU69092.aceBCGetHBufMsgDecoded(DevNum, sMsg1, dwMsgCount, dwHBufLost, BcMsgLoc.ACE_BC_MSGLOC_NEXT_PURGE)
            'If dwMsgCount = 1 Then
            'UpdateUI(sMsg1)                                      'Update the progress bar with the current value
            Thread.Sleep(50)
            'End If 'Sleep the monitor thread otherwise we'll be wasting CPU cycles updating the progress bar a million times a second
        Loop
    End Sub

    Public Sub CreateDataBlocks(ByVal DevNum As Integer)

        Dim wResult As DDC.Mil1553.Emace.AceError
        'Create a data block      

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCDataBlkCreate(DevNum, DBLK1, DDC.Mil1553.Emace.BcDataBlkSize.ACE_BC_DBLK_SINGLE, wBuffer1, 32)
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCDataBlkCreate(DevNum, DBLK2, DDC.Mil1553.Emace.BcDataBlkSize.ACE_BC_DBLK_SINGLE, wBuffer2, 32)
    End Sub

    Public Sub CreateMessageBlocks(ByVal DevNum As Integer)
        Dim wResult As DDC.Mil1553.Emace.AceError
        'Create message block 

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCMsgCreateBCtoRT(DevNum,
                                                        MSG1,
                                                        DBLK1,
                                                        13,
                                                        1,
                                                        17,
                                                        0,
                                                        DDC.Mil1553.Emace.BcMsgOption.ACE_BCCTRL_CHL_A + DDC.Mil1553.Emace.BcMsgOption.ACE_BCCTRL_RETRY_ENA)

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCMsgCreateRTtoRT(DevNum,
                                                 MSG2,
                                                 DBLK2,
                                                 14,
                                                 4,
                                                 32,
                                                 13,
                                                 27,
                                                 0,
                                                 DDC.Mil1553.Emace.BcMsgOption.ACE_BCCTRL_CHL_A + DDC.Mil1553.Emace.BcMsgOption.ACE_BCCTRL_RETRY_ENA)
    End Sub

    Public Sub CreateMessageOpcodes(ByVal DevNum As Integer)
        Dim wResult As DDC.Mil1553.Emace.AceError

        'Create XEQ opcode that will use msg block 

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCOpCodeCreate(DevNum, OP1, DDC.Mil1553.Emace.BcOpcode.ACE_OPCODE_XEQ, DDC.Mil1553.Emace.BcConditionTest.ACE_CNDTST_ALWAYS, MSG1, 0, 0)
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCOpCodeCreate(DevNum, OP2, DDC.Mil1553.Emace.BcOpcode.ACE_OPCODE_XEQ, DDC.Mil1553.Emace.BcConditionTest.ACE_CNDTST_ALWAYS, MSG2, 0, 0)

    End Sub

    Public Sub CreateMessageMinorMajorFrames(ByVal DevNum As Integer)
        Dim wResult As DDC.Mil1553.Emace.AceError
        Dim aOpCodes(20) As Short

        'Create Minor Frame 1
        aOpCodes(0) = OP1
        aOpCodes(1) = OP2
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCFrameCreate(DevNum, MNR1, DDC.Mil1553.Emace.BcFrameType.ACE_FRAME_MINOR, aOpCodes, 2, 0, 0)

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCOpCodeCreate(DevNum, OPCAL1, DDC.Mil1553.Emace.BcOpcode.ACE_OPCODE_CAL, DDC.Mil1553.Emace.BcConditionTest.ACE_CNDTST_ALWAYS, MNR1, 0, 0)

        ' Create Major Frame 
        aOpCodes(0) = OPCAL1

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCFrameCreate(DevNum, MJR1, DDC.Mil1553.Emace.BcFrameType.ACE_FRAME_MAJOR, aOpCodes, 1, 400, 0)

    End Sub

    Public Sub StartBC(ByVal DevNum As Integer)
        Dim wResult As DDC.Mil1553.Emace.AceError
        Dim title
        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCStart(DevNum, MJR1, -1)
        If (wResult <> DDC.Mil1553.Emace.AceError.ACE_ERR_SUCCESS) Then
            MsgBox("BC FAILED", , title)
            Return
        End If

    End Sub

    Public Sub StopBC(ByVal DevNum As Integer)
        Dim wResult As DDC.Mil1553.Emace.AceError

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceBCStop(DevNum)

        wResult = DDC.Mil1553.Emace.EmaceBU69092.aceFree(DevNum)

    End Sub

End Class
