]> Devi Nivas Git - smartwatch.git/commitdiff
Add working uLCD Library
authorAdvaith Menon <noreply-git@bp4k.net>
Mon, 17 Nov 2025 04:41:53 +0000 (23:41 -0500)
committerAdvaith Menon <noreply-git@bp4k.net>
Mon, 17 Nov 2025 04:41:53 +0000 (23:41 -0500)
* Namespace all 4DGL extern functions with gl_
* Pass gl_display_t * to all objects to allow using multiple ULCDs
* Add a 2sec timeout for the initialization since we need to send
  but there's no ACK
* Modify test program to display a Japanese flag

main/CMakeLists.txt
main/Goldelox_Types4D.h
main/goldeloxSerial.c
main/goldeloxSerial.h
main/hello_world_main.c
main/pins.h [new file with mode: 0644]

index ccd5c615286a100e6e6883306c9dc4752ed39053..f6bc1763e307e97268d5f2c7512ed10ef2c85c10 100644 (file)
@@ -1,4 +1,6 @@
 idf_component_register(SRCS "hello_world_main.c"
+                            "goldeloxSerial.c"
                        INCLUDE_DIRS "."
                        PRIV_REQUIRES esp_driver_gpio
+                                     esp_driver_uart
                        INCLUDE_DIRS "")
index 46f6b0af4dcf874cd11fff798dc8ba89297d6ac8..8212cfa1d9391b2e534fd56d42d50d6a5a85b6c8 100644 (file)
@@ -21,6 +21,7 @@ struct gl_serif_t {
     int (*write_tx) (const void *, size_t);
     int (*read_rx) (void *, size_t, uint32_t);
     int (*flush_rx) ();
+    int (*flush_tx) (uint32_t);
 };
 
 
index e6a45f5fc849e238b20e2e81f5e50f36294e25b5..91b97ab484f7973ef266448b1b7bb785a186723f 100644 (file)
@@ -7,11 +7,11 @@
 #include <errno.h>
 #include <time.h>
 
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <termios.h>
+// #include <time.h>
+// #include <sys/types.h>
+// #include <sys/stat.h>
+// #include <fcntl.h>
+// #include <termios.h>
 
 #include "Goldelox_Types4D.h"                  // defines data types used by the 4D Routines
 #include "Goldelox_const4D.h"                  // defines for 4dgl constants, generated by conversion of 4DGL constants to target language
@@ -46,7 +46,8 @@ void WriteBytes(gl_serif_t *serif, unsigned char *psOutput, int nCount)
         return;
     }
     // iOut = write(cPort, psOutput, nCount);
-    iOut = serif->write(psOutput, nCount, TimeLimit4D);
+    iOut = serif->write_tx(psOutput, nCount);
+    serif->flush_tx(TimeLimit4D);
     if (iOut < 0)
     {
         printf("goldelox: write error \n");
@@ -56,14 +57,14 @@ void WriteBytes(gl_serif_t *serif, unsigned char *psOutput, int nCount)
     return;
 }
 
-void WriteChars(unsigned char *psOutput)
+void WriteChars(gl_serif_t *serif, unsigned char *psOutput)
 {
     // Include NULL in output
-    WriteBytes(psOutput, strlen((char *)psOutput) + 1);
+    WriteBytes(serif, psOutput, strlen((char *)psOutput) + 1);
     return;
 }
 
-void WriteWords(gl_word_t * Source, int Size)
+void WriteWords(gl_serif_t *serif, gl_word_t * Source, int Size)
 {
        gl_word_t wk ;
        int i ;
@@ -71,7 +72,7 @@ void WriteWords(gl_word_t * Source, int Size)
        {
                wk = *Source++ ;
                wk = (wk >> 8) + (wk << 8) ;
-               WriteBytes((unsigned char *)&wk, 2);
+               WriteBytes(serif, (unsigned char *)&wk, 2);
        }
 }
 
@@ -95,10 +96,15 @@ int ReadSerPort(gl_serif_t *serif, unsigned char *psData, int iMax)
     }
     iIdx = 0;
     iLeft = iMax;
+    time_t curTime = time(NULL);
     while (iLeft > 0)
     {
         // iIn = read(cPort, &psData[iIdx], iLeft);
         iIn = serif->read_rx(&psData[iIdx], iLeft, TimeLimit4D);
+        if (time(NULL) - curTime > 2) {
+            printf("goldelox: timeout \n");
+            return -1;
+        }
         if (iIn < 0)
         {
             printf("goldelox: read error \n");
@@ -117,10 +123,10 @@ int ReadSerPort(gl_serif_t *serif, unsigned char *psData, int iMax)
     return iMax;
 }
 
-void getbytes(unsigned char *data, int size)
+void getbytes(gl_serif_t *serif, unsigned char *data, int size)
 {
        int readc;
-       readc = ReadSerPort(data, size) ;
+       readc = ReadSerPort(serif, data, size) ;
        if ((readc != size)
            && (Callback4D != NULL) )
        {
@@ -129,7 +135,7 @@ void getbytes(unsigned char *data, int size)
        }
 }
 
-void GetAck(void)
+void GetAck(gl_serif_t *serif)
 {
        int readc;
        unsigned char readx ;
@@ -140,7 +146,7 @@ void GetAck(void)
         Error4D = Err4D_OK;
         return;
     }
-       readc = ReadSerPort(&readx, 1) ;
+       readc = ReadSerPort(serif, &readx, 1) ;
 
        if (readc != 1)
     {
@@ -160,7 +166,7 @@ void GetAck(void)
 }
 
 
-gl_word_t GetWord(void)
+gl_word_t GetWord(gl_serif_t *serif)
 {
        int readc;
        unsigned char readx[2] ;
@@ -168,7 +174,7 @@ gl_word_t GetWord(void)
        if (Error4D != Err4D_OK)
                return 0 ;
 
-    readc = ReadSerPort(&readx[0], 2) ;
+    readc = ReadSerPort(serif, &readx[0], 2) ;
 
        if (readc != 2)
        {
@@ -181,7 +187,7 @@ gl_word_t GetWord(void)
                return readx[0] << 8 | readx[1] ;
 }
 
-void getString(unsigned char *outStr, int strLen)
+void getString(gl_serif_t *serif, unsigned char *outStr, int strLen)
 {
        int readc;
 
@@ -191,7 +197,7 @@ void getString(unsigned char *outStr, int strLen)
                return ;
        }
 
-       readc = ReadSerPort(outStr, strLen) ;
+       readc = ReadSerPort(serif, outStr, strLen) ;
 
        if (readc != strLen)
        {
@@ -206,13 +212,13 @@ void getString(unsigned char *outStr, int strLen)
        return;
 }
 
-gl_word_t GetAckResp(void)
+gl_word_t GetAckResp(gl_serif_t *serif)
 {
-       GetAck(;
-       return GetWord(;
+       GetAck(serif);
+       return GetWord(serif);
 }
 
-gl_word_t WaitForAck(void)
+gl_word_t WaitForAck(gl_serif_t *serif)
 {
     int saveTimeout = TimeLimit4D;
     void *saveCB = Callback4D;
@@ -222,56 +228,56 @@ gl_word_t WaitForAck(void)
     TimeLimit4D = 60 * 1000;
     do
     {
-        GetAck();
+        GetAck(serif);
     } while (Error4D != Err4D_OK);
 
     // Restore callback/timeout saves
     TimeLimit4D = saveTimeout;
     Callback4D = saveCB;
 
-    return GetWord();
+    return GetWord(serif);
 }
-gl_word_t GetAckRes2Words(gl_word_t * word1, gl_word_t * word2)
+gl_word_t GetAckRes2Words(gl_serif_t *serif, gl_word_t * word1, gl_word_t * word2)
 {
        int Result ;
-       GetAck() ;
-       Result = GetWord() ;
-       *word1 = GetWord() ;
-       *word2 = GetWord() ;
+       GetAck(serif) ;
+       Result = GetWord(serif) ;
+       *word1 = GetWord(serif) ;
+       *word2 = GetWord(serif) ;
        return Result ;
 }
 
-void GetAck2Words(gl_word_t * word1, gl_word_t * word2)
+void GetAck2Words(gl_serif_t *serif, gl_word_t * word1, gl_word_t * word2)
 {
-       GetAck() ;
-       *word1 = GetWord() ;
-       *word2 = GetWord() ;
+       GetAck(serif) ;
+       *word1 = GetWord(serif) ;
+       *word2 = GetWord(serif) ;
 }
 
-gl_word_t GetAckResSector(gl_sector_t Sector)
+gl_word_t GetAckResSector(gl_serif_t *serif, gl_sector_t Sector)
 {
        int Result;
-       GetAck() ;
-       Result = GetWord() ;
-       getbytes(Sector, 512) ;
+       GetAck(serif) ;
+       Result = GetWord(serif) ;
+       getbytes(serif, Sector, 512) ;
        return Result ;
 }
 
-gl_word_t GetAckResStr(unsigned char * OutStr)
+gl_word_t GetAckResStr(gl_serif_t *serif, unsigned char * OutStr)
 {
        int Result ;
-       GetAck() ;
-       Result = GetWord() ;
-       getString(OutStr, Result) ;
+       GetAck(serif) ;
+       Result = GetWord(serif) ;
+       getString(serif, OutStr, Result) ;
        return Result ;
 }
 
-gl_word_t GetAckResData(gl_byte_array_t OutData, gl_word_t size)
+gl_word_t GetAckResData(gl_serif_t *serif, gl_byte_array_t OutData, gl_word_t size)
 {
        int Result ;
-       GetAck() ;
-       Result = GetWord() ;
-       getbytes(OutData, size) ;
+       GetAck(serif) ;
+       Result = GetWord(serif) ;
+       getbytes(serif, OutData, size) ;
        return Result ;
 }
 
@@ -283,38 +289,39 @@ gl_word_t GetAckResData(gl_byte_array_t OutData, gl_word_t size)
  * Starts of 4D Compound Routines
 */
 
-gl_word_t charheight(unsigned char  TestChar)
+gl_word_t gl_charheight(gl_display_t *display, unsigned char TestChar)
 {
   unsigned char  towrite[3] ;
   towrite[0]= F_charheight >> 8 ;
   towrite[1]= F_charheight ;
   towrite[2]= TestChar;
-  WriteBytes(towrite, 3) ;
-  return GetAckResp(;
+  WriteBytes(display->serif, towrite, 3) ;
+  return GetAckResp(display->serif);
 }
 
-gl_word_t charwidth(unsigned char  TestChar)
+gl_word_t gl_charwidth(gl_display_t *display, unsigned char TestChar)
 {
   unsigned char  towrite[3] ;
   towrite[0]= F_charwidth >> 8 ;
   towrite[1]= F_charwidth ;
   towrite[2]= TestChar;
-  WriteBytes(towrite, 3) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 3) ;
+  return GetAckResp(display->serif) ;
 }
 
-void gfx_BGcolour(gl_word_t  Color)
+void gl_gfx_BGcolour(gl_display_t *display, gl_word_t Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_BGcolour >> 8 ;
   towrite[1]= F_gfx_BGcolour & 0xFF;
-  towrite[2]= Color >> 8 ;
-  towrite[3]= Color ;
-  WriteBytes(towrite, 4) ;
-  GetAck(;
+  towrite[2]= Color >> 8;
+  towrite[3]= Color;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif);
 }
 
-void gfx_ChangeColour(gl_word_t  OldColor, gl_word_t  NewColor)
+void gl_gfx_ChangeColour(gl_display_t *display, gl_word_t OldColor,
+        gl_word_t NewColor)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_ChangeColour >> 8 ;
@@ -323,11 +330,12 @@ void gfx_ChangeColour(gl_word_t  OldColor, gl_word_t  NewColor)
   towrite[3]= OldColor ;
   towrite[4]= NewColor >> 8 ;
   towrite[5]= NewColor ;
-  WriteBytes(towrite, 6) ;
-  GetAck(;
+  WriteBytes(display->serif, towrite, 6);
+  GetAck(display->serif);
 }
 
-void gfx_Circle(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t  Color)
+void gl_gfx_Circle(gl_display_t *display, gl_word_t  X, gl_word_t  Y,
+        gl_word_t  Radius, gl_word_t  Color)
 {
   unsigned char  towrite[10] ;
   towrite[0]= F_gfx_Circle >> 8 ;
@@ -340,11 +348,12 @@ void gfx_Circle(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t  Color)
   towrite[7]= Radius ;
   towrite[8]= Color >> 8 ;
   towrite[9]= Color ;
-  WriteBytes(towrite, 10) ;
-  GetAck(;
+  WriteBytes(display->serif, towrite, 10) ;
+  GetAck(display->serif);
 }
 
-void gfx_CircleFilled(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t  Color)
+void gl_gfx_CircleFilled(gl_display_t *display, gl_word_t  X, gl_word_t  Y,
+        gl_word_t  Radius, gl_word_t  Color)
 {
   unsigned char  towrite[10] ;
   towrite[0]= F_gfx_CircleFilled >> 8 ;
@@ -357,72 +366,73 @@ void gfx_CircleFilled(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t
   towrite[7]= Radius ;
   towrite[8]= Color >> 8 ;
   towrite[9]= Color ;
-  WriteBytes(towrite, 10) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 10) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Clipping(gl_word_t  OnOff)
+void gl_gfx_Clipping(gl_display_t *display, gl_word_t OnOff)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_Clipping >> 8 ;
   towrite[1]= F_gfx_Clipping & 0xFF;
   towrite[2]= OnOff >> 8 ;
   towrite[3]= OnOff ;
-  WriteBytes(towrite, 4) ;
-  GetAck(;
+  WriteBytes(display->serif, towrite, 4);
+  GetAck(display->serif);
 }
 
-void gfx_ClipWindow(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2)
+void gl_gfx_ClipWindow(gl_display_t *display, gl_word_t X1, gl_word_t Y1,
+        gl_word_t  X2, gl_word_t  Y2)
 {
-  unsigned char  towrite[10] ;
+  unsigned char  towrite[10];
 
-  towrite[0]= F_gfx_ClipWindow >> 8 ;
-  towrite[1]= F_gfx_ClipWindow ;
-  towrite[2]= X1 >> 8 ;
-  towrite[3]= X1 ;
-  towrite[4]= Y1 >> 8 ;
-  towrite[5]= Y1 ;
-  towrite[6]= X2 >> 8 ;
-  towrite[7]= X2 ;
-  towrite[8]= Y2 >> 8 ;
-  towrite[9]= Y2 ;
-  WriteBytes(towrite, 10) ;
-  GetAck(;
+  towrite[0]= F_gfx_ClipWindow >> 8;
+  towrite[1]= F_gfx_ClipWindow;
+  towrite[2]= X1 >> 8;
+  towrite[3]= X1;
+  towrite[4]= Y1 >> 8;
+  towrite[5]= Y1;
+  towrite[6]= X2 >> 8;
+  towrite[7]= X2;
+  towrite[8]= Y2 >> 8;
+  towrite[9]= Y2;
+  WriteBytes(display->serif, towrite, 10);
+  GetAck(display->serif);
 }
 
-void gfx_Cls()
+void gl_gfx_Cls(gl_display_t *display)
 {
-  unsigned char  towrite[2] ;
+  unsigned char  towrite[2];
 
-  towrite[0]= F_gfx_Cls >> 8 ;
-  towrite[1]= F_gfx_Cls ;
-  WriteBytes(towrite, 2) ;
-  GetAck(;
+  towrite[0]= F_gfx_Cls >> 8;
+  towrite[1]= F_gfx_Cls;
+  WriteBytes(display->serif, towrite, 2);
+  GetAck(display->serif);
 }
 
-void gfx_Contrast(gl_word_t  Contrast)
+void gl_gfx_Contrast(gl_display_t *display, gl_word_t  Contrast)
 {
   unsigned char  towrite[4] ;
     towrite[0]= F_gfx_Contrast >> 8 ;
   towrite[1]= F_gfx_Contrast & 0xFF;
   towrite[2]= Contrast >> 8 ;
   towrite[3]= Contrast ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_FrameDelay(gl_word_t  Msec)
+void gl_gfx_FrameDelay(gl_display_t *display, gl_word_t  Msec)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_FrameDelay >> 8 ;
   towrite[1]= F_gfx_FrameDelay & 0xFF;
   towrite[2]= Msec >> 8 ;
   towrite[3]= Msec ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t gfx_GetPixel(gl_word_t  X, gl_word_t  Y)
+gl_word_t gl_gfx_GetPixel(gl_display_t *display, gl_word_t X, gl_word_t Y)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_GetPixel >> 8 ;
@@ -431,11 +441,11 @@ gl_word_t gfx_GetPixel(gl_word_t  X, gl_word_t  Y)
   towrite[3]= X ;
   towrite[4]= Y >> 8 ;
   towrite[5]= Y ;
-  WriteBytes(towrite, 6) ;
-  return GetAckResp(;
+  WriteBytes(display->serif, towrite, 6);
+  return GetAckResp(display->serif);
 }
 
-void gfx_Line(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
+void gl_gfx_Line(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
 {
   unsigned char  towrite[12] ;
   towrite[0]= F_gfx_Line >> 8 ;
@@ -450,22 +460,22 @@ void gfx_Line(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_wor
   towrite[9]= Y2 ;
   towrite[10]= Color >> 8 ;
   towrite[11]= Color ;
-  WriteBytes(towrite, 12) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 12) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_LinePattern(gl_word_t  Pattern)
+void gl_gfx_LinePattern(gl_display_t *display, gl_word_t  Pattern)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_LinePattern >> 8 ;
   towrite[1]= F_gfx_LinePattern & 0xFF;
   towrite[2]= Pattern >> 8 ;
   towrite[3]= Pattern ;
-  WriteBytes(towrite, 4) ;
-  GetAck(;
+  WriteBytes(display->serif, towrite, 4);
+  GetAck(display->serif);
 }
 
-void gfx_LineTo(gl_word_t  X, gl_word_t  Y)
+void gl_gfx_LineTo(gl_display_t *display, gl_word_t  X, gl_word_t  Y)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_LineTo >> 8 ;
@@ -474,11 +484,11 @@ void gfx_LineTo(gl_word_t  X, gl_word_t  Y)
   towrite[3]= X ;
   towrite[4]= Y >> 8 ;
   towrite[5]= Y ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_MoveTo(gl_word_t  X, gl_word_t  Y)
+void gl_gfx_MoveTo(gl_display_t *display, gl_word_t  X, gl_word_t  Y)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_MoveTo >> 8 ;
@@ -487,11 +497,11 @@ void gfx_MoveTo(gl_word_t  X, gl_word_t  Y)
   towrite[3]= X ;
   towrite[4]= Y >> 8 ;
   towrite[5]= Y ;
-  WriteBytes(towrite, 6) ;
-  GetAck(;
+  WriteBytes(display->serif, towrite, 6);
+  GetAck(display->serif);
 }
 
-gl_word_t gfx_Orbit(gl_word_t  Angle, gl_word_t  Distance, gl_word_t *  Xdest, gl_word_t *  Ydest)
+gl_word_t gl_gfx_Orbit(gl_display_t *display, gl_word_t  Angle, gl_word_t  Distance, gl_word_t *  Xdest, gl_word_t *  Ydest)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_Orbit >> 8 ;
@@ -500,55 +510,55 @@ gl_word_t gfx_Orbit(gl_word_t  Angle, gl_word_t  Distance, gl_word_t *  Xdest, g
   towrite[3]= Angle ;
   towrite[4]= Distance >> 8 ;
   towrite[5]= Distance ;
-  WriteBytes(towrite, 6) ;
-  GetAck2Words(Xdest,Ydest) ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck2Words(display->serif, Xdest,Ydest) ;
   return 0 ;
 }
 
-void gfx_OutlineColour(gl_word_t  Color)
+void gl_gfx_OutlineColour(gl_display_t *display, gl_word_t Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_OutlineColour >> 8 ;
   towrite[1]= F_gfx_OutlineColour & 0xFF;
   towrite[2]= Color >> 8 ;
   towrite[3]= Color ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Polygon(gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color)
+void gl_gfx_Polygon(gl_display_t *display, gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_Polygon >> 8 ;
   towrite[1]= F_gfx_Polygon ;
   towrite[2]= n >> 8 ;
   towrite[3]= n ;
-  WriteBytes(towrite, 4) ;
-  WriteWords(Xvalues, n) ;
-  WriteWords(Yvalues, n) ;
+  WriteBytes(display->serif, towrite, 4) ;
+  WriteWords(display->serif,Xvalues, n) ;
+  WriteWords(display->serif,Yvalues, n) ;
   towrite[0]= Color >> 8 ;
   towrite[1]= Color ;
-  WriteBytes(towrite, 2) ;
-  GetAck() ;
+  WriteBytes(display->serif,towrite, 2) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Polyline(gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color)
+void gl_gfx_Polyline(gl_display_t *display, gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_Polyline >> 8 ;
   towrite[1]= F_gfx_Polyline ;
   towrite[2]= n >> 8 ;
   towrite[3]= n ;
-  WriteBytes(towrite, 4) ;
-  WriteWords(Xvalues, n) ;
-  WriteWords(Yvalues, n) ;
+  WriteBytes(display->serif, towrite, 4) ;
+  WriteWords(display->serif, Xvalues, n) ;
+  WriteWords(display->serif, Yvalues, n) ;
   towrite[0]= Color >> 8 ;
   towrite[1]= Color ;
-  WriteBytes(towrite, 2) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_PutPixel(gl_word_t  X, gl_word_t  Y, gl_word_t  Color)
+void gl_gfx_PutPixel(gl_display_t *display, gl_word_t  X, gl_word_t  Y, gl_word_t  Color)
 {
   unsigned char  towrite[8] ;
   towrite[0]= F_gfx_PutPixel >> 8 ;
@@ -559,11 +569,11 @@ void gfx_PutPixel(gl_word_t  X, gl_word_t  Y, gl_word_t  Color)
   towrite[5]= Y ;
   towrite[6]= Color >> 8 ;
   towrite[7]= Color ;
-  WriteBytes(towrite, 8) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 8) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Rectangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
+void gl_gfx_Rectangle(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
 {
   unsigned char  towrite[12] ;
   towrite[0]= F_gfx_Rectangle >> 8 ;
@@ -578,11 +588,11 @@ void gfx_Rectangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, g
   towrite[9]= Y2 ;
   towrite[10]= Color >> 8 ;
   towrite[11]= Color ;
-  WriteBytes(towrite, 12) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 12) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_RectangleFilled(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
+void gl_gfx_RectangleFilled(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color)
 {
   unsigned char  towrite[12] ;
   towrite[0]= F_gfx_RectangleFilled >> 8 ;
@@ -597,22 +607,22 @@ void gfx_RectangleFilled(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t
   towrite[9]= Y2 ;
   towrite[10]= Color >> 8 ;
   towrite[11]= Color ;
-  WriteBytes(towrite, 12) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 12) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_ScreenMode(gl_word_t  ScreenMode)
+void gl_gfx_ScreenMode(gl_display_t *display, gl_word_t  ScreenMode)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_ScreenMode >> 8 ;
   towrite[1]= F_gfx_ScreenMode & 0xFF;
   towrite[2]= ScreenMode >> 8 ;
   towrite[3]= ScreenMode ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Set(gl_word_t  Func, gl_word_t  Value)
+void gl_gfx_Set(gl_display_t *display, gl_word_t  Func, gl_word_t  Value)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_gfx_Set >> 8 ;
@@ -621,42 +631,42 @@ void gfx_Set(gl_word_t  Func, gl_word_t  Value)
   towrite[3]= Func ;
   towrite[4]= Value >> 8 ;
   towrite[5]= Value ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_SetClipRegion()
+void gl_gfx_SetClipRegion(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_gfx_SetClipRegion >> 8 ;
   towrite[1]= F_gfx_SetClipRegion ;
-  WriteBytes(towrite, 2) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Transparency(gl_word_t  OnOff)
+void gl_gfx_Transparency(gl_display_t *display, gl_word_t  OnOff)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_Transparency >> 8 ;
   towrite[1]= F_gfx_Transparency & 0xFF;
   towrite[2]= OnOff >> 8 ;
   towrite[3]= OnOff ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_TransparentColour(gl_word_t  Color)
+void gl_gfx_TransparentColour(gl_display_t *display, gl_word_t  Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_gfx_TransparentColour >> 8 ;
   towrite[1]= F_gfx_TransparentColour & 0xFF;
   towrite[2]= Color >> 8 ;
   towrite[3]= Color ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void gfx_Triangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  X3, gl_word_t  Y3, gl_word_t  Color)
+void gl_gfx_Triangle(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  X3, gl_word_t  Y3, gl_word_t  Color)
 {
   unsigned char  towrite[16] ;
   towrite[0]= F_gfx_Triangle >> 8 ;
@@ -675,20 +685,20 @@ void gfx_Triangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl
   towrite[13]= Y3 ;
   towrite[14]= Color >> 8 ;
   towrite[15]= Color ;
-  WriteBytes(towrite, 16) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 16) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t media_Flush()
+gl_word_t gl_media_Flush(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_media_Flush >> 8 ;
   towrite[1]= F_media_Flush ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-void media_Image(gl_word_t  X, gl_word_t  Y)
+void gl_media_Image(gl_display_t *display, gl_word_t  X, gl_word_t  Y)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_media_Image >> 8 ;
@@ -697,38 +707,38 @@ void media_Image(gl_word_t  X, gl_word_t  Y)
   towrite[3]= X ;
   towrite[4]= Y >> 8 ;
   towrite[5]= Y ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t media_Init()
+gl_word_t gl_media_Init(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_media_Init >> 8 ;
   towrite[1]= F_media_Init ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-gl_word_t media_ReadByte()
+gl_word_t gl_media_ReadByte(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_media_ReadByte >> 8 ;
   towrite[1]= F_media_ReadByte ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-gl_word_t media_ReadWord()
+gl_word_t gl_media_ReadWord(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_media_ReadWord >> 8 ;
   towrite[1]= F_media_ReadWord ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-void media_SetAdd(gl_word_t  HiWord, gl_word_t  LoWord)
+void gl_media_SetAdd(gl_display_t *display, gl_word_t  HiWord, gl_word_t  LoWord)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_media_SetAdd >> 8 ;
@@ -737,11 +747,11 @@ void media_SetAdd(gl_word_t  HiWord, gl_word_t  LoWord)
   towrite[3]= HiWord ;
   towrite[4]= LoWord >> 8 ;
   towrite[5]= LoWord ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void media_SetSector(gl_word_t  HiWord, gl_word_t  LoWord)
+void gl_media_SetSector(gl_display_t *display, gl_word_t  HiWord, gl_word_t  LoWord)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_media_SetSector >> 8 ;
@@ -750,11 +760,11 @@ void media_SetSector(gl_word_t  HiWord, gl_word_t  LoWord)
   towrite[3]= HiWord ;
   towrite[4]= LoWord >> 8 ;
   towrite[5]= LoWord ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void media_Video(gl_word_t  X, gl_word_t  Y)
+void gl_media_Video(gl_display_t *display, gl_word_t  X, gl_word_t  Y)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_media_Video >> 8 ;
@@ -763,11 +773,11 @@ void media_Video(gl_word_t  X, gl_word_t  Y)
   towrite[3]= X ;
   towrite[4]= Y >> 8 ;
   towrite[5]= Y ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void media_VideoFrame(gl_word_t  X, gl_word_t  Y, gl_word_t  Framenumber)
+void gl_media_VideoFrame(gl_display_t *display, gl_word_t  X, gl_word_t  Y, gl_word_t  Framenumber)
 {
   unsigned char  towrite[8] ;
   towrite[0]= F_media_VideoFrame >> 8 ;
@@ -778,142 +788,142 @@ void media_VideoFrame(gl_word_t  X, gl_word_t  Y, gl_word_t  Framenumber)
   towrite[5]= Y ;
   towrite[6]= Framenumber >> 8 ;
   towrite[7]= Framenumber ;
-  WriteBytes(towrite, 8) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 8) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t media_WriteByte(gl_word_t  Byte)
+gl_word_t gl_media_WriteByte(gl_display_t *display, gl_word_t  Byte)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_media_WriteByte >> 8 ;
   towrite[1]= F_media_WriteByte ;
   towrite[2]= Byte >> 8 ;
   towrite[3]= Byte ;
-  WriteBytes(towrite, 4) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  return GetAckResp(display->serif) ;
 }
 
-gl_word_t media_WriteWord(gl_word_t  Word)
+gl_word_t gl_media_WriteWord(gl_display_t *display, gl_word_t  Word)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_media_WriteWord >> 8 ;
   towrite[1]= F_media_WriteWord ;
   towrite[2]= Word >> 8 ;
   towrite[3]= Word ;
-  WriteBytes(towrite, 4) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  return GetAckResp(display->serif) ;
 }
 
-void putCH(gl_word_t  WordChar)
+void gl_putCH(gl_display_t *display, gl_word_t  WordChar)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_putCH >> 8 ;
   towrite[1]= F_putCH ;
   towrite[2]= WordChar >> 8 ;
   towrite[3]= WordChar ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void putstr(unsigned char *  InString)
+void gl_putstr(gl_display_t *display, unsigned char *  InString)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_putstr >> 8 ;
   towrite[1]= F_putstr ;
-  WriteBytes(towrite, 2) ;
-  WriteChars(InString) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  WriteChars(display->serif, InString) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Attributes(gl_word_t  Attribs)
+void gl_txt_Attributes(gl_display_t *display, gl_word_t  Attribs)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Attributes >> 8 ;
   towrite[1]= F_txt_Attributes & 0xFF;
   towrite[2]= Attribs >> 8 ;
   towrite[3]= Attribs ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_BGcolour(gl_word_t  Color)
+void gl_txt_BGcolour(gl_display_t *display, gl_word_t  Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_BGcolour >> 8 ;
   towrite[1]= F_txt_BGcolour & 0xFF;
   towrite[2]= Color >> 8 ;
   towrite[3]= Color ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Bold(gl_word_t  Bold)
+void gl_txt_Bold(gl_display_t *display, gl_word_t  Bold)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Bold >> 8 ;
   towrite[1]= F_txt_Bold & 0xFF;
   towrite[2]= Bold >> 8 ;
   towrite[3]= Bold ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_FGcolour(gl_word_t  Color)
+void gl_txt_FGcolour(gl_display_t *display, gl_word_t  Color)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_FGcolour >> 8 ;
   towrite[1]= F_txt_FGcolour & 0xFF;
   towrite[2]= Color >> 8 ;
   towrite[3]= Color ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_FontID(gl_word_t  FontNumber)
+void gl_txt_FontID(gl_display_t *display, gl_word_t  FontNumber)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_FontID >> 8 ;
   towrite[1]= F_txt_FontID & 0xFF;
   towrite[2]= FontNumber >> 8 ;
   towrite[3]= FontNumber ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Height(gl_word_t  Multiplier)
+void gl_txt_Height(gl_display_t *display, gl_word_t  Multiplier)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Height >> 8 ;
   towrite[1]= F_txt_Height & 0xFF;
   towrite[2]= Multiplier >> 8 ;
   towrite[3]= Multiplier ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Inverse(gl_word_t  Inverse)
+void gl_txt_Inverse(gl_display_t *display, gl_word_t  Inverse)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Inverse >> 8 ;
   towrite[1]= F_txt_Inverse & 0xFF;
   towrite[2]= Inverse >> 8 ;
   towrite[3]= Inverse ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Italic(gl_word_t  Italic)
+void gl_txt_Italic(gl_display_t *display, gl_word_t  Italic)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Italic >> 8 ;
   towrite[1]= F_txt_Italic & 0xFF;
   towrite[2]= Italic >> 8 ;
   towrite[3]= Italic ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_MoveCursor(gl_word_t  Line, gl_word_t  Column)
+void gl_txt_MoveCursor(gl_display_t *display, gl_word_t  Line, gl_word_t  Column)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_txt_MoveCursor >> 8 ;
@@ -922,22 +932,22 @@ void txt_MoveCursor(gl_word_t  Line, gl_word_t  Column)
   towrite[3]= Line ;
   towrite[4]= Column >> 8 ;
   towrite[5]= Column ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Opacity(gl_word_t  TransparentOpaque)
+void gl_txt_Opacity(gl_display_t *display, gl_word_t  TransparentOpaque)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Opacity >> 8 ;
   towrite[1]= F_txt_Opacity & 0xFF;
   towrite[2]= TransparentOpaque >> 8 ;
   towrite[3]= TransparentOpaque ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Set(gl_word_t  Func, gl_word_t  Value)
+void gl_txt_Set(gl_display_t *display, gl_word_t  Func, gl_word_t  Value)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_txt_Set >> 8 ;
@@ -946,22 +956,22 @@ void txt_Set(gl_word_t  Func, gl_word_t  Value)
   towrite[3]= Func ;
   towrite[4]= Value >> 8 ;
   towrite[5]= Value ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Underline(gl_word_t  Underline)
+void gl_txt_Underline(gl_display_t *display, gl_word_t  Underline)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Underline >> 8 ;
   towrite[1]= F_txt_Underline & 0xFF;
   towrite[2]= Underline >> 8 ;
   towrite[3]= Underline ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Width(gl_word_t  Multiplier)
+void gl_txt_Width(gl_display_t *display, gl_word_t  Multiplier)
 {
   unsigned char  towrite[4] ;
 
@@ -969,33 +979,33 @@ void txt_Width(gl_word_t  Multiplier)
   towrite[1]= F_txt_Width & 0xFF;
   towrite[2]= Multiplier >> 8 ;
   towrite[3]= Multiplier ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Xgap(gl_word_t  Pixels)
+void gl_txt_Xgap(gl_display_t *display, gl_word_t  Pixels)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Xgap >> 8 ;
   towrite[1]= F_txt_Xgap & 0xFF;
   towrite[2]= Pixels >> 8 ;
   towrite[3]= Pixels ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void txt_Ygap(gl_word_t  Pixels)
+void gl_txt_Ygap(gl_display_t *display, gl_word_t  Pixels)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_txt_Ygap >> 8 ;
   towrite[1]= F_txt_Ygap & 0xFF;
   towrite[2]= Pixels >> 8 ;
   towrite[3]= Pixels ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void BeeP(gl_word_t  Note, gl_word_t  Duration)
+void gl_BeeP(gl_display_t *display, gl_word_t  Note, gl_word_t  Duration)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_BeeP >> 8 ;
@@ -1004,38 +1014,38 @@ void BeeP(gl_word_t  Note, gl_word_t  Duration)
   towrite[3]= Note ;
   towrite[4]= Duration >> 8 ;
   towrite[5]= Duration ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t sys_GetModel(unsigned char *  ModelStr)
+gl_word_t gl_sys_GetModel(gl_display_t *display, unsigned char *  ModelStr)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_sys_GetModel >> 8 ;
   towrite[1]= F_sys_GetModel ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResStr(ModelStr) ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResStr(display->serif, ModelStr) ;
 }
 
-gl_word_t sys_GetVersion()
+gl_word_t gl_sys_GetVersion(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_sys_GetVersion >> 8 ;
   towrite[1]= F_sys_GetVersion ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-gl_word_t sys_GetPmmC()
+gl_word_t gl_sys_GetPmmC(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_sys_GetPmmC >> 8 ;
   towrite[1]= F_sys_GetPmmC ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-void blitComtoDisplay(gl_word_t  X, gl_word_t  Y, gl_word_t  Width, gl_word_t  Height, gl_byte_array_t  Pixels)
+void gl_blitComtoDisplay(gl_display_t *display, gl_word_t  X, gl_word_t  Y, gl_word_t  Width, gl_word_t  Height, gl_byte_array_t  Pixels)
 {
   unsigned char  towrite[10] ;
   towrite[0]= F_blitComtoDisplay >> 8 ;
@@ -1048,35 +1058,35 @@ void blitComtoDisplay(gl_word_t  X, gl_word_t  Y, gl_word_t  Width, gl_word_t  H
   towrite[7]= Width ;
   towrite[8]= Height >> 8 ;
   towrite[9]= Height ;
-  WriteBytes(towrite, 10) ;
-  WriteBytes(Pixels, Width*Height*2) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 10) ;
+  WriteBytes(display->serif, Pixels, Width*Height*2) ;
+  GetAck(display->serif) ;
 }
 
-void setbaudWait(gl_word_t  Newrate)
+void gl_setbaudWait(gl_display_t *display, gl_word_t  Newrate)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_setbaudWait >> 8 ;
   towrite[1]= F_setbaudWait ;
   towrite[2]= Newrate >> 8 ;
   towrite[3]= Newrate ;
-  WriteBytes(towrite, 4) ;
+  WriteBytes(display->serif, towrite, 4) ;
   //SetThisBaudrate(Newrate) ; // change this systems baud rate to match new display rate, ACK is 100ms away
-  GetAck() ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t peekW(gl_word_t  Address)
+gl_word_t gl_peekW(gl_display_t *display, gl_word_t  Address)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_peekW >> 8 ;
   towrite[1]= F_peekW ;
   towrite[2]= Address >> 8 ;
   towrite[3]= Address ;
-  WriteBytes(towrite, 4) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  return GetAckResp(display->serif) ;
 }
 
-void pokeW(gl_word_t  Address, gl_word_t  WordValue)
+void gl_pokeW(gl_display_t *display, gl_word_t  Address, gl_word_t  WordValue)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_pokeW >> 8 ;
@@ -1085,22 +1095,22 @@ void pokeW(gl_word_t  Address, gl_word_t  WordValue)
   towrite[3]= Address ;
   towrite[4]= WordValue >> 8 ;
   towrite[5]= WordValue ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t peekB(gl_word_t  Address)
+gl_word_t gl_peekB(gl_display_t *display, gl_word_t  Address)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_peekB >> 8 ;
   towrite[1]= F_peekB ;
   towrite[2]= Address >> 8 ;
   towrite[3]= Address ;
-  WriteBytes(towrite, 4) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  return GetAckResp(display->serif) ;
 }
 
-void pokeB(gl_word_t  Address, gl_word_t  ByteValue)
+void gl_pokeB(gl_display_t *display, gl_word_t  Address, gl_word_t  ByteValue)
 {
   unsigned char  towrite[6] ;
   towrite[0]= F_pokeB >> 8 ;
@@ -1109,50 +1119,50 @@ void pokeB(gl_word_t  Address, gl_word_t  ByteValue)
   towrite[3]= Address ;
   towrite[4]= ByteValue >> 8 ;
   towrite[5]= ByteValue ;
-  WriteBytes(towrite, 6) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 6) ;
+  GetAck(display->serif) ;
 }
 
-gl_word_t joystick()
+gl_word_t gl_joystick(gl_display_t *display)
 {
   unsigned char  towrite[2] ;
   towrite[0]= F_joystick >> 8 ;
   towrite[1]= F_joystick ;
-  WriteBytes(towrite, 2) ;
-  return GetAckResp() ;
+  WriteBytes(display->serif, towrite, 2) ;
+  return GetAckResp(display->serif) ;
 }
 
-void SSTimeout(gl_word_t  Seconds)
+void gl_SSTimeout(gl_display_t *display, gl_word_t  Seconds)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_SSTimeout >> 8 ;
   towrite[1]= F_SSTimeout ;
   towrite[2]= Seconds >> 8 ;
   towrite[3]= Seconds ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void SSSpeed(gl_word_t  Speed)
+void gl_SSSpeed(gl_display_t *display, gl_word_t  Speed)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_SSSpeed >> 8 ;
   towrite[1]= F_SSSpeed ;
   towrite[2]= Speed >> 8 ;
   towrite[3]= Speed ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
-void SSMode(gl_word_t  Parm)
+void gl_SSMode(gl_display_t *display, gl_word_t  Parm)
 {
   unsigned char  towrite[4] ;
   towrite[0]= F_SSMode >> 8 ;
   towrite[1]= F_SSMode ;
   towrite[2]= Parm >> 8 ;
   towrite[3]= Parm ;
-  WriteBytes(towrite, 4) ;
-  GetAck() ;
+  WriteBytes(display->serif, towrite, 4) ;
+  GetAck(display->serif) ;
 }
 
 /*
@@ -1176,7 +1186,8 @@ void setbaudWait(gl_word_t  Newrate)
 
 
 gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif) {
-    int k, ch, tSave;
+    int k, tSave;
+    unsigned char ch;
     //gl_word_t    nBaud;
 
     TimeLimit4D = 2000;
@@ -1193,8 +1204,10 @@ gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif) {
     for (k = 0 ; k < 10 ; k++)
     {
         ch = 'X';
-        disp->serif->write_tx((void *)&ch, 1, 500);
-        ReadSerPort(disp->serif, &ch, 1);
+        disp->serif->write_tx((void *)&ch, 1);
+        disp->serif->flush_tx(TimeLimit4D);
+        if (ReadSerPort(disp->serif, &ch, 1) == -1)
+            break;
         if (ch == 0x15)
             break ;
     }
@@ -1204,86 +1217,86 @@ gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif) {
     return 0;
 }
 
-int OpenComm(char *sDeviceName, int newrate)
-{
-    struct termios new_port_settings;
-    //gl_word_t    nBaud;
-    int k, ch, tSave, baudr;
-    
-switch(newrate)
-  {
-    case      50 : baudr = B50;         break;
-    case      75 : baudr = B75;         break;
-    case     110 : baudr = B110;        break;
-    case     134 : baudr = B134;        break;
-    case     150 : baudr = B150;        break;
-    case     200 : baudr = B200;        break;
-    case     300 : baudr = B300;        break;
-    case     600 : baudr = B600;        break;
-    case    1200 : baudr = B1200;       break;
-    case    1800 : baudr = B1800;       break;
-    case    2400 : baudr = B2400;       break;
-    case    4800 : baudr = B4800;       break;
-    case    9600 : baudr = B9600;       break;
-    case   19200 : baudr = B19200;      break;
-    case   38400 : baudr = B38400;      break;
-    case   57600 : baudr = B57600;      break;
-    case  115200 : baudr = B115200;     break;
-    case  230400 : baudr = B230400;     break;
-    case  460800 : baudr = B460800;     break;
-    case  500000 : baudr = B500000;     break;
-    case  576000 : baudr = B576000;     break;
-    case  921600 : baudr = B921600;     break;
-    case 1000000 : baudr = B1000000;    break;
-    default      : printf("invalid baudrate\n");
-                   return(1);
-                   break;
-}
-    cPort = open(sDeviceName, O_RDWR | O_NOCTTY | O_NDELAY);
-// Current config
-    tcgetattr(cPort, &new_port_settings);
-    // Set the line to RAW
-    cfmakeraw(&new_port_settings);
-    memset(&new_port_settings, 0, sizeof(new_port_settings));  /* clear the new struct */
-    new_port_settings.c_cflag = baudr | CS8 | CLOCAL | CREAD;
-    new_port_settings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
-    new_port_settings.c_iflag = IGNPAR;
-    new_port_settings.c_oflag = 0;
-    new_port_settings.c_lflag = 0;
-    new_port_settings.c_cc[VMIN] = 0;      /* block untill n bytes are received */
-    new_port_settings.c_cc[VTIME] = 100;     /* block untill a timer expires (n * 100 mSec.) */
-/*
-    cfsetospeed(&new_port_settings, nBaud);
-    cfsetispeed(&new_port_settings, nBaud);
-*/
-    // set new config
-    tcsetattr(cPort, TCSANOW, &new_port_settings);
-    // Set non-blocking
-    fcntl(cPort, F_SETFL, FNDELAY);
-    
-    tSave = TimeLimit4D;
-    TimeLimit4D = 500;
-    for (k = 0 ; k < 10 ; k++)
-    {
-        ch = 'X';
-        write(cPort, (unsigned char *)&ch, 1);
-        tcflush(cPort, TCOFLUSH);
-        ReadSerPort((unsigned char *)&ch, 1);
-        if (ch == 0x15)
-            break ;
-    }
-    TimeLimit4D = tSave;
-
-    tcflush(cPort, TCIOFLUSH);
-    return 0;
-}
-
-void CloseComm(void)
-{
-    close(cPort);
-    cPort = -1;
-    Error4D = Err4D_OK;
-
-    return;
-}
+// int OpenComm(char *sDeviceName, int newrate)
+// {
+//     struct termios new_port_settings;
+//     //gl_word_t    nBaud;
+//     int k, ch, tSave, baudr;
+//     
+// switch(newrate)
+//   {
+//     case      50 : baudr = B50;         break;
+//     case      75 : baudr = B75;         break;
+//     case     110 : baudr = B110;        break;
+//     case     134 : baudr = B134;        break;
+//     case     150 : baudr = B150;        break;
+//     case     200 : baudr = B200;        break;
+//     case     300 : baudr = B300;        break;
+//     case     600 : baudr = B600;        break;
+//     case    1200 : baudr = B1200;       break;
+//     case    1800 : baudr = B1800;       break;
+//     case    2400 : baudr = B2400;       break;
+//     case    4800 : baudr = B4800;       break;
+//     case    9600 : baudr = B9600;       break;
+//     case   19200 : baudr = B19200;      break;
+//     case   38400 : baudr = B38400;      break;
+//     case   57600 : baudr = B57600;      break;
+//     case  115200 : baudr = B115200;     break;
+//     case  230400 : baudr = B230400;     break;
+//     case  460800 : baudr = B460800;     break;
+//     case  500000 : baudr = B500000;     break;
+//     case  576000 : baudr = B576000;     break;
+//     case  921600 : baudr = B921600;     break;
+//     case 1000000 : baudr = B1000000;    break;
+//     default      : printf("invalid baudrate\n");
+//                    return(1);
+//                    break;
+// }
+//     cPort = open(sDeviceName, O_RDWR | O_NOCTTY | O_NDELAY);
+// // Current config
+//     tcgetattr(cPort, &new_port_settings);
+//     // Set the line to RAW
+//     cfmakeraw(&new_port_settings);
+//     memset(&new_port_settings, 0, sizeof(new_port_settings));  /* clear the new struct */
+//     new_port_settings.c_cflag = baudr | CS8 | CLOCAL | CREAD;
+//     new_port_settings.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+//     new_port_settings.c_iflag = IGNPAR;
+//     new_port_settings.c_oflag = 0;
+//     new_port_settings.c_lflag = 0;
+//     new_port_settings.c_cc[VMIN] = 0;      /* block untill n bytes are received */
+//     new_port_settings.c_cc[VTIME] = 100;     /* block untill a timer expires (n * 100 mSec.) */
+// /*
+//     cfsetospeed(&new_port_settings, nBaud);
+//     cfsetispeed(&new_port_settings, nBaud);
+// */
+//     // set new config
+//     tcsetattr(cPort, TCSANOW, &new_port_settings);
+//     // Set non-blocking
+//     fcntl(cPort, F_SETFL, FNDELAY);
+//     
+//     tSave = TimeLimit4D;
+//     TimeLimit4D = 500;
+//     for (k = 0 ; k < 10 ; k++)
+//     {
+//         ch = 'X';
+//         write(cPort, (unsigned char *)&ch, 1);
+//         tcflush(cPort, TCOFLUSH);
+//         ReadSerPort((unsigned char *)&ch, 1);
+//         if (ch == 0x15)
+//             break ;
+//     }
+//     TimeLimit4D = tSave;
+// 
+//     tcflush(cPort, TCIOFLUSH);
+//     return 0;
+// }
+// 
+// void CloseComm(void)
+// {
+//     close(cPort);
+//     cPort = -1;
+//     Error4D = Err4D_OK;
+// 
+//     return;
+// }
 
index 1b71fe0582bb66c161d74c6b38518c8a79989a42..06643feb277b6cc2b9f339f2dc378421d56cfc4b 100644 (file)
@@ -49,78 +49,190 @@ extern "C" {
  * @return error code
  */
 gl_err_t gl_init(gl_display_t *disp, gl_serif_t *serif);
-int OpenComm(char *comport, int newrate) ;
-void blitComtoDisplay(gl_word_t  X, gl_word_t  Y, gl_word_t  Width, gl_word_t  Height, gl_byte_array_t  Pixels) ;
-void gfx_BGcolour(gl_word_t  Color) ;
-void gfx_ChangeColour(gl_word_t  OldColor, gl_word_t  NewColor) ;
-void gfx_Circle(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t  Color) ;
-void gfx_CircleFilled(gl_word_t  X, gl_word_t  Y, gl_word_t  Radius, gl_word_t  Color) ;
-void gfx_Clipping(gl_word_t  OnOff) ;
-void gfx_ClipWindow(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2) ;
-void gfx_Cls() ;
-void gfx_Contrast(gl_word_t  Contrast) ;
-void gfx_FrameDelay(gl_word_t  Msec) ;
-void gfx_Line(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
-void gfx_LinePattern(gl_word_t  Pattern) ;
-void gfx_LineTo(gl_word_t  X, gl_word_t  Y) ;
-void gfx_MoveTo(gl_word_t  X, gl_word_t  Y) ;
-void gfx_OutlineColour(gl_word_t  Color) ;
-void gfx_Polygon(gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color) ;
-void gfx_Polyline(gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color) ;
-void gfx_PutPixel(gl_word_t  X, gl_word_t  Y, gl_word_t  Color) ;
-void gfx_Rectangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
-void gfx_RectangleFilled(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
-void gfx_ScreenMode(gl_word_t  ScreenMode) ;
-void gfx_Set(gl_word_t  Func, gl_word_t  Value) ;
-void gfx_Transparency(gl_word_t  OnOff) ;
-void gfx_TransparentColour(gl_word_t  Color) ;
-void gfx_Triangle(gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  X3, gl_word_t  Y3, gl_word_t  Color) ;
-void media_Image(gl_word_t  X, gl_word_t  Y) ;
-void media_SetAdd(gl_word_t  HiWord, gl_word_t  LoWord) ;
-void media_SetSector(gl_word_t  HiWord, gl_word_t  LoWord) ;
-void media_Video(gl_word_t  X, gl_word_t  Y) ;
-void media_VideoFrame(gl_word_t  X, gl_word_t  Y, gl_word_t  Framenumber) ;
-void pokeB(gl_word_t  Address, gl_word_t  ByteValue) ;
-void pokeW(gl_word_t  Address, gl_word_t  WordValue) ;
-void putCH(gl_word_t  WordChar) ;
-void setbaudWait(gl_word_t  Newrate) ;
-void SSMode(gl_word_t  Parm) ;
-void SSSpeed(gl_word_t  Speed) ;
-void SSTimeout(gl_word_t  Seconds) ;
-void txt_Attributes(gl_word_t  Attribs) ;
-void txt_BGcolour(gl_word_t  Color) ;
-void txt_Bold(gl_word_t  Bold) ;
-void txt_FGcolour(gl_word_t  Color) ;
-void txt_FontID(gl_word_t  FontNumber) ;
-void txt_Height(gl_word_t  Multiplier) ;
-void txt_Inverse(gl_word_t  Inverse) ;
-void txt_Italic(gl_word_t  Italic) ;
-void txt_MoveCursor(gl_word_t  Line, gl_word_t  Column) ;
-void txt_Opacity(gl_word_t  TransparentOpaque) ;
-void txt_Set(gl_word_t  Func, gl_word_t  Value) ;
-void txt_Underline(gl_word_t  Underline) ;
-void txt_Width(gl_word_t  Multiplier) ;
-void txt_Xgap(gl_word_t  Pixels) ;
-void txt_Ygap(gl_word_t  Pixels) ;
-void BeeP(gl_word_t  Note, gl_word_t  Duration) ;
-gl_word_t charheight(unsigned char  TestChar) ;
-gl_word_t charwidth(unsigned char  TestChar) ;
-gl_word_t gfx_GetPixel(gl_word_t  X, gl_word_t  Y) ;
-gl_word_t gfx_Orbit(gl_word_t  Angle, gl_word_t  Distance, gl_word_t *  Xdest, gl_word_t *  Ydest) ;
-void gfx_SetClipRegion() ;
-gl_word_t joystick() ;
-gl_word_t media_Flush() ;
-gl_word_t media_Init() ;
-gl_word_t media_ReadByte() ;
-gl_word_t media_ReadWord() ;
-gl_word_t media_WriteByte(gl_word_t  Byte) ;
-gl_word_t media_WriteWord(gl_word_t  Word) ;
-gl_word_t peekB(gl_word_t  Address) ;
-gl_word_t peekW(gl_word_t  Address) ;
-void putstr(unsigned char *  InString) ;
-gl_word_t sys_GetModel(unsigned char *  ModelStr) ;
-gl_word_t sys_GetPmmC() ;
-gl_word_t sys_GetVersion() ;
+
+/**
+ * @brief Return Character Height for the given char in
+ * pixels.
+ * @param display The display object to use
+ * @param test_char Presumably, a test character?
+ * @return The height of that character
+ */
+gl_word_t gl_charheight(gl_display_t *display, unsigned char test_char);
+
+/**
+ * @brief Return Character width for the given char in
+ * pixels.
+ * @param display The display object to use
+ * @param test_char Presumably, a test character?
+ * @return The width of that character
+ */
+gl_word_t gl_charwidth(gl_display_t *display, unsigned char TestChar) ;
+
+/**
+ * @brief Set the screen background color.
+ * @param display The display object to use
+ * @param color The color to set the background to.
+ */
+void gl_gfx_BGcolour(gl_display_t *display, gl_word_t color);
+
+/**
+ * @brief Changes all old colored pixels to new colored pixels.
+ * @param display The display object to use
+ * @param old The old color to find
+ * @param new The new color to replace
+ */
+void gl_gfx_ChangeColour(gl_display_t *display, gl_word_t old, gl_word_t new);
+
+/**
+ * @brief Draw a circle (not filled).
+ * @param display The display object to use
+ * @param x The center X coordimate of the circle
+ * @param y The center Y coordinate of the circle
+ * @param rad The radius of the circle
+ * @param col The color of the circle
+ */
+void gl_gfx_Circle(gl_display_t *display, gl_word_t x, gl_word_t y,
+        gl_word_t rad, gl_word_t col);
+
+/**
+ * @brief Draw a circle (filled).
+ * @param display The display object to use
+ * @param x The center X coordimate of the circle
+ * @param y The center Y coordinate of the circle
+ * @param rad The radius of the circle
+ * @param col The color of the circle
+ */
+void gl_gfx_CircleFilled(gl_display_t *display, gl_word_t x, gl_word_t y,
+        gl_word_t rad, gl_word_t col);
+
+/**
+ * @brief Enables/disables Clipping.
+ * @param display The display object to use
+ * @param value zero = disabled, 1 = enabled.
+ */
+void gl_gfx_Clipping(gl_display_t *display, gl_word_t value);
+
+/**
+ * @brief All objects will only be visible in this region.
+ *
+ * Enable clipping first using gl_gfx_Clipping.
+ * @param display The display object to use
+ * @param x1 Horizontal Top Left position
+ * @param y1 Vertical Top Left Position
+ * @param x2 Horizontal Bottom Right position
+ * @param y2 Vertical Bot Right Position
+ */
+void gl_gfx_ClipWindow(gl_display_t *display, gl_word_t x1, gl_word_t y1,
+        gl_word_t x2, gl_word_t y2);
+
+/**
+ * @brief Clear screen using the defaults.
+ *
+ * Some settings may be reset, such as outline color, pen, origin and text
+ * magnification. Consult the 4D Library manuals for more info.
+ * @param display The display object to use
+ */
+void gl_gfx_Cls(gl_display_t *display);
+
+/**
+ * @brief Sets contrast, or turns display on/off depending on model.
+ * @param display The display object to use
+ * @param contrast Contrast 0 = Display OFF
+ *     Contrast 1 - 15 = Contrast Level
+ * 
+ * @note uLCD-144-G2 does not support Contrast ‘levels’, values from 1-15 could
+ * be set to turn the display ‘On’ and 0 to turn the Display ‘Off’.
+ */
+void gl_gfx_Contrast(gl_display_t *display, gl_word_t contrast);
+
+/**
+ * @brief sets frame delay for Media Video command
+ * @param display The display object to use
+ * @param msec 0-255 ms
+ */
+void gl_gfx_FrameDelay(gl_display_t *display, gl_word_t msec);
+
+gl_word_t gl_gfx_GetPixel(gl_display_t *display, gl_word_t  X, gl_word_t  Y);
+
+void gl_gfx_Line(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
+
+void gl_gfx_LinePattern(gl_display_t *display, gl_word_t  Pattern) ;
+
+void gl_gfx_LineTo(gl_display_t *display, gl_word_t  X, gl_word_t  Y) ;
+
+void gl_gfx_MoveTo(gl_display_t *display, gl_word_t  X, gl_word_t  Y) ;
+
+gl_word_t gl_gfx_Orbit(gl_display_t *display, gl_word_t  Angle, gl_word_t  Distance, gl_word_t *  Xdest, gl_word_t *  Ydest) ;
+
+void gl_gfx_OutlineColour(gl_display_t *display, gl_word_t  Color) ;
+
+void gl_gfx_Polygon(gl_display_t *display, gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color) ;
+
+void gl_gfx_Polyline(gl_display_t *display, gl_word_t  n, gl_word_array_t  Xvalues, gl_word_array_t  Yvalues, gl_word_t  Color) ;
+
+void gl_gfx_PutPixel(gl_display_t *disp, gl_word_t  X, gl_word_t  Y, gl_word_t  Color) ;
+
+void gl_gfx_Rectangle(gl_display_t *disp, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
+
+void gl_gfx_RectangleFilled(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  Color) ;
+
+void gl_gfx_ScreenMode(gl_display_t *display, gl_word_t  ScreenMode) ;
+
+void gl_gfx_SetClipRegion(gl_display_t *display) ;
+void gl_blitComtoDisplay(gl_display_t *disp, gl_word_t  X, gl_word_t  Y, gl_word_t  Width, gl_word_t  Height, gl_byte_array_t  Pixels) ;
+void gl_gfx_Set(gl_display_t *display, gl_word_t  Func, gl_word_t  Value) ;
+void gl_gfx_Transparency(gl_display_t *display, gl_word_t  OnOff) ;
+void gl_gfx_TransparentColour(gl_display_t *display, gl_word_t  Color) ;
+void gl_gfx_Triangle(gl_display_t *display, gl_word_t  X1, gl_word_t  Y1, gl_word_t  X2, gl_word_t  Y2, gl_word_t  X3, gl_word_t  Y3, gl_word_t  Color) ;
+gl_word_t gl_media_Flush(gl_display_t *display) ;
+gl_word_t gl_media_Init(gl_display_t *display) ;
+gl_word_t gl_media_ReadByte(gl_display_t *display) ;
+gl_word_t gl_media_ReadWord(gl_display_t *display) ;
+gl_word_t gl_media_WriteByte(gl_display_t *display, gl_word_t  Byte) ;
+gl_word_t gl_media_WriteWord(gl_display_t *display, gl_word_t  Word) ;
+void gl_media_Image(gl_display_t *display, gl_word_t  X, gl_word_t  Y) ;
+void gl_media_SetAdd(gl_display_t *display, gl_word_t  HiWord, gl_word_t  LoWord) ;
+void gl_media_SetSector(gl_display_t *display, gl_word_t  HiWord, gl_word_t  LoWord) ;
+void gl_media_Video(gl_display_t *display, gl_word_t  X, gl_word_t  Y) ;
+void gl_media_VideoFrame(gl_display_t *display, gl_word_t  X, gl_word_t  Y, gl_word_t  Framenumber) ;
+void gl_putCH(gl_display_t *display, gl_word_t  WordChar) ;
+void gl_putstr(gl_display_t *display, unsigned char *  InString) ;
+
+void gl_txt_Attributes(gl_display_t *display, gl_word_t  Attribs) ;
+void gl_txt_BGcolour(gl_display_t *display, gl_word_t  Color) ;
+void gl_txt_Bold(gl_display_t *display, gl_word_t  Bold) ;
+void gl_txt_FGcolour(gl_display_t *display, gl_word_t  Color) ;
+void gl_txt_FontID(gl_display_t *display, gl_word_t  FontNumber) ;
+void gl_txt_Height(gl_display_t *display, gl_word_t  Multiplier) ;
+void gl_txt_Inverse(gl_display_t *display, gl_word_t  Inverse) ;
+void gl_txt_Italic(gl_display_t *display, gl_word_t  Italic) ;
+void gl_txt_MoveCursor(gl_display_t *display, gl_word_t  Line, gl_word_t  Column) ;
+void gl_txt_Opacity(gl_display_t *display, gl_word_t  TransparentOpaque) ;
+void gl_txt_Set(gl_display_t *display, gl_word_t  Func, gl_word_t  Value) ;
+void gl_txt_Underline(gl_display_t *display, gl_word_t  Underline) ;
+void gl_txt_Width(gl_display_t *display, gl_word_t  Multiplier) ;
+void gl_txt_Xgap(gl_display_t *display, gl_word_t  Pixels) ;
+void gl_txt_Ygap(gl_display_t *display, gl_word_t  Pixels) ;
+
+void gl_BeeP(gl_display_t *display, gl_word_t  Note, gl_word_t  Duration) ;
+
+gl_word_t gl_sys_GetModel(gl_display_t *display, unsigned char *  ModelStr) ;
+gl_word_t gl_sys_GetPmmC(gl_display_t *display) ;
+gl_word_t gl_sys_GetVersion(gl_display_t *display) ;
+
+// AVOID ME SINCE I DON"T CHANGE ESP BAUD RATE
+void gl_setbaudWait(gl_display_t *display, gl_word_t  Newrate) ;
+
+void gl_pokeB(gl_display_t *display, gl_word_t  Address, gl_word_t  ByteValue) ;
+void gl_pokeW(gl_display_t *display, gl_word_t  Address, gl_word_t  WordValue) ;
+void gl_SSMode(gl_display_t *display, gl_word_t  Parm) ;
+void gl_SSSpeed(gl_display_t *display, gl_word_t  Speed) ;
+void gl_SSTimeout(gl_display_t *display, gl_word_t  Seconds) ;
+gl_word_t gl_joystick(gl_display_t *display) ;
+gl_word_t gl_peekB(gl_display_t *display, gl_word_t  Address) ;
+gl_word_t gl_peekW(gl_display_t *display, gl_word_t  Address) ;
+
+
 
 
 #ifdef __cplusplus
index 5017b86afe8958ac4ea543f2e81178f93d99bdc2..309d24f0acacf667afffcb7888066eca4c8f4760 100644 (file)
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
 #include "driver/gpio.h"
+#include "driver/uart.h"
 
-#define BUTTON_WHITE 0
-#define BUTTON_GREEN 10
-#define BUTTON_YELLOW 11
-#define BUTTON_BLUE 18
-#define BUTTON_RED 15
-#define VIBRATOR 20
+#include "Goldelox_const4D.h"
+#include "goldeloxSerial.h"
+
+#include "pins.h"
+
+
+const uart_port_t uart_num = UART_NUM_1;
+
+int write_tx(const void *data, size_t sz) {
+    return uart_write_bytes(uart_num, data, sz);
+}
+
+
+int read_rx(void *data, size_t sz, uint32_t wait_ms) {
+    if (sizeof(size_t) > sizeof(uint32_t) && sz > UINT32_MAX)
+        return -1;
+    return uart_read_bytes(uart_num, data, (uint32_t) sz,
+            (TickType_t) wait_ms / portTICK_PERIOD_MS);
+}
+
+
+int flush_rx() {
+    return (int) uart_flush(uart_num);
+}
+
+
+int flush_tx(uint32_t wait_ms) {
+    return (int) uart_wait_tx_done(uart_num,
+            (TickType_t) wait_ms / portTICK_PERIOD_MS);
+}
 
 void app_main(void)
 {
+    // Setup UART buffered IO with event queue
+    const int uart_buffer_size = UART_HW_FIFO_LEN(uart_num) + 4;
+    QueueHandle_t uart_queue;
+
+    gl_serif_t serif_ulcd = {
+        .write_tx = write_tx,
+        .read_rx = read_rx,
+        .flush_rx = flush_rx,
+        .flush_tx = flush_tx
+    };
+
+    gl_display_t disp;
+
     printf("Hello world!\n");
 
-    ESP_ERROR_CHECK(gpio_reset_pin(BUTTON_WHITE));
-    gpio_set_direction(BUTTON_WHITE, GPIO_MODE_INPUT);
-    gpio_pullup_en(BUTTON_WHITE);
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_BUTTON_WHITE));
+    ESP_ERROR_CHECK(gpio_set_direction(PIN_BUTTON_WHITE, GPIO_MODE_INPUT));
+    ESP_ERROR_CHECK(gpio_pullup_en(PIN_BUTTON_WHITE));
+
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_BUTTON_GREEN));
+    ESP_ERROR_CHECK(gpio_set_direction(PIN_BUTTON_GREEN, GPIO_MODE_INPUT));
+    gpio_pullup_en(PIN_BUTTON_GREEN);
+
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_BUTTON_YELLOW));
+    ESP_ERROR_CHECK(gpio_set_direction(PIN_BUTTON_YELLOW, GPIO_MODE_INPUT));
+    gpio_pullup_en(PIN_BUTTON_YELLOW);
+
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_BUTTON_BLUE));
+    gpio_set_direction(PIN_BUTTON_BLUE, GPIO_MODE_INPUT);
+    gpio_pullup_en(PIN_BUTTON_BLUE);
+
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_BUTTON_RED));
+    gpio_set_direction(PIN_BUTTON_RED, GPIO_MODE_INPUT);
+    gpio_pullup_en(PIN_BUTTON_RED);
 
-    ESP_ERROR_CHECK(gpio_reset_pin(BUTTON_GREEN));
-    gpio_set_direction(BUTTON_GREEN, GPIO_MODE_INPUT);
-    gpio_pullup_en(BUTTON_GREEN);
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_VIBRATOR));
+    ESP_ERROR_CHECK(gpio_set_direction(PIN_VIBRATOR, GPIO_MODE_OUTPUT));
+    ESP_ERROR_CHECK(gpio_set_drive_capability(PIN_VIBRATOR, GPIO_DRIVE_CAP_3));
 
-    ESP_ERROR_CHECK(gpio_reset_pin(BUTTON_YELLOW));
-    gpio_set_direction(BUTTON_YELLOW, GPIO_MODE_INPUT);
-    gpio_pullup_en(BUTTON_YELLOW);
+    ESP_ERROR_CHECK(gpio_reset_pin(PIN_ULCD_RESET));
+    ESP_ERROR_CHECK(gpio_set_direction(PIN_ULCD_RESET, GPIO_MODE_OUTPUT));
+    ESP_ERROR_CHECK(gpio_set_drive_capability(PIN_ULCD_RESET, GPIO_DRIVE_CAP_1));
 
-    ESP_ERROR_CHECK(gpio_reset_pin(BUTTON_BLUE));
-    gpio_set_direction(BUTTON_BLUE, GPIO_MODE_INPUT);
-    gpio_pullup_en(BUTTON_BLUE);
+    gpio_dump_io_configuration(stdout, (1ULL << PIN_VIBRATOR) | (1ULL << PIN_BUTTON_RED));
 
-    ESP_ERROR_CHECK(gpio_reset_pin(BUTTON_RED));
-    gpio_set_direction(BUTTON_RED, GPIO_MODE_INPUT);
-    gpio_pullup_en(BUTTON_RED);
+    ESP_ERROR_CHECK(uart_driver_install(uart_num, uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0));
 
-    ESP_ERROR_CHECK(gpio_reset_pin(VIBRATOR));
-    gpio_set_direction(VIBRATOR, GPIO_MODE_OUTPUT);
-    ESP_ERROR_CHECK(gpio_set_drive_capability(VIBRATOR, GPIO_DRIVE_CAP_2));
+    uart_config_t uart_config = {
+        .baud_rate = 9600,
+        .data_bits = UART_DATA_8_BITS,
+        .parity = UART_PARITY_DISABLE,
+        .stop_bits = UART_STOP_BITS_1,
+        .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS,
+        .rx_flow_ctrl_thresh = 10,
+    };
+    // Configure UART parameters
+    ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
+    // tx then rx
+    ESP_ERROR_CHECK(uart_set_pin(uart_num, PIN_ULCD_TX, PIN_ULCD_RX,
+                UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
 
-    gpio_dump_io_configuration(stdout, (1ULL << VIBRATOR) | (1ULL << BUTTON_RED));
+    ESP_ERROR_CHECK(gpio_set_level(PIN_ULCD_RESET, 0));
+    vTaskDelay(100 / portTICK_PERIOD_MS);
+    ESP_ERROR_CHECK(gpio_set_level(PIN_ULCD_RESET, 1));
+    printf("Hello world!\n");
+
+    gl_init(&disp, &serif_ulcd);
+    printf("Hello world!\n");
+    gl_gfx_BGcolour(&disp, WHITE);
+    printf("Hello world!\n");
+    gl_gfx_Cls(&disp);
+    printf("Hello world!\n");
+    gl_gfx_CircleFilled(&disp, 72, 72, 20, TOMATO);
+    printf("Hello world!\n");
     /*
     for (int i = 10; i >= 0; i--) {
         printf("Restarting in %d seconds...\n", i);
@@ -56,16 +128,17 @@ void app_main(void)
     fflush(stdout);
     esp_restart();
     */
+    /* initialize uart */
     while (1) {
         /*
         printf("Button levels: [%d|%d|%d|%d|%d]\n",
-                gpio_get_level(BUTTON_WHITE),
-                gpio_get_level(BUTTON_GREEN),
-                gpio_get_level(BUTTON_YELLOW),
-                gpio_get_level(BUTTON_BLUE),
-                gpio_get_level(BUTTON_RED));
+                gpio_get_level(PIN_BUTTON_WHITE),
+                gpio_get_level(PIN_BUTTON_GREEN),
+                gpio_get_level(PIN_BUTTON_YELLOW),
+                gpio_get_level(PIN_BUTTON_BLUE),
+                gpio_get_level(PIN_BUTTON_RED));
                 */
-        ESP_ERROR_CHECK(gpio_set_level(VIBRATOR, !gpio_get_level(BUTTON_RED)));
+        ESP_ERROR_CHECK(gpio_set_level(PIN_VIBRATOR, !gpio_get_level(PIN_BUTTON_RED)));
         vTaskDelay(100 / portTICK_PERIOD_MS);
     }
 }
diff --git a/main/pins.h b/main/pins.h
new file mode 100644 (file)
index 0000000..6d4cb00
--- /dev/null
@@ -0,0 +1,16 @@
+#pragma once
+
+#ifndef __PINS_H__
+#define __PINS_H__
+
+#define PIN_BUTTON_WHITE 0
+#define PIN_BUTTON_GREEN 10
+#define PIN_BUTTON_YELLOW 11
+#define PIN_BUTTON_BLUE 18
+#define PIN_BUTTON_RED 15
+#define PIN_VIBRATOR 20
+#define PIN_ULCD_TX 23
+#define PIN_ULCD_RX 22
+#define PIN_ULCD_RESET 19
+
+#endif