-------------------------------------------------------------------------------
                       Matrox Imaging Library (MIL) 10.0
        MIL 9 to MIL 10 IO conversion table for the Matrox Solios eA/XA
                                 December, 2013
            (c) Copyright Matrox Electronic Systems Ltd., 1992-2013.
-------------------------------------------------------------------------------

MIL 10 has a new mechanism to control and inquire IO signals. It has unified 
some concepts under the M_IO_... constants of MdigControl/MdigInquire and 
generalized others that were being used for more than their original purpose 
(for example, M_GRAB_EXPOSURE_... to M_TIMER_...). 

Although the old mechanism still works, the old mechanism is deprecated. To 
port your code to the new mechanism, use the equivalence tables below.

Note that the concept of user-defined signals is now treated differently. To 
output a user-defined signal, you set a bit in a static user output register 
(M_USER_BIT_STATE). If you associate that bit with an output signal 
(M_IO_SOURCE), the state of the bit is routed onto the specified signal. To
inquire the state of an auxiliary input signal so that you can act upon it 
(user input), you inquire the status of the auxiliary signal directly 
(M_IO_STATUS); you don’t inquire a bit.

The following conversion table applies to the Matrox Solios eA/XA.

Contents

1. MIL 9 to MIL 10 conversion table.
2. MIL 9 to MIL 10 conversion examples.
   2.1 Setting a user-bit.
   2.2 Inquiring a user-bit.
   2.3 Hooking a callback function on a user-bit.
   2.4 Setting a grab trigger source.
   2.5 Setting a timer trigger source.


===============================================================================

1. MIL 9 to MIL 10 conversion table.
   
   M_HARDWARE_PORT0 is replaced by M_AUX_IO0
   M_HARDWARE_PORT1 is replaced by M_AUX_IO1
   M_HARDWARE_PORT2 is replaced by M_AUX_IO2
   M_HARDWARE_PORT3 is replaced by M_AUX_IO3
   M_HARDWARE_PORT4 is replaced by M_AUX_IO4
   M_HARDWARE_PORT5 is replaced by M_AUX_IO5
   M_HARDWARE_PORT6 is replaced by M_AUX_IO6
   M_HARDWARE_PORT7 is replaced by M_AUX_IO7
   M_HARDWARE_PORT8 is replaced by M_AUX_IO8
   M_HARDWARE_PORT9 is replaced by M_AUX_IO9

Note that the following table includes only equivalences for setting up output 
user-defined signals; see the subsequent table for inquiring user input signals 
(no corresponding register bit).
   MdigControl   M_USER_BIT_VALUE + 0 becomes M_USER_BIT_STATE + M_USER_BIT0
   MdigControl   M_USER_BIT_VALUE + 1 becomes M_USER_BIT_STATE + M_USER_BIT1
   MdigControl   M_USER_BIT_VALUE + 2 becomes M_USER_BIT_STATE + M_USER_BIT2

Note that the following table includes only equivalences for reading the status 
of a user input signal.
   MdigInquire   M_USER_BIT_VALUE + 3  becomes M_IO_STATUS + M_AUX_IO1
   MdigInquire   M_USER_BIT_VALUE + 4  becomes M_IO_STATUS + M_AUX_IO0
   MdigInquire   M_USER_BIT_VALUE + 5  becomes M_IO_STATUS + M_AUX_IO2
   MdigInquire   M_USER_BIT_VALUE + 6  becomes M_IO_STATUS + M_AUX_IO3
   MdigInquire   M_USER_BIT_VALUE + 7  becomes M_IO_STATUS + M_AUX_IO4
   MdigInquire   M_USER_BIT_VALUE + 8  becomes M_IO_STATUS + M_AUX_IO5
   MdigInquire   M_USER_BIT_VALUE + 9  becomes M_IO_STATUS + M_AUX_IO6
   MdigInquire   M_USER_BIT_VALUE + 10 becomes M_IO_STATUS + M_AUX_IO7
   MdigInquire   M_USER_BIT_VALUE + 11 becomes M_IO_STATUS + M_AUX_IO8
   MdigInquire   M_USER_BIT_VALUE + 12 becomes M_IO_STATUS + M_AUX_IO9

   MdigHookFunction   M_USER_BIT_CHANGE becomes M_IO_CHANGE


Note that the following table includes only equivalences for inquiring which 
input signal caused the interrupt event.
   MdigGetHookInfo   M_USER_BIT  returns 3 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO1
   MdigGetHookInfo   M_USER_BIT  returns 4 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO0
   MdigGetHookInfo   M_USER_BIT  returns 5 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO2
   MdigGetHookInfo   M_USER_BIT  returns 6 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO3
   MdigGetHookInfo   M_USER_BIT  returns 7 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO4
   MdigGetHookInfo   M_USER_BIT  returns 8 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO5
   MdigGetHookInfo   M_USER_BIT  returns 9 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO6
   MdigGetHookInfo   M_USER_BIT  returns 10 becomes M_IO_INTERRUPT_SOURCE returns M_AUX_IO7
   MdigGetHookInfo   M_USER_BIT  returns 11 becomes M_IO_INTERRUPT_SOURCE returns M_AUX_IO8
   MdigGetHookInfo   M_USER_BIT  returns 12 becomes M_IO_INTERRUPT_SOURCE returns M_AUX_IO9

Note that the following table includes only equivalences for signals whose 
format can be changed (e.g. TTL to LVDS). 
   MdigControl/Inquire   M_USER_BIT_FORMAT + 0  becomes M_IO_FORMAT + M_AUX_IO10
   MdigControl/Inquire   M_USER_BIT_FORMAT + 1  becomes M_IO_FORMAT + M_AUX_IO11
   MdigControl/Inquire   M_USER_BIT_FORMAT + 5  becomes M_IO_FORMAT + M_AUX_IO2
   MdigControl/Inquire   M_USER_BIT_FORMAT + 6  becomes M_IO_FORMAT + M_AUX_IO3
   MdigControl/Inquire   M_USER_BIT_FORMAT + 7  becomes M_IO_FORMAT + M_AUX_IO4
   MdigControl/Inquire   M_USER_BIT_FORMAT + 8  becomes M_IO_FORMAT + M_AUX_IO5
   MdigControl/Inquire   M_USER_BIT_FORMAT + 9  becomes M_IO_FORMAT + M_AUX_IO6
   MdigControl/Inquire   M_USER_BIT_FORMAT + 10 becomes M_IO_FORMAT + M_AUX_IO7
   MdigControl/Inquire   M_USER_BIT_FORMAT + 11 becomes M_IO_FORMAT + M_AUX_IO8
   MdigControl/Inquire   M_USER_BIT_FORMAT + 12 becomes M_IO_FORMAT + M_AUX_IO9


Note that the following table includes only equivalences for controlling/
inquiring whether an input signal should cause an interrupt. 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 3  becomes M_IO_INTERRUPT_STATE + M_AUX_IO1 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 4  becomes M_IO_INTERRUPT_STATE + M_AUX_IO0 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 5  becomes M_IO_INTERRUPT_STATE + M_AUX_IO2 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 6  becomes M_IO_INTERRUPT_STATE + M_AUX_IO3 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 7  becomes M_IO_INTERRUPT_STATE + M_AUX_IO4 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 8  becomes M_IO_INTERRUPT_STATE + M_AUX_IO5 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 9  becomes M_IO_INTERRUPT_STATE + M_AUX_IO6 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 10 becomes M_IO_INTERRUPT_STATE + M_AUX_IO7
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 11 becomes M_IO_INTERRUPT_STATE + M_AUX_IO8
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 12 becomes M_IO_INTERRUPT_STATE + M_AUX_IO9


Note that the following table includes only equivalences for controlling/
inquiring input signals that cause an interrupt.
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 3  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO1 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 4  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO0 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 5  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO2 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 6  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO3 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 7  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO4 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 8  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO5 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 9  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO6 
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 10 becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO7
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 11 becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO8
   MdigControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 12 becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO9

   MdigControl           M_GRAB_TRIGGER with M_ACTIVATE becomes M_GRAB_TRIGGER_SOFTWARE with M_ACTIVATE 

   MdigGetHookInfo       M_GRAB_EXPOSURE_TRIGGER_MISSED becomes M_TIMER_TRIGGER_MISSED 

   MdigControl/Inquire   M_GRAB_EXPOSURE + M_TIMERn                       becomes M_TIMER_STATE + M_TIMERn         
   MdigControl           M_GRAB_EXPOSURE + M_TIMERn with M_ACTIVATE       becomes M_TIMER_TRIGGER_SOFTWARE + M_TIMERn with M_ACTIVATE
   MdigControl/Inquire   M_GRAB_EXPOSURE_SOURCE + M_TIMERn                becomes M_TIMER_TRIGGER_SOURCE + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_MODE + M_TIMERn                  becomes M_TIMER_OUTPUT_INVERTER + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_DELAY_CLOCK_MODE + M_TIMERn      becomes M_TIMER_DELAY_CLOCK_ACTIVATION + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_DELAY_CLOCK_SOURCE + M_TIMERn    becomes M_TIMER_DELAY_CLOCK_SOURCE + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TRIGGER_MODE + M_TIMERn          becomes M_TIMER_TRIGGER_ACTIVATION + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_CLOCK_SOURCE + M_TIMERn          becomes M_TIMER_CLOCK_SOURCE + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_USAGE + M_TIMERn                 becomes M_TIMER_USAGE + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TRIGGER_MISSED + M_TIMERn        becomes M_TIMER_TRIGGER_MISSED + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TRIGGER_MISSED_STATUS + M_TIMERn becomes M_TIMER_TRIGGER_MISSED_STATUS + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TRIGGER_DIVIDER + M_TIMERn       becomes M_TIMER_TRIGGER_RATE_DIVIDER + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_ARM + M_TIMERn                   becomes M_TIMER_ARM + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_ARM + M_TIMERn with M_ACTIVATE   becomes M_TIMER_ARM_SOFTWARE + M_TIMERn with M_ACTIVATE
   MdigControl/Inquire   M_GRAB_EXPOSURE_ARM_SOURCE + M_TIMERn            becomes M_TIMER_ARM_SOURCE + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_ARM_MODE + M_TIMERn              becomes M_TIMER_ARM_ACTIVATION + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TIME_MAX + M_TIMERn              becomes M_TIMER_DURATION_MAX + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TIME + M_TIMERn                  becomes M_TIMER_DURATION + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TIME_DELAY + M_TIMERn            becomes M_TIMER_DELAY + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_CLOCK_FREQUENCY + M_TIMERn       becomes M_TIMER_CLOCK_FREQUENCY + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_TIMEOUT + M_TIMERn               becomes M_TIMER_TIMEOUT + M_TIMERn
   MdigControl/Inquire   M_GRAB_EXPOSURE_MEASURED + M_TIMERn              becomes M_TIMER_VALUE + M_TIMERn



2. MIL 9 to MIL 10 conversion examples.

   2.1 Setting a user-bit.

      Using Mil 9 IO API:
         MdigControl(MilDigitizer, M_USER_BIT_VALUE + 0, M_ON);

      Using Mil 10 IO API:
         MdigControl(MilDigitizer, M_USER_BIT_STATE + M_USER_BIT0, M_ON);
         MdigControl(MilDigitizer, M_IO_SOURCE + M_AUX_IO10, M_USER_BIT0);

   2.2 Inquiring a user-bit.

      Using Mil 9 IO API:
         MdigInquire(MilDigitizer, M_USER_BIT_VALUE + 3, &Value);

      Using Mil 10 IO API:
         MdigInquire(MilDigitizer, M_IO_STATUS + M_AUX_IO1, &Value);

   2.3 Hooking a callback function on a user-bit.

      Using Mil 9 IO API:
         MdigControl(MilDigitizer, M_USER_BIT_INTERRUPT_MODE + 3, M_EDGE_RISING);
         MdigHookFunction(MilDigitizer, M_USER_BIT_CHANGE, HookHandlerFnc, &HookData);
         MdigControl(MilDigitizer, M_USER_BIT_INTERRUPT_STATE + 3, M_ENABLE);

         MIL_INT HookHandlerFnc(MIL_INT HookType, MIL_ID EventId, void *UserDataPtr)
            {
            MIL_INT UserBit = 0;
            MdigGetHookInfo(EventId, M_USER_BIT, &UserBit);
            // UserBit will be 3 when interrupt is fired.
            }

      Using Mil 10 IO API:
         MdigControl(MilDigitizer, M_IO_INTERRUPT_ACTIVATION + M_AUX_IO1, M_EDGE_RISING);
         MdigHookFunction(MilDigitizer, M_IO_CHANGE, HookHandlerFnc, &HookData);
         MdigControl(MilDigitizer, M_IO_INTERRUPT_STATE + M_AUX_IO1, M_ENABLE);

         MIL_INT HookHandlerFnc(MIL_INT HookType, MIL_ID EventId, void *UserDataPtr)
            {
            MIL_INT IOSource = 0;
            MdigGetHookInfo(EventId, M_IO_INTERRUPT_SOURCE , &IOSource);
            // IOSource will be M_AUX_IO1 when interrupt is fired.
            }

   2.4 Setting a grab trigger source.

      Using Mil 9 IO API:
         MdigControl(MilDigitizer, M_GRAB_TRIGGER_SOURCE, M_HARDWARE_PORT0);

      Using Mil 10 IO API:
         MdigControl(MilDigitizer, M_GRAB_TRIGGER_SOURCE, M_AUX_IO0);

   2.5 Setting a timer trigger source.

      Using Mil 9 IO API:
         MdigControl(MilDigitizer, M_GRAB_EXPOSURE_SOURCE, M_HARDWARE_PORT0);

      Using Mil 10 IO API:
         MdigControl(MilDigitizer, M_TIMER_TRIGGER_SOURCE, M_AUX_IO0);