Click here to show toolbars of the Web Online Help System: show toolbars
 

//******************************************************************************
//
// File name: DMRContextViewer.cpp
// Location: See Matrox Example Launcher in the MIL Control Center
// 
//
// Synopsis:  This example inquires the settings and the fonts of an
//            interactively restored Dot Matrix Reader (SureDotOCR) context.
//            The inquired values are either displayed on screen 
//            or saved to disk depending on user's choice. 
//
// Copyright (C) Matrox Electronic Systems Ltd., 1992-2016.
// All Rights Reserved

#include <mil.h>

// Define the struct of the settings.
struct SDMRSettings
   {
   MIL_DOUBLE DotDiameter;
   MIL_INT    ForegroundValue;
   MIL_DOUBLE MaxIntensity;
   MIL_INT    MaxIntensityMode;
   MIL_INT    MinContrast;
   MIL_INT    MinContrastMode;
   MIL_DOUBLE MinIntensity;
   MIL_INT    MinIntensityMode;
   MIL_INT    NbOfFont;
   MIL_INT    NbOfStringModels;
   MIL_INT    DefaultSystem;
   MIL_DOUBLE SpaceSizeMax;
   MIL_INT    SpaceSizeMaxMode;
   MIL_DOUBLE SpaceSizeMin;
   MIL_INT    SpaceSizeMinMode;
   MIL_DOUBLE StringBoxHeight;
   MIL_INT    StringBoxSizeMode;
   MIL_DOUBLE StringBoxWidth;
   MIL_DOUBLE TimeOut;

   // String model parameters.
   MIL_DOUBLE CharAcceptance;
   MIL_INT    NbOfConstrainedPositions;
   MIL_DOUBLE StringAcceptance;
   MIL_DOUBLE StringCertainty;
   MIL_DOUBLE StringIndexValue;
   MIL_DOUBLE StringLabelValue;
   MIL_INT    StringRank;
   MIL_INT    StringSizeMax;
   MIL_INT    StringSizeMin;

   // Font parameters.
   MIL_INT    FontLabel;
   MIL_INT    NbOfPermittedChars;
   MIL_INT    ConstraintPosition;
   MIL_INT    ConstraintType;
   MIL_INT    FontSizeColumns;
   MIL_INT    FontSizeRows;
   MIL_INT    FontSizeTemplate;
   MIL_INT    NbOfChars;
   };

// Output context info. to text file (if chosen)
MIL_CONST_TEXT_PTR OUTPUT_FILE  = MIL_TEXT("MdmrContext.txt");
const MIL_INT MAX_STRING_LENGTH = 30;

// Major inquiry functions
void InquireSettings    (MIL_ID DmrCntxId, SDMRSettings& DMRSettings, MIL_FILE OutputTarget);
void InquireStringModel (MIL_ID DmrCntxId, SDMRSettings& DMRSettings, MIL_FILE OutputTarget);
void InquireAndPrintFont(MIL_ID DmrCntxId, SDMRSettings& DMRSettings, MIL_FILE OutputTarget);

// Helper functions
// Open or close output file to screen or text file.
void SetOutputTarget(MIL_FILE* pOutputTarget);

// Translate the definitions parameters to string.
MIL_TEXT_PTR DefToStr(MIL_INT TheDef);

// Print out string constraint
void PrintConstraintInfo(MIL_ID DmrCntxId, MIL_INT ConstraintType, MIL_TEXT_PTR CharName, MIL_INT ConstraintFontLabel, MIL_FILE OutputTarget);

// Print the font to output or a text file.
void PrintTemplate(MIL_FILE OutputTarget, MIL_UINT8* CharTemplate, MIL_INT FontSizeRows, MIL_INT FontSizeColumns);

// Example description.
void PrintHeader()
   {
   MosPrintf(MIL_TEXT("[EXAMPLE NAME]\n")
             MIL_TEXT("DMRContextViewer\n\n")
             MIL_TEXT("[SYNOPSIS]\n")
             MIL_TEXT("This example demonstrates how to inquire the DMR context settings.\n\n")
             MIL_TEXT("[MODULES USED]\n")
             MIL_TEXT("Modules used: Application, System, Dot Matrix Reader.\n\n")
             
             MIL_TEXT("NOTE:\n")
             MIL_TEXT("If you don't have context ready to use,\n")
             MIL_TEXT("there is one preset context for testing purpose:\n")
             MIL_TEXT("\"Matrox Imaging\\Images\\DmrContextViewer\\SampleDmrContextForInquiry.mdmr\"\n\n")

             MIL_TEXT("Press <Enter> to restore a Dot Matrix Reader context from disk.\n"));

   MosGetch();
   }

// Main.
int MosMain(void)
   {
   PrintHeader();

   MIL_ID MilApplication;            // Application identifier.
   MIL_ID MilSystem;                 // System identifier.
   SDMRSettings DMRSettings;

   // Allocate the application.
   MappAlloc(M_NULL, M_DEFAULT, &MilApplication);

   // Alloc the system
   MsysAlloc(M_DEFAULT, M_SYSTEM_HOST, M_DEFAULT, M_DEFAULT, &MilSystem);

   // Interactively restore a Dot Matrix Reader context.
   MappControl(M_ERROR, M_PRINT_DISABLE);
   MIL_ID DmrCntxId = MdmrRestore(M_INTERACTIVE, MilSystem, M_DEFAULT, M_NULL);
   MappControl(M_ERROR, M_PRINT_ENABLE);

   if (DmrCntxId != M_NULL)
      {
      // Set output to screen or text file
      MIL_FILE OutputTarget = M_NULL;
      SetOutputTarget(&OutputTarget);

      // Inquire the context settings.
      InquireSettings(DmrCntxId, DMRSettings, OutputTarget);

      // Inquire the string models info.
      InquireStringModel(DmrCntxId, DMRSettings, OutputTarget);

      // Inquire the font info.
      InquireAndPrintFont(DmrCntxId, DMRSettings, OutputTarget);

      // Finish output
      SetOutputTarget(&OutputTarget);

      // Free DMR context
      MdmrFree(DmrCntxId);
      }

   // Free system and application.
   MsysFree(MilSystem);
   MappFree(MilApplication);

   return 0;
   }

// Function to inquire settings.
void InquireSettings(MIL_ID DmrCntxId, SDMRSettings &DMRSettings, MIL_FILE OutputTarget)
   {
   MosFprintf(OutputTarget, MIL_TEXT("-------------------------------------------\n")
                            MIL_TEXT("Context Settings:\n")
                            MIL_TEXT("-------------------------------------------\n"));

   // Inquiry on dot diameters
   MdmrInquire(DmrCntxId, M_DOT_DIAMETER + M_TYPE_MIL_DOUBLE, &DMRSettings.DotDiameter);
   if (M_DEFAULT == DMRSettings.DotDiameter)
      {
      MdmrInquire(DmrCntxId, M_DOT_DIAMETER + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.DotDiameter);
      MosFprintf(OutputTarget, MIL_TEXT("M_DOT_DIAMETER            = M_DEFAULT (%s)\n"), DefToStr(MIL_INT(DMRSettings.DotDiameter)));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_DOT_DIAMETER            = %.2f\n"), DMRSettings.DotDiameter);
      }

   // Inquiry on foreground values
   MdmrInquire(DmrCntxId, M_FOREGROUND_VALUE + M_TYPE_MIL_INT, &DMRSettings.ForegroundValue);
   if (M_DEFAULT == DMRSettings.ForegroundValue)
      {
      MdmrInquire(DmrCntxId, M_FOREGROUND_VALUE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.ForegroundValue);
      MosFprintf(OutputTarget, MIL_TEXT("M_FOREGROUND_VALUE        = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.ForegroundValue));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_FOREGROUND_VALUE        = %s\n"), DefToStr(DMRSettings.ForegroundValue));
      }

   // Inquiry on max pixel intensity mode
   MdmrInquire(DmrCntxId, M_MAX_INTENSITY_MODE + M_TYPE_MIL_INT, &DMRSettings.MaxIntensityMode);
   if (M_DEFAULT == DMRSettings.MaxIntensityMode)
      {
      MdmrInquire(DmrCntxId, M_MAX_INTENSITY_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.MaxIntensityMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_MAX_INTENSITY_MODE      = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.MaxIntensityMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MAX_INTENSITY_MODE      = %s\n"), DefToStr(DMRSettings.MaxIntensityMode));
      }

   // Inquiry on maximum pixel intensity
   MdmrInquire(DmrCntxId, M_MAX_INTENSITY + M_TYPE_MIL_DOUBLE, &DMRSettings.MaxIntensity);
   if (M_DEFAULT == DMRSettings.MaxIntensity)
      {
      MdmrInquire(DmrCntxId, M_MAX_INTENSITY + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.MaxIntensity);
      MosFprintf(OutputTarget, MIL_TEXT("M_MAX_INTENSITY           = M_DEFAULT (%.2f)\n"), DMRSettings.MaxIntensity);
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MAX_INTENSITY           = %.2f\n"), DMRSettings.MaxIntensity);
      }

   // Inquiry on min pixel intensity mode
   MdmrInquire(DmrCntxId, M_MIN_INTENSITY_MODE + M_TYPE_MIL_INT, &DMRSettings.MinIntensityMode);
   if (M_DEFAULT == DMRSettings.MinIntensityMode)
      {
      MdmrInquire(DmrCntxId, M_MIN_INTENSITY_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.MinIntensityMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_INTENSITY_MODE      = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.MinIntensityMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_INTENSITY_MODE      = %s\n"), DefToStr(DMRSettings.MinIntensityMode));
      }

   // Inquiry on minimum pixel intensity
   MdmrInquire(DmrCntxId, M_MIN_INTENSITY + M_TYPE_MIL_DOUBLE, &DMRSettings.MinIntensity);
   if (M_DEFAULT == DMRSettings.MinIntensity)
      {
      MdmrInquire(DmrCntxId, M_MIN_INTENSITY + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.MinIntensity);
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_INTENSITY           = M_DEFAULT (%.2f)\n"), DMRSettings.MinIntensity);
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_INTENSITY           = %.2f\n"), DMRSettings.MinIntensity);
      }

   // Inquiry on min contrast mode
   MdmrInquire(DmrCntxId, M_MIN_CONTRAST_MODE + M_TYPE_MIL_INT, &DMRSettings.MinContrastMode);
   if (M_DEFAULT == DMRSettings.MinContrastMode)
      {
      MdmrInquire(DmrCntxId, M_MIN_CONTRAST_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.MinContrastMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_CONTRAST_MODE       = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.MinContrastMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_CONTRAST_MODE       = %s\n"), DefToStr(DMRSettings.MinContrastMode));
      }

   // Inquiry on min contrast
   MdmrInquire(DmrCntxId, M_MIN_CONTRAST + M_TYPE_MIL_INT, &DMRSettings.MinContrast);
   if (M_DEFAULT == DMRSettings.MinContrast)
      {
      MdmrInquire(DmrCntxId, M_MIN_CONTRAST + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.MinContrast);
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_CONTRAST            = M_DEFAULT (%d)\n"), (long) DMRSettings.MinContrast);
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_MIN_CONTRAST            = %d\n"), (long) DMRSettings.MinContrast);
      }
   
   // Inquiry on M_SPACE_SIZE_MAX_MODE
   MdmrInquire(DmrCntxId, M_SPACE_SIZE_MAX_MODE + M_TYPE_MIL_INT, &DMRSettings.SpaceSizeMaxMode);
   if (M_DEFAULT == DMRSettings.SpaceSizeMaxMode)
      {
      MdmrInquire(DmrCntxId, M_SPACE_SIZE_MAX_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.SpaceSizeMaxMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MAX_MODE     = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.SpaceSizeMaxMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MAX_MODE     = %s\n"), DefToStr(DMRSettings.SpaceSizeMaxMode));
      }

   // Inquiry on M_SPACE_SIZE_MAX
   MdmrInquire(DmrCntxId, M_SPACE_SIZE_MAX + M_TYPE_MIL_DOUBLE, &DMRSettings.SpaceSizeMax);
   if (M_DEFAULT == DMRSettings.SpaceSizeMax)
      {
      MdmrInquire(DmrCntxId, M_SPACE_SIZE_MAX + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.SpaceSizeMax);
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MAX          = M_DEFAULT (%.2f)\n"), DMRSettings.SpaceSizeMax);
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MAX          = %.2f\n"), (long) DMRSettings.SpaceSizeMax);
      }

   // Inquiry on M_SPACE_SIZE_MIN_MODE
   MdmrInquire(DmrCntxId, M_SPACE_SIZE_MIN_MODE + M_TYPE_MIL_INT, &DMRSettings.SpaceSizeMinMode);
   if (M_DEFAULT == DMRSettings.SpaceSizeMinMode)
      {
      MdmrInquire(DmrCntxId, M_SPACE_SIZE_MIN_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.SpaceSizeMinMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MIN_MODE     = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.SpaceSizeMinMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MIN_MODE     = %s\n"), DefToStr(DMRSettings.SpaceSizeMinMode));
      }

   // Inquiry on M_SPACE_SIZE_MIN
   MdmrInquire(DmrCntxId, M_SPACE_SIZE_MIN + M_TYPE_MIL_DOUBLE, &DMRSettings.SpaceSizeMin);
   if (M_DEFAULT == DMRSettings.SpaceSizeMin)
      {
      MdmrInquire(DmrCntxId, M_SPACE_SIZE_MIN + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.SpaceSizeMin);
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MIN          = M_DEFAULT (%.2f)\n"), DMRSettings.SpaceSizeMin);
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_SPACE_SIZE_MIN          = %.2f\n"), DMRSettings.SpaceSizeMin);
      }

   // Inquiry on M_STRING_BOX_SIZE_MODE
   MdmrInquire(DmrCntxId, M_STRING_BOX_SIZE_MODE + M_TYPE_MIL_INT, &DMRSettings.StringBoxSizeMode);
   if (M_DEFAULT == DMRSettings.StringBoxSizeMode)
      {
      MdmrInquire(DmrCntxId, M_STRING_BOX_SIZE_MODE + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.StringBoxSizeMode);
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_SIZE_MODE    = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.StringBoxSizeMode));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_SIZE_MODE    = %s\n"), DefToStr(DMRSettings.StringBoxSizeMode));
      }

   // Inquiry on width of the rectangular region in which to read strings
   MdmrInquire(DmrCntxId, M_STRING_BOX_WIDTH + M_TYPE_MIL_DOUBLE, &DMRSettings.StringBoxWidth);
   if (M_DEFAULT == DMRSettings.StringBoxWidth)
      {
      MdmrInquire(DmrCntxId, M_STRING_BOX_WIDTH + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.StringBoxWidth);
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_WIDTH        = M_DEFAULT (%s)\n"), DefToStr(MIL_INT(DMRSettings.StringBoxWidth)));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_WIDTH        = %.2f\n"), DMRSettings.StringBoxWidth);
      }

   // Inquiry on the height of the rectangular region in which to read strings
   MdmrInquire(DmrCntxId, M_STRING_BOX_HEIGHT + M_TYPE_MIL_DOUBLE, &DMRSettings.StringBoxHeight);
   if (M_DEFAULT == DMRSettings.StringBoxHeight)
      {
      MdmrInquire(DmrCntxId, M_STRING_BOX_HEIGHT + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.StringBoxHeight);
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_HEIGHT       = M_DEFAULT (%s)\n"), DefToStr(MIL_INT(DMRSettings.StringBoxHeight)));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_BOX_HEIGHT       = %.2f\n"), DMRSettings.StringBoxHeight);
      }

   // Inquiry on number of fonts
   MdmrInquire(DmrCntxId, M_NUMBER_OF_FONTS + M_TYPE_MIL_INT, &DMRSettings.NbOfFont);
   MosFprintf(OutputTarget, MIL_TEXT("M_NUMBER_OF_FONTS         = %d\n"), (long) DMRSettings.NbOfFont);

   // Inquiry on number of string models
   DMRSettings.NbOfStringModels = MdmrInquire(DmrCntxId, M_NUMBER_OF_STRING_MODELS, M_NULL);
   MosFprintf(OutputTarget, MIL_TEXT("M_NUMBER_OF_STRING_MODELS = %d\n"), (long) DMRSettings.NbOfStringModels);

   // Inquiry on time out
   MdmrInquire(DmrCntxId, M_TIMEOUT + M_TYPE_MIL_DOUBLE, &DMRSettings.TimeOut);
   if (M_DEFAULT == DMRSettings.TimeOut)
      {
      MdmrInquire(DmrCntxId, M_TIMEOUT + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.TimeOut);
      MosFprintf(OutputTarget, MIL_TEXT("M_TIMEOUT                 = M_DEFAULT (%.2f)\n"), DMRSettings.TimeOut);
      }
   else if(M_DISABLE == DMRSettings.TimeOut)
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_TIMEOUT                 = M_DISABLE\n"));
      }
   else
      {
      MosFprintf(OutputTarget, MIL_TEXT("M_TIMEOUT                 = %.2f\n"), DMRSettings.TimeOut);
      }

   // Pause for next section
   if (MIL_STDOUT == OutputTarget)
      {
      MosPrintf(MIL_TEXT("\nPress <Enter> to show string model info.\n\n"));
      MosGetch();
      }
   }

// Function to inquire string models
void InquireStringModel(MIL_ID DmrCntxId, SDMRSettings &DMRSettings, MIL_FILE OutputTarget)
   {
   if ((DMRSettings.NbOfStringModels == 0) && (MIL_STDOUT == OutputTarget))
      {
      MosFprintf(OutputTarget, MIL_TEXT("\nNo string models are defined. Press <Enter> to show font info.\n\n"));
      MosGetch();
      return;
      }

   for(MIL_INT StrIndex = 0; StrIndex < DMRSettings.NbOfStringModels; StrIndex++)
      {
      MosFprintf(OutputTarget, MIL_TEXT("\n-------------------------------------------\n"));
      MosFprintf(OutputTarget, MIL_TEXT("String model %d settings:\n"), (long) StrIndex);
      MosFprintf(OutputTarget, MIL_TEXT("-------------------------------------------\n"));

      // Inquiry on character's acceptance level
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_CHAR_ACCEPTANCE + M_TYPE_MIL_DOUBLE, &DMRSettings.CharAcceptance);
      if (M_DEFAULT == DMRSettings.CharAcceptance)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_CHAR_ACCEPTANCE + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.CharAcceptance);
         MosFprintf(OutputTarget, MIL_TEXT("M_CHAR_ACCEPTANCE                 = M_DEFAULT (%.2f)\n"), DMRSettings.CharAcceptance);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_CHAR_ACCEPTANCE                 = %.2f\n"), DMRSettings.CharAcceptance);
         }

      // Inquiry on string score acceptance level
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_ACCEPTANCE + M_TYPE_MIL_DOUBLE, &DMRSettings.StringAcceptance);
      if (M_DEFAULT == DMRSettings.StringAcceptance)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_ACCEPTANCE + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.StringAcceptance);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_ACCEPTANCE               = M_DEFAULT (%.2f)\n"), DMRSettings.StringAcceptance);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_ACCEPTANCE               = %.2f\n"), DMRSettings.StringAcceptance);
         }

      // Inquiry on string certainty level
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_CERTAINTY + M_TYPE_MIL_DOUBLE, &DMRSettings.StringCertainty);
      if (M_DEFAULT == DMRSettings.StringCertainty)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_CERTAINTY + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.StringCertainty);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_CERTAINTY                = M_DEFAULT (%.2f)\n"), DMRSettings.StringCertainty);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_CERTAINTY                = %.2f\n"), DMRSettings.StringCertainty);
         }
      
      // Inquiry on string index value
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_INDEX_VALUE + M_TYPE_MIL_DOUBLE, &DMRSettings.StringIndexValue);
      if (M_DEFAULT == DMRSettings.StringIndexValue)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_INDEX_VALUE + M_TYPE_MIL_DOUBLE + M_DEFAULT, &DMRSettings.StringIndexValue);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_INDEX_VALUE              = M_DEFAULT (%s)\n"), DefToStr(MIL_INT(DMRSettings.StringIndexValue)));
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_INDEX_VALUE              = %.2f\n"), DMRSettings.StringIndexValue);
         }

      // Inquiry on string label value
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_LABEL_VALUE + M_TYPE_MIL_DOUBLE, &DMRSettings.StringLabelValue);
      MosFprintf(OutputTarget, MIL_TEXT("M_STRING_LABEL_VALUE              = %.2f\n"), DMRSettings.StringLabelValue);

      // Inquiry on string rank
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_RANK + M_TYPE_MIL_INT, &DMRSettings.StringRank);
      if (M_DEFAULT == DMRSettings.StringRank)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_RANK + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.StringRank);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_RANK                     = M_DEFAULT (%d)\n"), (long) DMRSettings.StringRank);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_RANK                     = %d\n"), (long) DMRSettings.StringRank);
         }

      // Inquiry on maximum number of characters in string
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_SIZE_MAX + M_TYPE_MIL_INT, &DMRSettings.StringSizeMax);
      if (M_DEFAULT == DMRSettings.StringSizeMax)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_SIZE_MAX + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.StringSizeMax);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MAX                 = M_DEFAULT (%s)\n"), DefToStr(DMRSettings.StringSizeMax));
         }
      else if (M_INVALID == DMRSettings.StringSizeMax)
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MAX                 = %s\n"), DefToStr(DMRSettings.StringSizeMax));
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MAX                 = %d\n"), (long) DMRSettings.StringSizeMax);
         }

      // Inquiry on minimum number of characters in string
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_SIZE_MIN + M_TYPE_MIL_INT, &DMRSettings.StringSizeMin);
      if (M_DEFAULT == DMRSettings.StringSizeMin)
         {
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_STRING_SIZE_MIN + M_TYPE_MIL_INT + M_DEFAULT, &DMRSettings.StringSizeMin);
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MIN                 = M_DEFAULT (%.d)\n"), (long) DMRSettings.StringSizeMin);
         }
      else if (M_INVALID == DMRSettings.StringSizeMin)
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MIN                 = %s\n"), DefToStr(DMRSettings.StringSizeMin));
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_STRING_SIZE_MIN                 = %d\n"), (long) DMRSettings.StringSizeMin);
         }

      // Inquiry on constraints for different positions of string model
      // Inquiry on number of explicitly constrained positions
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_NUMBER_OF_CONSTRAINED_POSITIONS + M_TYPE_MIL_INT, &DMRSettings.NbOfConstrainedPositions);
      MosFprintf(OutputTarget, MIL_TEXT("M_NUMBER_OF_CONSTRAINED_POSITIONS = %d\n"), (long) DMRSettings.NbOfConstrainedPositions);
      if (DMRSettings.NbOfConstrainedPositions)
         {
         MosFprintf(OutputTarget, MIL_TEXT("\nThe %d constraints for specific positions in string are:\n"), (long) DMRSettings.NbOfConstrainedPositions);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("\nThere is no constraints for specific positions in string model.\n\n"));
         }
      for(MIL_INT CIndex = 0; CIndex < DMRSettings.NbOfConstrainedPositions; ++CIndex)
         {
         // Inquiry on the constraint position
         MIL_INT ConstraintPosition;
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), M_DEFAULT, M_POSITION + M_TYPE_MIL_INT, &ConstraintPosition);
         MosFprintf(OutputTarget, MIL_TEXT("\nPosition %d: \n"), (long) ConstraintPosition);

         // Inquiry on permitted characters for this constraint position
         MIL_INT NbEntries;
         MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), M_DEFAULT, M_NUMBER_OF_PERMITTED_CHARS_ENTRIES + M_TYPE_MIL_INT, &NbEntries);
         if (NbEntries > 0)
            {
            for(MIL_INT j = 0; j<NbEntries; j++)
               {
               // Inquiry on the label of the font
               MIL_INT ConstraintFontLabel;
               MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), j, M_FONT_LABEL_VALUE + M_TYPE_MIL_INT, &ConstraintFontLabel);

               // Inquiry on the type of the constraint
               MIL_INT ConstraintType;
               MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), j, M_TYPE + M_TYPE_MIL_INT, &ConstraintType);

               // Inquiry on the char list
               MIL_TEXT_PTR CharList = M_NULL;
               if (M_CHAR_LIST == ConstraintType)
                  {
                  MIL_INT CharListSize;
                  MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), j, M_CHAR_LIST + M_STRING_SIZE + M_TYPE_MIL_INT, &CharListSize);
                  CharList = new MIL_TEXT_CHAR[CharListSize];
                  MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_POSITION_CONSTRAINED_ORDER(CIndex), j, M_CHAR_LIST, CharList);
                  }

               // Print out to target the constraint info.
               PrintConstraintInfo(DmrCntxId, ConstraintType, CharList, ConstraintFontLabel, OutputTarget);
               if (CharList)
                  {
                  delete[] CharList;
                  }
               }
            }
         }

      // Inquiry on permitted character entries
      MosFprintf(OutputTarget, MIL_TEXT("\nThe implicit constraint is:\n\n"));
      MIL_INT NbEntries;
      MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, M_DEFAULT, M_NUMBER_OF_PERMITTED_CHARS_ENTRIES + M_TYPE_MIL_INT, &NbEntries);
      if (NbEntries > 0)
         {
         for(MIL_INT j = 0; j < NbEntries; j++)
            {
            // Inquiry on label of the font
            MIL_INT ConstraintFontLabel;
            MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, j, M_FONT_LABEL_VALUE + M_TYPE_MIL_INT, &ConstraintFontLabel);

            // Inquiry on the type of the constraint
            MIL_INT ConstraintType;
            MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, j, M_TYPE + M_TYPE_MIL_INT, &ConstraintType);

            // Inquiry on the char list
            MIL_TEXT_PTR CharList = M_NULL;
            if (M_CHAR_LIST == ConstraintType)
               {
               MIL_INT CharListSize;
               MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, j, M_CHAR_LIST + M_STRING_SIZE + M_TYPE_MIL_INT, &CharListSize);
               CharList = new MIL_TEXT_CHAR[CharListSize];
               MdmrInquireStringModel(DmrCntxId, M_STRING_INDEX(StrIndex), M_DEFAULT, j, M_CHAR_LIST, CharList);
               }

            // Print out to target the constraint info.
            PrintConstraintInfo(DmrCntxId, ConstraintType, CharList, ConstraintFontLabel, OutputTarget);
            if (CharList)
               {
               delete[] CharList;
               }
            }
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("Any character from any font is permitted (default behavior).\n"));
         }
      }

   if (MIL_STDOUT == OutputTarget)
      {
      MosFprintf(OutputTarget, MIL_TEXT("\nPress <Enter> to show font info.\n\n"));
      MosGetch();
      }
   }

// Function to inquire and print fonts.
void InquireAndPrintFont(MIL_ID DmrCntxId, SDMRSettings &Settings, MIL_FILE OutputTarget)
   {
   if (Settings.NbOfFont == 0)
      {
      MosFprintf(OutputTarget, MIL_TEXT("\nNo fonts are defined. Press <Enter> to continue.\n\n"));
      return;
      }
   
   for(MIL_INT FontIndex = 0; FontIndex < Settings.NbOfFont; FontIndex++)
      {
      MosFprintf(OutputTarget, MIL_TEXT("\n-------------------------------------------\n"));
      MosFprintf(OutputTarget, MIL_TEXT("Font Settings:\n"));
      MosFprintf(OutputTarget, MIL_TEXT("-------------------------------------------\n\n"));

      //Inquiry on font label
      MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_LABEL_VALUE + M_TYPE_MIL_INT, &Settings.FontLabel);
      MosFprintf(OutputTarget, MIL_TEXT("M_FONT_LABEL_VALUE   = %d\n"), (long) Settings.FontLabel);

      //Inquiry on the total number of the characters.
      MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_NUMBER_OF_CHARS + M_TYPE_MIL_INT, &Settings.NbOfChars);
      MosFprintf(OutputTarget, MIL_TEXT("M_NUMBER_OF_CHARS    = %d\n"), (long) Settings.NbOfChars);

      //Inquiry on the column and row number of the characters.
      MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_SIZE_COLUMNS + M_TYPE_MIL_INT, &Settings.FontSizeColumns);
      if (Settings.FontSizeColumns == M_DEFAULT)
         {
         MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_SIZE_COLUMNS + M_DEFAULT + M_TYPE_MIL_INT, &Settings.FontSizeColumns);
         MosFprintf(OutputTarget, MIL_TEXT("M_FONT_SIZE_COLUMNS  = M_DEFAULT (%d)\n"), (long) Settings.FontSizeColumns);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_FONT_SIZE_COLUMNS  = %d\n"), (long) Settings.FontSizeColumns);
         }

      MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_SIZE_ROWS + M_TYPE_MIL_INT, &Settings.FontSizeRows);
      if (Settings.FontSizeRows == M_DEFAULT)
         {
         MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_SIZE_ROWS + M_DEFAULT + M_TYPE_MIL_INT, &Settings.FontSizeRows);
         MosFprintf(OutputTarget, MIL_TEXT("M_FONT_SIZE_ROWS     = M_DEFAULT (%d)\n"), (long) Settings.FontSizeRows);
         }
      else
         {
         MosFprintf(OutputTarget, MIL_TEXT("M_FONT_SIZE_ROWS     = %d\n"), (long) Settings.FontSizeRows);
         }

      // Inquiry on template size
      MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), M_DEFAULT, M_NULL, M_FONT_SIZE_TEMPLATE + M_TYPE_MIL_INT, &Settings.FontSizeTemplate);
      MosFprintf(OutputTarget, MIL_TEXT("M_FONT_SIZE_TEMPLATE = %d\n\n"), (long) Settings.FontSizeTemplate);
      
      // Inquiry on font character
      for (MIL_INT i = 0; i < Settings.NbOfChars; i++)
         {
         // Inquire the length of the character name, including the terminating null character.
         MIL_INT NameLength;
         MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), i, M_NULL, M_CHAR_NAME + M_HEX_UTF16_FOR_NON_BASIC_LATIN + M_STRING_SIZE + M_TYPE_MIL_INT, &NameLength);

         MIL_TEXT_PTR CharName = new MIL_TEXT_CHAR[NameLength];
         MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), i, M_NULL, M_CHAR_NAME + M_HEX_UTF16_FOR_NON_BASIC_LATIN, CharName);

         // Inquiry on the character template.
         MIL_UINT8* CharTemplate = new MIL_UINT8[Settings.FontSizeTemplate];
         MdmrInquireFont(DmrCntxId, M_FONT_INDEX(FontIndex), i, M_NULL, M_CHAR_TEMPLATE + M_TYPE_MIL_UINT8, CharTemplate);

         //Print out each character in the following format:
         MosFprintf   (OutputTarget, MIL_TEXT("Char name = %s\n\n"), CharName);
         PrintTemplate(OutputTarget, CharTemplate, Settings.FontSizeRows, Settings.FontSizeColumns);

         // Delete local objects
         delete[] CharName;
         delete[] CharTemplate;
         }
      }
   }

// Function to output model constraint information.
void PrintConstraintInfo(MIL_ID DmrCntxId, MIL_INT ConstraintType, MIL_TEXT_PTR CharList, MIL_INT ConstraintFontLabel, MIL_FILE OutputTarget)
   {
   MIL_TEXT_PTR FontLabel = M_NULL;
   if (M_ANY == ConstraintFontLabel)
      {
      FontLabel = new MIL_TEXT_CHAR[6];
      MosSprintf(FontLabel, 6, MIL_TEXT("M_ANY"));
      }
   else
      {
      FontLabel = new MIL_TEXT_CHAR[MAX_STRING_LENGTH];
      MosSprintf(FontLabel, MAX_STRING_LENGTH, MIL_TEXT("%d"), (long) ConstraintFontLabel);
      }

   if (M_CHAR_LIST == ConstraintType)
      {
      MosFprintf(OutputTarget, MIL_TEXT("\"%s\" from font %s\n"), CharList, FontLabel);
      }
   else
      {
      MIL_TEXT_PTR CharCategory = DefToStr(ConstraintType);
      MosFprintf(OutputTarget, MIL_TEXT("%s from font %s\n"), CharCategory, FontLabel);
      delete[] CharCategory;
      }

   delete[] FontLabel;
   }

// Function to translate the definitions of the returned parameters to strings.
MIL_TEXT_PTR DefToStr(MIL_INT TheDef)
   {
   MIL_TEXT_PTR TheStringToReturn = new MIL_TEXT_CHAR[MAX_STRING_LENGTH];

   switch (TheDef)
      {
      case M_DEFAULT:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_DEFAULT"));
         break;
      case M_ANY:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_ANY"));
         break;
      case M_FOREGROUND_BLACK:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_FOREGROUND_BLACK"));
         break;
      case M_FOREGROUND_WHITE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_FOREGROUND_WHITE"));
         break;
      case M_CHAR_WIDTH_FACTOR:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_CHAR_WIDTH_FACTOR"));
         break;
      case M_DISABLE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_DISABLE"));
         break;
      case M_USER_DEFINED:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_USER_DEFINED"));
         break;
      case M_INVALID:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_INVALID"));
         break;
      case M_LETTERS:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_LETTERS"));
         break;
      case M_DIGITS:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_DIGITS"));
         break;
      case M_SPACE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_SPACE"));
         break;
      case M_LETTERS_UPPERCASE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_LETTERS_UPPERCASE"));
         break;
      case M_LETTERS_LOWERCASE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_LETTERS_LOWERCASE"));
         break;
      case M_AUTO:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_AUTO"));
         break;
      case M_FALSE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_FALSE"));
         break;
      case M_ENABLE:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("M_ENABLE"));
         break;
      default:
         MosSprintf(TheStringToReturn, MAX_STRING_LENGTH, MIL_TEXT("UNKNOWN"));
         break;
      }
   return TheStringToReturn;
   }

// Function to print the font to output or a text file.
void PrintTemplate(MIL_FILE OutputTarget, MIL_UINT8* CharTemplate, MIL_INT FontSizeRows, MIL_INT FontSizeColumns)
   {
   // Note:
   //                      00 00 FF 00 00                         *    
   //                      00 FF 00 FF 00                      *     *
   //      Print to file   FF 00 00 00 FF    or to screen   *           *
   //     -------------->  FF 00 00 00 FF   ------------->  *           *
   //                      FF FF FF FF FF                   *  *  *  *  *
   //                      FF 00 00 00 FF                   *           *
   //                      FF 00 00 00 FF                   *           *
   //
   for (MIL_INT RowIndex = 0; RowIndex < FontSizeRows; RowIndex++)
      {
      for (MIL_INT ColIndex = 0; ColIndex < FontSizeColumns; ColIndex++)
         {
         if (MIL_STDOUT == OutputTarget)
            {
            MosFprintf(OutputTarget, MIL_TEXT("%s "), CharTemplate[RowIndex*FontSizeColumns + ColIndex] == 0 ? MIL_TEXT(" ") : MIL_TEXT("*"));
            }
         else
            {
            MosFprintf(OutputTarget, MIL_TEXT("%s "), CharTemplate[RowIndex*FontSizeColumns + ColIndex] == 0 ? MIL_TEXT("00") : MIL_TEXT("FF"));
            }         
         }
      MosFprintf(OutputTarget, MIL_TEXT("\n"));
      }
   MosFprintf(OutputTarget, (MIL_TEXT("\n\n")));
   }

// Function to set output file
void SetOutputTarget(MIL_FILE* pOutputTarget)
   {
   // Set output target to screen or text file
   if (M_NULL == *pOutputTarget)
      {
      // Let user choose to print or save the context content to a text file.
      MIL_INT ch;
      do {
         MosPrintf(MIL_TEXT("Press <1> to print the context content to screen.\n")
                   MIL_TEXT("Press <2> to save the context content to a text file.\n\n"));
         ch = MosGetch();
         } while (ch != '1' && ch != '2');

      if (ch == '1')
         {
         *pOutputTarget = MIL_STDOUT;
         }
      else
         {
         *pOutputTarget = MosFopen(OUTPUT_FILE, MIL_CONST_TEXT_PTR("w"));
         if (!(*pOutputTarget))
            {
            MosPrintf(MIL_TEXT("File cannot be created.\n"));
            return;
            }
         }
      }

   // Finish output to screen or close the file
   else
      {
      if (MIL_STDOUT == *pOutputTarget)
         {
         MosPrintf(MIL_TEXT("\nPress <Enter> to finish.\n\n"));
         MosGetch();
         }
      else
         {
         MosFclose(*pOutputTarget);
         MosPrintf(MIL_TEXT("MdmrContext.txt is saved in the same folder as the original context.\n"));
         MosPrintf(MIL_TEXT("\nPress <Enter> to finish.\n\n"));
         MosGetch();
         }
      }
   }