-------------------------------------------------------------------------------
                       Matrox Imaging Library (MIL) 10.0
        MIL 9 to MIL 10 IO conversion table for the Matrox Morphis QxT
                                 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 MsysControl/MsysInquire.

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). 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 Morphis QxT.

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.


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

1. MIL 9 to MIL 10 conversion table.

Note that the following table includes only equivalences for inquiring whether 
a signal is an input or an output.
   MsysInquire M_USER_BIT_MODE + n  becomes M_IO_MODE + M_AUX_IOn

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).
   MsysControl M_USER_BIT_VALUE_OUT + 0  becomes M_USER_BIT_STATE + M_USER_BIT0
   MsysControl M_USER_BIT_VALUE_OUT + 1  becomes M_USER_BIT_STATE + M_USER_BIT1
   MsysControl M_USER_BIT_VALUE_OUT + 2  becomes M_USER_BIT_STATE + M_USER_BIT2
   MsysControl M_USER_BIT_VALUE_OUT + 3  becomes M_USER_BIT_STATE + M_USER_BIT3
   MsysControl M_USER_BIT_VALUE_OUT + 4  becomes M_USER_BIT_STATE + M_USER_BIT4
   MsysControl M_USER_BIT_VALUE_OUT + 5  becomes M_USER_BIT_STATE + M_USER_BIT5
   MsysControl M_USER_BIT_VALUE_OUT + 6  becomes M_USER_BIT_STATE + M_USER_BIT6
   MsysControl M_USER_BIT_VALUE_OUT + 7  becomes M_USER_BIT_STATE + M_USER_BIT7
   MsysControl M_USER_BIT_VALUE_OUT + 8  becomes M_USER_BIT_STATE + M_USER_BIT8
   MsysControl M_USER_BIT_VALUE_OUT + 9  becomes M_USER_BIT_STATE + M_USER_BIT9
   MsysControl M_USER_BIT_VALUE_OUT + 10 becomes M_USER_BIT_STATE + M_USER_BIT10
   MsysControl M_USER_BIT_VALUE_OUT + 11 becomes M_USER_BIT_STATE + M_USER_BIT11
   MsysControl M_USER_BIT_VALUE_OUT + 12 becomes M_USER_BIT_STATE + M_USER_BIT12
   MsysControl M_USER_BIT_VALUE_OUT + 13 becomes M_USER_BIT_STATE + M_USER_BIT13
   MsysControl M_USER_BIT_VALUE_OUT + 14 becomes M_USER_BIT_STATE + M_USER_BIT14
   MsysControl M_USER_BIT_VALUE_OUT + 15 becomes M_USER_BIT_STATE + M_USER_BIT15

Note that the following table includes only equivalences for reading the status 
of a user input signal.
   MsysInquire   M_USER_BIT_VALUE_IN + 0   becomes M_IO_STATUS + M_AUX_IO16
   MsysInquire   M_USER_BIT_VALUE_IN + 1   becomes M_IO_STATUS + M_AUX_IO17
   MsysInquire   M_USER_BIT_VALUE_IN + 2   becomes M_IO_STATUS + M_AUX_IO18
   MsysInquire   M_USER_BIT_VALUE_IN + 3   becomes M_IO_STATUS + M_AUX_IO19
   MsysInquire   M_USER_BIT_VALUE_IN + 4   becomes M_IO_STATUS + M_AUX_IO20
   MsysInquire   M_USER_BIT_VALUE_IN + 5   becomes M_IO_STATUS + M_AUX_IO21
   MsysInquire   M_USER_BIT_VALUE_IN + 6   becomes M_IO_STATUS + M_AUX_IO22
   MsysInquire   M_USER_BIT_VALUE_IN + 7   becomes M_IO_STATUS + M_AUX_IO23
   MsysInquire   M_USER_BIT_VALUE_IN + 8   becomes M_IO_STATUS + M_AUX_IO24
   MsysInquire   M_USER_BIT_VALUE_IN + 9   becomes M_IO_STATUS + M_AUX_IO25
   MsysInquire   M_USER_BIT_VALUE_IN + 10  becomes M_IO_STATUS + M_AUX_IO26
   MsysInquire   M_USER_BIT_VALUE_IN + 11  becomes M_IO_STATUS + M_AUX_IO27
   MsysInquire   M_USER_BIT_VALUE_IN + 12  becomes M_IO_STATUS + M_AUX_IO28
   MsysInquire   M_USER_BIT_VALUE_IN + 13  becomes M_IO_STATUS + M_AUX_IO29
   MsysInquire   M_USER_BIT_VALUE_IN + 14  becomes M_IO_STATUS + M_AUX_IO30
   MsysInquire   M_USER_BIT_VALUE_IN + 15  becomes M_IO_STATUS + M_AUX_IO31

   MsysHookFunction   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.
   MsysGetHookInfo   M_USER_BIT  returns 0  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO16
   MsysGetHookInfo   M_USER_BIT  returns 1  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO17
   MsysGetHookInfo   M_USER_BIT  returns 2  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO18
   MsysGetHookInfo   M_USER_BIT  returns 3  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO19
   MsysGetHookInfo   M_USER_BIT  returns 4  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO20
   MsysGetHookInfo   M_USER_BIT  returns 5  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO21
   MsysGetHookInfo   M_USER_BIT  returns 6  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO22
   MsysGetHookInfo   M_USER_BIT  returns 7  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO23
   MsysGetHookInfo   M_USER_BIT  returns 8  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO24
   MsysGetHookInfo   M_USER_BIT  returns 9  becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO25
   MsysGetHookInfo   M_USER_BIT  returns 10 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO26
   MsysGetHookInfo   M_USER_BIT  returns 11 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO27
   MsysGetHookInfo   M_USER_BIT  returns 12 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO28
   MsysGetHookInfo   M_USER_BIT  returns 13 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO29
   MsysGetHookInfo   M_USER_BIT  returns 14 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO30
   MsysGetHookInfo   M_USER_BIT  returns 15 becomes  M_IO_INTERRUPT_SOURCE returns M_AUX_IO31

Note that the following table includes only equivalences for controlling/
inquiring whether an input signal should cause an interrupt. 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 0   becomes M_IO_INTERRUPT_STATE + M_AUX_IO16 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 1   becomes M_IO_INTERRUPT_STATE + M_AUX_IO17 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 2   becomes M_IO_INTERRUPT_STATE + M_AUX_IO18 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 3   becomes M_IO_INTERRUPT_STATE + M_AUX_IO19 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 4   becomes M_IO_INTERRUPT_STATE + M_AUX_IO20 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 5   becomes M_IO_INTERRUPT_STATE + M_AUX_IO21 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 6   becomes M_IO_INTERRUPT_STATE + M_AUX_IO22 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 7   becomes M_IO_INTERRUPT_STATE + M_AUX_IO23 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 8   becomes M_IO_INTERRUPT_STATE + M_AUX_IO24 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 9   becomes M_IO_INTERRUPT_STATE + M_AUX_IO25 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 10  becomes M_IO_INTERRUPT_STATE + M_AUX_IO26 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 11  becomes M_IO_INTERRUPT_STATE + M_AUX_IO27 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 12  becomes M_IO_INTERRUPT_STATE + M_AUX_IO28 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 13  becomes M_IO_INTERRUPT_STATE + M_AUX_IO29 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 14  becomes M_IO_INTERRUPT_STATE + M_AUX_IO30 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_STATE  + 15  becomes M_IO_INTERRUPT_STATE + M_AUX_IO31 

Note that the following table includes only equivalences for controlling/
inquiring input signals that cause an interrupt.
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 0   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO16 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 1   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO17 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 2   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO18 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 3   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO19 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 4   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO20 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 5   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO21 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 6   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO22 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 7   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO23 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 8   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO24 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 9   becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO25 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 10  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO26 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 11  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO27 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 12  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO28 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 13  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO29 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 14  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO30 
   MsysControl/Inquire   M_USER_BIT_INTERRUPT_MODE  + 15  becomes M_IO_INTERRUPT_ACTIVATION + M_AUX_IO31 

2. MIL 9 to MIL 10 conversion examples.

   2.1 Setting a user-bit.

      Using Mil 9 IO API:
         MsysControl(MilSystem, M_USER_BIT_VALUE_OUT + 0, M_ON);

      Using Mil 10 IO API:
         MsysControl(MilSystem, M_USER_BIT_STATE + M_USER_BIT0, M_ON);

   2.2 Inquiring a user-bit.

      Using Mil 9 IO API:
         MsysInquire(MilSystem, M_USER_BIT_VALUE_IN + 0, &Value);

      Using Mil 10 IO API:
         MsysInquire(MilSystem, M_IO_STATUS + M_AUX_IO16, &Value);

   2.3 Hooking a callback function on a user-bit.

      Using Mil 9 IO API:
         MsysControl(MilSystem, M_USER_BIT_INTERRUPT_MODE + 0, M_EDGE_RISING);
         MsysHookFunction(MilSystem, M_USER_BIT_CHANGE, HookHandlerFnc, &HookData);
         MsysControl(MilSystem, M_USER_BIT_INTERRUPT_STATE + 0, M_ENABLE);

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

      Using Mil 10 IO API:
         MsysControl(MilSystem, M_IO_INTERRUPT_ACTIVATION + M_AUX_IO16, M_EDGE_RISING);
         MsysHookFunction(MilSystem, M_IO_CHANGE, HookHandlerFnc, &HookData);
         MsysControl(MilSystem, M_IO_INTERRUPT_STATE + M_AUX_IO16, M_ENABLE);

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