'Configure.vb

'Gocator 2000/2300 Visual Basic Sample
'Copyright (C) 2013 by LMI Technologies Inc.

'Licensed under The MIT License.
'Redistributions of files must retain the above copyright notice.

'Purpose: Connect to Gocator system and modify parameters

Imports System.Threading
Imports System.Runtime.InteropServices

Module Configure
    Public Const IP As String = "192.168.1.10"
    Public Class Constants
#If DEBUG Then
        Public Const GODLLPATH As String = "GoSdk.dll"
        Public Const KAPIDLLPATH As String = "kApi.dll"
#Else
        Public Const GODLLPATH As String = "GoSdk.dll"
        Public Const KAPIDLLPATH As String = "kApi.dll"
#End If
    End Class
    Public Structure address
        Public version As Char
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> _
        Public IPaddress() As Byte
    End Structure

    Enum kStatus
        kERROR_STATE = -1000                                                ' Invalid state.
        kERROR_NOT_FOUND = -999                                             ' Item is not found.
        kERROR_COMMAND = -998                                               ' Command not recognized.
        kERROR_PARAMETER = -997                                             ' Parameter is invalid.
        kERROR_UNIMPLEMENTED = -996                                         ' Feature not implemented.
        kERROR_HANDLE = -995                                                ' Handle is invalid.
        kERROR_MEMORY = -994                                                ' Out of memory.
        kERROR_TIMEOUT = -993                                               ' Action timed out.
        kERROR_INCOMPLETE = -992                                            ' Buffer not large enough for data.
        kERROR_STREAM = -991                                                ' Error in stream.
        kERROR_CLOSED = -990                                                ' Resource is no longer avaiable. 
        kERROR_VERSION = -989                                               ' Invalid version number.
        kERROR_ABORT = -988                                                 ' Operation aborted.
        kERROR_ALREADY_EXISTS = -987                                        ' Conflicts with existing item.
        kERROR_NETWORK = -986                                               ' Network setup/resource error.
        kERROR_HEAP = -985                                                  ' Heap error (leak/double-free).
        kERROR_FORMAT = -984                                                ' Data parsing/formatting error. 
        kERROR_READ_ONLY = -983                                             ' Object is read-only (cannot be written).
        kERROR_WRITE_ONLY = -982                                            ' Object is write-only (cannot be read). 
        kERROR_BUSY = -981                                                  ' Agent is busy (cannot service request).
        kERROR_CONFLICT = -980                                              ' State conflicts with another object.
        kERROR_OS = -979                                                    ' Generic error reported by underlying OS.
        kERROR_DEVICE = -978                                                ' Hardware device error.
        kERROR_FULL = -977                                                  ' Resource is already fully utilized.
        kERROR_IN_PROGRESS = -976                                           ' Operation is in progress, but not yet complete.
        kERROR = 0                                                          ' General error. 
        kOK = 1                                                             ' Operation successful. 
    End Enum

    Enum GoRole
        GO_ROLE_MAIN = 0                                                    ' Sensor is operating as a main sensor
        GO_ROLE_BUDDY = 1                                                   ' Sensor is operating as a buddy sensor
    End Enum

    ' use DLL import to access GoSdkd.dll
    ' Note: to import the release version of the GoSdk and kApi, use GoSdk.dll and kApi.dll. GoSdkd.dll and kApid.dll are debug versions of the DLL
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSdk_Construct(ByRef assembly As IntPtr) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSystem_Construct(ByRef system As IntPtr, ByVal allocator As IntPtr) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSystem_FindSensorByIpAddress(ByVal system As IntPtr, ByVal addressPointer As IntPtr, ByRef sensor As IntPtr) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSystem_EnableData(ByVal system As IntPtr, ByVal enable As Boolean) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSensor_Connect(ByVal sensor As IntPtr) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSensor_Setup(ByVal sensor As IntPtr) As IntPtr
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSensor_Flush(ByVal sensor As IntPtr) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSetup_Exposure(ByVal setup As IntPtr, ByVal role As GoRole) As Double
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSetup_SetExposure(ByVal setup As IntPtr, ByVal role As GoRole, ByVal exposure As Double) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSensor_CopyFile(ByVal sensor As IntPtr, ByVal sourceName As String, ByVal destName As String) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoSensor_SetDefaultJob(ByVal sensor As IntPtr, ByVal fileName As String) As kStatus
    End Function
    <DllImport(Constants.GODLLPATH)> _
    Public Function GoDestroy(ByVal obj As IntPtr) As kStatus
    End Function
    <DllImport(Constants.KAPIDLLPATH)> _
    Public Function kIpAddress_Parse(ByVal addressPointer As IntPtr, ByVal text As String) As kStatus
    End Function

    Function Main() As Integer
        Dim status As kStatus
        Dim api As IntPtr = IntPtr.Zero
        Dim system As IntPtr = IntPtr.Zero
        Dim sensor As IntPtr = IntPtr.Zero
        Dim setup As IntPtr = IntPtr.Zero
        Dim currentExposure As Double
        Dim newExposure As Double
        Dim addr As New address
        Dim addrPtr As IntPtr = IntPtr.Zero

        status = GoSdk_Construct(api)
        If status <> 1 Then
            Console.WriteLine("GoSdk_Construct Error:{0}", status)
            Return status
        End If

        status = GoSystem_Construct(system, IntPtr.Zero)
        If status <> 1 Then
            Console.WriteLine("GoSystem_Construct Error:{0}", status)
            Return status
        End If

        addrPtr = Marshal.AllocHGlobal(Marshal.SizeOf(addr))
        Marshal.StructureToPtr(addr, addrPtr, False)

        status = kIpAddress_Parse(addrPtr, IP)
        If status <> 1 Then
            Console.WriteLine("kIpAddress_Parse Error:{0}", status)
            Return status
        End If

        status = GoSystem_FindSensorByIpAddress(system, addrPtr, sensor)
        If status <> 1 Then
            Console.WriteLine("GoSystem_FindSensorByIpAddress Error:{0}", status)
            Return status
        End If

        status = GoSensor_Connect(sensor)
        If status <> 1 Then
            Console.WriteLine("GoSensor_Connect Error:{0}", status)
            Return status
        End If

        setup = GoSensor_Setup(sensor)

        ' read current parameters
        currentExposure = GoSetup_Exposure(setup, GoRole.GO_ROLE_MAIN)
        Console.WriteLine("Current Parameters:")
        Console.WriteLine("-------------------")
        Console.WriteLine("Exposure: {0}", currentExposure)

        ' modify parameter in main sensor
        status = GoSetup_SetExposure(setup, GoRole.GO_ROLE_MAIN, currentExposure + 200)
        If status <> 1 Then
            Console.WriteLine("GoSetup_SetExposure Error:{0}", status)
            Return status
        End If

        ' GoSensorFlush() - immediately synchronizes configuration changes to the sensor
        ' *The changes will be shown on the web browser GUI after the browser has been refreshed.
        ' NOTE: Sensor is not automatically synchronized with every call to function that modifies a setting.
        ' This allows for rapid configuring sensors without delay caused by synchronization after every call.
        ' Generally functions that retreieve setting values causes automatic synchronization while functions that set values don't.
        ' Synchronization is also always guranteed prior to sensor entering running state. The GoSensor_Flush() function
        ' should only be used when configuration changes are needed to be seen immediately.
        status = GoSensor_Flush(sensor)
        If status <> 1 Then
            Console.WriteLine("GoSensor_Flush Error:{0}", status)
            Return status
        End If

        newExposure = GoSetup_Exposure(setup, GoRole.GO_ROLE_MAIN)
        Console.WriteLine("New Parameters:")
        Console.WriteLine("-------------------")
        Console.WriteLine("Exposure: {0}", newExposure)

        ' Save the configuration and template into a new file set. This is the same behavior as if the user clicks the save button in the tool bar
        status = GoSensor_CopyFile(sensor, "_live.job", "newExposure.job")
        If status <> 1 Then
            Console.WriteLine("GoSensor_CopyFile Error:{0}", status)
            Return status
        End If

        ' Set the saved configuration as default file. This makes it the active configuration when the sensor powers up.
        status = GoSensor_SetDefaultJob(sensor, "newExposure.job")
        If status <> 1 Then
            Console.WriteLine("GoSensor_SetDefaultJob Error:{0}", status)
            Return status
        End If

        ' Restore previous parameter setting
        status = GoSetup_SetExposure(setup, GoRole.GO_ROLE_MAIN, currentExposure)
        If status <> 1 Then
            Console.WriteLine("GoSetup_SetExposure Error:{0}", status)
            Return status
        End If

        status = GoDestroy(system)
        If status <> 1 Then
            Console.WriteLine("GoDestroy Error:{0}", status)
            Return status
        End If

        status = GoDestroy(api)
        If status <> 1 Then
            Console.WriteLine("GoDestroy Error:{0}", status)
            Return status
        End If

        'wait for ENTER key
        Console.WriteLine("Press ENTER to continue")
        Do While Not Console.ReadKey(True).Key = ConsoleKey.Enter
            Thread.Sleep(100)
        Loop
        Return status
    End Function
End Module
