Generic Logic Inc. adalah sebuah perusahaan pembuat GLG Toolkit, yakni library untuk membuat tampilan Real-Time Graphic, Visualisasi Data dan HMI SCADA. Perusahaan ini menyediakan GLG Toolkit Free Community Edition yang bisa kita download secara gratis.

GLG Toolkit menyediakan library untuk berbagai macam bahasa pemrograman di antaranya: C/C++, C#, Java, HTML5, Javascript. GLG Toolkit juga tersedia untuk berbagai platform seperti Windows, Linux dan Android.

Pada tulisan ini saya akan menyampaikan hasil eksperimen saya mencoba menggunakan library GLG Toolkit dengan menggunakan pemrograman C. Saya menggunakan IDE dan Kompiler Pelles C.

Dalam eksperimen ini, saya hanya mencoba melakukan kompilasi terhadap salah satu contoh program yang tersedia menggunakan Pelles C. Untuk dapat mendayagunakan library GLG Toolkit, banyak detil yang harus dipelajari.

Nah, sebelum saya bercerita lebih lanjut, berikut ini saya tampilkan screenshot dari tampilan program menggunakan library GLG Toolkit.

Untuk mencoba library GLG Toolkit, langkah pertama yang harus kita lakukan adalah men-download library tersebut. GLG Toolkit yang berisi library dan demo program bisa di download menggunakan link berikut ini.

https://www.genlogic.com/download/SetupGLG-CE-4-2.exe

Setelah download selesai, langkah selanjutnya adalah melakukan instalasi. Caranya tentu sangat mudah, tinggal double-click file instalasi SetupGLG-CE-4-2.exe.

Setelah instalasi selesai, maka kita bisa langsung mencoba menjalankan demo yang sudah disediakan. Demo ini bisa diakses dari Windows Start Menu.

Berikut ini adalah beberapa tampilan dari demo GLG Toolkit.

Sangat wow, bukan?

Nah, sekarang kita akan mencoba melakukan kompilasi terhadap salah satu contoh project yang disediakan oleh GLG Toolkit. Tampilannya seperti gambar screenshot berikut ini.

Untuk melakukan kompilasi contoh program dengan sukses, maka kita perlu meng-copy file-file library dan file-file header ke dalam folder library dan folder include dari kompiler Pelles C. Dan juga meng-copy file-file .dll ke dalam folder System dari Windows.

GLG Toolkit tidak hanya terdiri dari library, tapi juga memiliki program utilitas GLG Graphic Builder yang digunakan untuk merancang atau membuat tampilan dengan menyusun komponen-komponen yang tersedia menjadi sebuah form tampilan aplikasi.

Desain tampilan yang dibuat menggunakan Graphic Builder tersebut, nantinya akan ditampilkan oleh program yang kita buat. Selain menampilkan, program juga bisa beriteraksi dengan tampilan melalui Application Programming Interface yang disediakan oleh GLG Toolkit.

Adapun listing progamnya adalah sebagai berikut.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "GlgApi.h"

#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950
#endif

/* Function prototypes */
void Input( GlgObject viewport, GlgAnyType client_data, GlgAnyType call_data );
void InitializeDrawing( GlgObject viewport );
void UpdateDrawing( GlgAnyType client_data, GlgLong *timer_id );
void SetSize( GlgObject viewport, GlgLong x, GlgLong y, 
              GlgLong width, GlgLong height );
void StopUpdates( void );
void StartUpdates( void );
double GetData( double low, double high );

#define  UPDATE_INTERVAL     100     /* Update interval, msec. */

/* If set to true, tags defined in the drawing are used for animation.
   Otherwise, object resources are used to push real-time values into
   the drawing.
*/
#define USE_TAGS True

GlgObject Drawing;
GlgAppContext AppContext;

GlgLong TimerID;

/* Defines a platform-specific program entry point */
#include "GlgMain.h"

/*----------------------------------------------------------------------*/
int GlgMain( argc, argv, InitAppContext )
     int argc;
     char *argv[];
     GlgAppContext InitAppContext;
{

   AppContext = GlgInit( False, InitAppContext, argc, argv );

   /* Load a drawing from the file. */
   Drawing = GlgLoadWidgetFromFile( "dashboard.g" );

   if( !Drawing )
     exit( 1 );
   
   /* Set window size. */
   SetSize( Drawing, 0, 0, 450, 450 );

   /* Setting the window name (title). */
   GlgSetSResource( Drawing, "ScreenName", "Glg Dashboard Example" );

   /* Add Input callback to handle user interaction in a GLG input widget
      such as a button or a slider.
   */
   GlgAddCallback( Drawing, GLG_INPUT_CB, (GlgCallbackProc)Input, NULL );

   /* Set initial values for GLG widgets. */
   InitializeDrawing( Drawing );

   /* Paint the drawing. */   
   GlgInitialDraw( Drawing );

   /* Start periodic dynamic updates. */
   StartUpdates();
   
   return (int) GlgMainLoop( AppContext );
}

/*----------------------------------------------------------------------
| Set initial parameters for GLG objects/widgets.
*/
void InitializeDrawing( GlgObject viewport )
{
   /* Set initial patameters as needed. */
   GlgSetDResource( viewport, "DialPressure/Low", 0. );
   GlgSetDResource( viewport, "DialVoltage/Low", 0. );
   GlgSetDResource( viewport, "DialAmps/Low", 0. );
   GlgSetDResource( viewport, "SliderPressure/Low", 0. );
   
   GlgSetDResource( viewport, "DialPressure/High", 50. );
   GlgSetDResource( viewport, "DialVoltage/High", 120. );
   GlgSetDResource( viewport, "DialAmps/High", 10. );
   GlgSetDResource( viewport, "SliderPressure/High", 50. );
}

/*----------------------------------------------------------------------
| Periodic dynamic updates.
*/
void UpdateDrawing( GlgAnyType client_data, GlgLong * timer_id )
{
   /* Obtain simulated demo data values in a specified range.
      The application should provide a custom implementation
      of the data acquisition interface to obtain real-time
      data values.
   */
   double voltage = GetData( 0.0, 120.0 );
   double current = GetData( 0.0, 10.0 );
   
   if( USE_TAGS ) /* Use tags for animation. */
   {
      /* Push values to the objects using tags defined in the drawing. */
      GlgSetDTag( Drawing, "Voltage", voltage, GlgTrue /*if_changed*/ );
      GlgSetDTag( Drawing, "Current", current, GlgTrue /*if_changed*/ );
   }
   else /* Use resources for animation. */
   {
      /* Push values to the objects using resource paths. */
      GlgSetDResource( Drawing, "DialVoltage/Value", voltage );
      GlgSetDResource( Drawing, "DialAmps/Value", current );
   }
   
   GlgUpdate( Drawing );    /* Make changes visible. */
   
   /* Reinstall the timer to continue updating */
   TimerID = GlgAddTimeOut( AppContext, UPDATE_INTERVAL, 
                          (GlgTimerProc) UpdateDrawing, (GlgAnyType) NULL );
}

/*----------------------------------------------------------------------
| Start periodic dynamic updates.
*/
void StartUpdates()
{
   TimerID = GlgAddTimeOut( AppContext, UPDATE_INTERVAL,
                            (GlgTimerProc) UpdateDrawing, 
                            (GlgAnyType) NULL );
}

/*----------------------------------------------------------------------
| Stop dynamic updates.
*/
void StopUpdates()
{
   /* Stop update timers */
   if( TimerID )
   {
      GlgRemoveTimeOut( TimerID );
      TimerID = 0;
   }
}

/*----------------------------------------------------------------------
| This callback is invoked when user interacts with input objects in GLG
| drawing, such as a slider, dial or a button.
*/
void Input( GlgObject viewport, GlgAnyType client_data, GlgAnyType call_data )
{
   GlgObject message_obj;
   char
     * format,
     * action,
     * origin;      

   message_obj = (GlgObject) call_data;

   /* Get the message's format, action and origin. */
   GlgGetSResource( message_obj, "Format", &format );
   GlgGetSResource( message_obj, "Action", &action );
   GlgGetSResource( message_obj, "Origin", &origin );

   /* Handle window closing. May use viewport's name. */
   if( strcmp( format, "Window" ) == 0 &&
      strcmp( action, "DeleteWindow" ) == 0 )
     exit( 0 );

   /* Input event occurred in a button. */
   if( strcmp( format, "Button" ) == 0 )
   {
      if( strcmp( action, "Activate" ) == 0 ) /* Push button events. */
      {
         /* The user selected a Quit button: exit the program. */
         if( strcmp( origin , "QuitButton" ) == 0 )
           exit( 0 );
      }
      else if( strcmp( action, "ValueChanged" ) == 0 ) /* Toggle button events. */
      {
         if( strcmp( origin, "StartButton" ) == 0 )
         {
            double value;
            GlgGetDResource( message_obj, "OnState", &value );

            switch( (int) value)
            {
             case 0:
               StopUpdates();   /* Stop updates. */
               break;
             case 1:
               StartUpdates();  /* Start updates. */
               break;
             default: break;
            }
         }
      }
      
      GlgUpdate( viewport );
   }
   /* Input occurred in a slider. */
   else if( strcmp( format, "Slider" ) == 0 && 
            strcmp( origin, "SliderPressure" ) == 0 )
   {
      double slider_value;
              
      /* Retrieve current slider value from the message object. */
      GlgGetDResource( message_obj, "ValueY", &slider_value );

      /* Set a data value for a dial control */
      GlgSetDResource( viewport, "DialPressure/Value", slider_value );

      /* Update the viewport to reflect new resource settings. */
      GlgUpdate( viewport );  
   }
}

/*----------------------------------------------------------------------
| Set viewport size in screen cooridnates. 
*/
void SetSize( GlgObject viewport, GlgLong x, GlgLong y, 
              GlgLong width, GlgLong height )
{
   GlgSetGResource( viewport, "Point1", 0., 0., 0. );
   GlgSetGResource( viewport, "Point2", 0., 0., 0. );

   GlgSetDResource( viewport, "Screen/XHint", (double) x );
   GlgSetDResource( viewport, "Screen/YHint", (double) y );
   GlgSetDResource( viewport, "Screen/WidthHint", (double) width );
   GlgSetDResource( viewport, "Screen/HeightHint", (double) height );
}

/*----------------------------------------------------------------------
| Generates demo data value within a specified range. 
| An application can replace code in this function to supply 
| real-time data from a custom data source.
*/
double GetData( double low, double high )
{
   double
     half_amplitude, center,
     period,
     value,
     alpha;
   
   static int counter = 0;

   half_amplitude = ( high - low ) / 2.0;
   center = low + half_amplitude;
   
   period = 100.0;
   alpha = 2.0 * M_PI * counter / period;
   
   value = center +
     half_amplitude * sin( alpha ) * sin( alpha / 30.0 );
   
   ++counter;
   return value;
}

Proses kompilasi menghasilkan beberapa Warning yang mana hal ini bisa kita abaikan. Warning yang muncul adalah terjadi karena kode program dari GLG Toolkit masih menggunakan format penulisan model lama untuk fungsi. Ini menunjukkan bahwa contoh program yang disediakan oleh GLG Toolkit berusia cukup tua, hehehe…

Nah, dari eksperimen ini kita dapat buktikan bahwa library GLG Toolkit dapat dikompilasi menggunakan IDE dan Kompiler Pelles C. Dengan demikian, kita bisa lebih lanjut mempelajari GLG Toolkit sehingga kedepannya kita bisa membuat tampilan program aplikasi Control & Monitoring yang keren.

Sekian, semoga bermanfaat. Selamat belajar. Selamat berkarya.

Whatsapp: 0882-3560-7047

By admin

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.

Copy link
Powered by Social Snap