diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..7fa498e
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 3.22)
+
+
+set(CMAKE_C_STANDARD 11)
+
+option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
+
+if (DEFINED EMSCRIPTEN)
+ set(BUILD_SHARED_LIBS OFF)
+ add_definitions(-D__EMSCRIPTEN__=1)
+endif()
+
+if (NOT BUILD_SHARED_LIBS)
+ add_definitions(-DVR_EMU_LCD_STATIC)
+endif()
+
+
+project(vrEmuLcd)
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/)
+
+include(CTest)
+
+add_subdirectory(src)
+
+if (NOT DEFINED EMSCRIPTEN)
+add_subdirectory(test)
+endif()
\ No newline at end of file
diff --git a/README.md b/README.md
index d09d2c6..11f50f2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# vrEmuLcd - HD44780 Character LCD Emulator
+
+
Core engine written in C with a flexible Web front-end.
This Character LCD Emulator can be used to emulate most standard LCD displays.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..25c9c3f
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,16 @@
+
+if (DEFINED EMSCRIPTEN)
+ add_executable(vrEmuLcd vrEmuLcd.c)
+ set_target_properties(vrEmuLcd PROPERTIES COMPILE_FLAGS "-Os -s SIDE_MODULE=1 ")
+ set_target_properties(vrEmuLcd PROPERTIES LINK_FLAGS "-Os -s EXPORT_NAME='vrEmuLcdModule' -s EXPORTED_RUNTIME_METHODS=['ccall','cwrap'] --no-entry")
+else()
+ add_library(vrEmuLcd vrEmuLcd.c)
+endif()
+
+if (WIN32)
+ if (BUILD_SHARED_LIBS)
+ add_definitions(-DVR_EMU_LCD_COMPILING_DLL)
+ endif()
+endif()
+
+target_include_directories (vrEmuLcd INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/src/vrEmuLcd.c b/src/vrEmuLcd.c
index 2d5bfd5..bf4f334 100644
--- a/src/vrEmuLcd.c
+++ b/src/vrEmuLcd.c
@@ -16,45 +16,45 @@
#include
#include
-#if VR_LCD_EMU_STATIC
-#undef VR_LCD_EMU_DLLEXPORT
-#define VR_LCD_EMU_DLLEXPORT
+#ifdef VR_EMU_LCD_STATIC
+#undef VR_EMU_LCD_DLLEXPORT
+#define VR_EMU_LCD_DLLEXPORT
#endif
/* PUBLIC CONSTANTS
* ---------------------------------------- */
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_CLEAR = 0b00000001;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_HOME = 0b00000010;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_CLEAR = 0b00000001;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_HOME = 0b00000010;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE = 0b00000100;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_INCREMENT = 0b00000010;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_DECREMENT = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_SHIFT = 0b00000001;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE = 0b00000100;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_INCREMENT = 0b00000010;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_DECREMENT = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_SHIFT = 0b00000001;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY = 0b00001000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_ON = 0b00000100;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR = 0b00000010;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR_BLINK = 0b00000001;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_DISPLAY = 0b00001000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_ON = 0b00000100;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR = 0b00000010;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR_BLINK = 0b00000001;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT = 0b00010000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_CURSOR = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_DISPLAY = 0b00001000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_LEFT = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_RIGHT = 0b00000100;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SHIFT = 0b00010000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SHIFT_CURSOR = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SHIFT_DISPLAY = 0b00001000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SHIFT_LEFT = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SHIFT_RIGHT = 0b00000100;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION = 0b00100000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_1LINE = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_2LINE = 0b00001000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_EXT_MODE = 0b00000100;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_STD_MODE = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_FUNCTION = 0b00100000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_1LINE = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_2LINE = 0b00001000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_EXT_MODE = 0b00000100;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_STD_MODE = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_EXT_FUNCTION_GFX = 0b00000010;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_EXT_FUNCTION_STD = 0b00000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_EXT_FUNCTION_GFX = 0b00000010;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_EXT_FUNCTION_STD = 0b00000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SET_CGRAM_ADDR = 0b01000000;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SET_DRAM_ADDR = 0b10000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SET_CGRAM_ADDR = 0b01000000;
+VR_EMU_LCD_DLLEXPORT const uint8_t LCD_CMD_SET_DRAM_ADDR = 0b10000000;
/* PRIVATE CONSTANTS
* ---------------------------------------- */
@@ -277,7 +277,7 @@ static void doShift(VrEmuLcd* lcd)
* rows: number of display rows (1, 2 or 4)
* rom: character rom to load
*/
-VR_LCD_EMU_DLLEXPORT VrEmuLcd* vrEmuLcdNew(int cols, int rows, vrEmuLcdCharacterRom rom)
+VR_EMU_LCD_DLLEXPORT VrEmuLcd* vrEmuLcdNew(int cols, int rows, vrEmuLcdCharacterRom rom)
{
int graphicsLCD = 0;
@@ -379,7 +379,7 @@ VR_LCD_EMU_DLLEXPORT VrEmuLcd* vrEmuLcdNew(int cols, int rows, vrEmuLcdCharacter
*
* lcd: lcd object to destroy / clean up
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdDestroy(VrEmuLcd* lcd)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdDestroy(VrEmuLcd* lcd)
{
if (lcd)
{
@@ -398,7 +398,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdDestroy(VrEmuLcd* lcd)
*
* command: the data (DB0 -> DB7) to send
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdSendCommand(VrEmuLcd* lcd, uint8_t command)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdSendCommand(VrEmuLcd* lcd, uint8_t command)
{
if (command & LCD_CMD_SET_DRAM_ADDR)
{
@@ -500,7 +500,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdSendCommand(VrEmuLcd* lcd, uint8_t command)
*
* data: the data (DB0 -> DB7) to send
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data)
{
if (lcd->cgPtr)
{
@@ -542,7 +542,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data)
*
* returns: the data (DB0 -> DB7) at the current address
*/
- VR_LCD_EMU_DLLEXPORT uint8_t vrEmuLcdReadByte(VrEmuLcd* lcd)
+ VR_EMU_LCD_DLLEXPORT uint8_t vrEmuLcdReadByte(VrEmuLcd* lcd)
{
uint8_t data = vrEmuLcdReadByteNoInc(lcd);
@@ -560,7 +560,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data)
*
* returns: the data (DB0 -> DB7) at the current address
*/
- VR_LCD_EMU_DLLEXPORT uint8_t vrEmuLcdReadByteNoInc(VrEmuLcd* lcd)
+ VR_EMU_LCD_DLLEXPORT uint8_t vrEmuLcdReadByteNoInc(VrEmuLcd* lcd)
{
uint8_t data = 0;
@@ -595,7 +595,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data)
*
* returns: the current address
*/
-VR_LCD_EMU_DLLEXPORT uint8_t vrEmuLcdReadAddress(VrEmuLcd* lcd)
+VR_EMU_LCD_DLLEXPORT uint8_t vrEmuLcdReadAddress(VrEmuLcd* lcd)
{
if (lcd->cgPtr)
{
@@ -616,7 +616,7 @@ VR_LCD_EMU_DLLEXPORT uint8_t vrEmuLcdReadAddress(VrEmuLcd* lcd)
*
* str: the string to write.
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteString(VrEmuLcd* lcd, const char* str)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdWriteString(VrEmuLcd* lcd, const char* str)
{
const char* ddPtr = str;
while (*ddPtr != '\0')
@@ -638,7 +638,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdWriteString(VrEmuLcd* lcd, const char* str)
* 0 - 15 cgram
* 16 - 255 rom
*/
-VR_LCD_EMU_DLLEXPORT const uint8_t* vrEmuLcdCharBits(VrEmuLcd* lcd, uint8_t c)
+VR_EMU_LCD_DLLEXPORT const uint8_t* vrEmuLcdCharBits(VrEmuLcd* lcd, uint8_t c)
{
if (lcd->gdRam) // graphic LCD?
{
@@ -674,7 +674,7 @@ VR_LCD_EMU_DLLEXPORT const uint8_t* vrEmuLcdCharBits(VrEmuLcd* lcd, uint8_t c)
*
* can be used to set the current cursor address
*/
-VR_LCD_EMU_DLLEXPORT int vrEmuLcdGetDataOffset(VrEmuLcd* lcd, int row, int col)
+VR_EMU_LCD_DLLEXPORT int vrEmuLcdGetDataOffset(VrEmuLcd* lcd, int row, int col)
{
// adjust for display scroll offset
if (row >= lcd->rows) row = lcd->rows - 1;
@@ -708,7 +708,7 @@ VR_LCD_EMU_DLLEXPORT int vrEmuLcdGetDataOffset(VrEmuLcd* lcd, int row, int col)
* updates the display's pixel data
* changes are only reflected in the pixel data when this function is called
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdUpdatePixels(VrEmuLcd* lcd)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdUpdatePixels(VrEmuLcd* lcd)
{
if (lcd->gdRam) // is a graphics LCD
{
@@ -872,7 +872,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdUpdatePixels(VrEmuLcd* lcd)
* ----------------------------------------
* get the number of pixels for the entire display
*/
-VR_LCD_EMU_DLLEXPORT void vrEmuLcdNumPixels(VrEmuLcd* lcd, int* cols, int* rows)
+VR_EMU_LCD_DLLEXPORT void vrEmuLcdNumPixels(VrEmuLcd* lcd, int* cols, int* rows)
{
if (cols)* cols = vrEmuLcdNumPixelsX(lcd);
if (rows)* rows = vrEmuLcdNumPixelsY(lcd);
@@ -883,7 +883,7 @@ VR_LCD_EMU_DLLEXPORT void vrEmuLcdNumPixels(VrEmuLcd* lcd, int* cols, int* rows)
* ----------------------------------------
* returns: number of horizontal pixels in the display
*/
-VR_LCD_EMU_DLLEXPORT int vrEmuLcdNumPixelsX(VrEmuLcd* lcd)
+VR_EMU_LCD_DLLEXPORT int vrEmuLcdNumPixelsX(VrEmuLcd* lcd)
{
return lcd->pixelsWidth;
}
@@ -893,7 +893,7 @@ VR_LCD_EMU_DLLEXPORT int vrEmuLcdNumPixelsX(VrEmuLcd* lcd)
* ----------------------------------------
* returns: number of vertical pixels in the display
*/
-VR_LCD_EMU_DLLEXPORT int vrEmuLcdNumPixelsY(VrEmuLcd* lcd)
+VR_EMU_LCD_DLLEXPORT int vrEmuLcdNumPixelsY(VrEmuLcd* lcd)
{
return lcd->pixelsHeight;
}
@@ -908,7 +908,7 @@ VR_LCD_EMU_DLLEXPORT int vrEmuLcdNumPixelsY(VrEmuLcd* lcd)
* 1 = pixel on
*
*/
-VR_LCD_EMU_DLLEXPORT char vrEmuLcdPixelState(VrEmuLcd* lcd, int x, int y)
+VR_EMU_LCD_DLLEXPORT char vrEmuLcdPixelState(VrEmuLcd* lcd, int x, int y)
{
int offset = y * lcd->pixelsWidth + x;
if (offset >= 0 && offset < lcd->numPixels)
diff --git a/src/vrEmuLcd.h b/src/vrEmuLcd.h
index 228c5f7..5497ece 100644
--- a/src/vrEmuLcd.h
+++ b/src/vrEmuLcd.h
@@ -12,21 +12,28 @@
#ifndef _VR_EMU_LCD_H_
#define _VR_EMU_LCD_H_
-#if VR_LCD_EMU_COMPILING_DLL
- #define VR_LCD_EMU_DLLEXPORT __declspec(dllexport)
-#elif VR_LCD_EMU_STATIC
- #ifdef __cplusplus
- #define VR_LCD_EMU_DLLEXPORT extern "C"
- #else
- #define VR_LCD_EMU_DLLEXPORT extern
- #endif
-#elif __EMSCRIPTEN__
- #include
- #define VR_LCD_EMU_DLLEXPORT EMSCRIPTEN_KEEPALIVE
+#ifdef __EMSCRIPTEN__
+ #include
+ #define VR_EMU_LCD_DLLEXPORT EMSCRIPTEN_KEEPALIVE
+ #define VR_EMU_LCD_DLLEXPORT_CONST extern
+#elif VR_EMU_LCD_COMPILING_DLL
+ #define VR_EMU_LCD_DLLEXPORT __declspec(dllexport)
+#elif defined WIN32 && !defined VR_EMU_LCD_STATIC
+ #define VR_EMU_LCD_DLLEXPORT __declspec(dllimport)
#else
- #define VR_LCD_EMU_DLLEXPORT __declspec(dllimport)
+ #define VR_EMU_LCD_STATIC 1
+ #ifdef __cplusplus
+ #define VR_EMU_LCD_DLLEXPORT extern "C"
+ #else
+ #define VR_EMU_LCD_DLLEXPORT extern
+ #endif
#endif
+#ifndef VR_EMU_LCD_DLLEXPORT_CONST
+#define VR_EMU_LCD_DLLEXPORT_CONST VR_EMU_LCD_DLLEXPORT
+#endif
+
+
#include
/* PRIVATE DATA STRUCTURE
@@ -36,31 +43,31 @@ typedef struct vrEmuLcd_s VrEmuLcd;
/* PUBLIC CONSTANTS
* ---------------------------------------- */
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_CLEAR;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_HOME;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_CLEAR;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_HOME;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_INCREMENT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_DECREMENT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_ENTRY_MODE_SHIFT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_ENTRY_MODE;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_ENTRY_MODE_INCREMENT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_ENTRY_MODE_DECREMENT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_ENTRY_MODE_SHIFT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_ON;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_DISPLAY_CURSOR_BLINK;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_DISPLAY;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_DISPLAY_ON;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_DISPLAY_CURSOR;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_DISPLAY_CURSOR_BLINK;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_CURSOR;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_DISPLAY;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_LEFT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SHIFT_RIGHT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SHIFT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SHIFT_CURSOR;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SHIFT_DISPLAY;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SHIFT_LEFT;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SHIFT_RIGHT;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_1LINE;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_FUNCTION_LCD_2LINE;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_FUNCTION;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_FUNCTION_LCD_1LINE;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_FUNCTION_LCD_2LINE;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SET_CGRAM_ADDR;
-VR_LCD_EMU_DLLEXPORT const uint8_t LCD_CMD_SET_DRAM_ADDR;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SET_CGRAM_ADDR;
+VR_EMU_LCD_DLLEXPORT_CONST const uint8_t LCD_CMD_SET_DRAM_ADDR;
typedef enum
{
@@ -79,7 +86,7 @@ typedef enum
* rows: number of display rows (1, 2 or 4)
* rom: character rom to load
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
VrEmuLcd* vrEmuLcdNew(int width, int height, vrEmuLcdCharacterRom rom);
/* Function: vrEmuLcdDestroy
@@ -88,7 +95,7 @@ VrEmuLcd* vrEmuLcdNew(int width, int height, vrEmuLcdCharacterRom rom);
*
* lcd: lcd object to destroy / clean up
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdDestroy(VrEmuLcd* lcd);
/* Function: vrEmuLcdSendCommand
@@ -97,7 +104,7 @@ void vrEmuLcdDestroy(VrEmuLcd* lcd);
*
* data: the data (DB0 -> DB7) to send
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdSendCommand(VrEmuLcd* lcd, uint8_t data);
@@ -107,7 +114,7 @@ void vrEmuLcdSendCommand(VrEmuLcd* lcd, uint8_t data);
*
* data: the data (DB0 -> DB7) to send
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data);
/* Function: vrEmuLcdWriteString
@@ -117,7 +124,7 @@ void vrEmuLcdWriteByte(VrEmuLcd* lcd, uint8_t data);
*
* str: the string to write.
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdWriteString(VrEmuLcd* lcd, const char *str);
@@ -128,7 +135,7 @@ void vrEmuLcdWriteString(VrEmuLcd* lcd, const char *str);
*
* can be used to set the current cursor address
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
int vrEmuLcdGetDataOffset(VrEmuLcd* lcd, int row, int col);
/* Function: vrEmuLcdReadByte
@@ -137,7 +144,7 @@ int vrEmuLcdGetDataOffset(VrEmuLcd* lcd, int row, int col);
*
* returns: the data (DB0 -> DB7) at the current address
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
uint8_t vrEmuLcdReadByte(VrEmuLcd* lcd);
/* Function: vrEmuLcdReadByteNoInc
@@ -147,7 +154,7 @@ uint8_t vrEmuLcdReadByte(VrEmuLcd* lcd);
*
* returns: the data (DB0 -> DB7) at the current address
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
uint8_t vrEmuLcdReadByteNoInc(VrEmuLcd* lcd);
/* Function: vrEmuLcdReadAddress
@@ -156,7 +163,7 @@ uint8_t vrEmuLcdReadByteNoInc(VrEmuLcd* lcd);
*
* returns: the current address offset (either CGRAM or DDRAM)
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
uint8_t vrEmuLcdReadAddress(VrEmuLcd* lcd);
@@ -171,7 +178,7 @@ uint8_t vrEmuLcdReadAddress(VrEmuLcd* lcd);
* 0 - 15 cgram
* 16 - 255 rom
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
const uint8_t *vrEmuLcdCharBits(VrEmuLcd* lcd, uint8_t c);
/* Function: vrEmuLcdUpdatePixels
@@ -179,28 +186,28 @@ const uint8_t *vrEmuLcdCharBits(VrEmuLcd* lcd, uint8_t c);
* updates the display's pixel data
* changes are only reflected in the pixel data when this function is called
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdUpdatePixels(VrEmuLcd* lcd);
/* Function: vrEmuLcdNumPixels
* ----------------------------------------
* get the size of the entire display in pixels (including unused border pixels)
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
void vrEmuLcdNumPixels(VrEmuLcd *lcd, int* width, int* height);
/* Function: vrEmuLcdNumPixelsX
* ----------------------------------------
* returns: number of horizontal pixels in the display
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
int vrEmuLcdNumPixelsX(VrEmuLcd *lcd);
/* Function: vrEmuLcdNumPixelsY
* ----------------------------------------
* returns: number of vertical pixels in the display
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
int vrEmuLcdNumPixelsY(VrEmuLcd *lcd);
/* Function: charvrEmuLcdPixelState
@@ -212,7 +219,7 @@ int vrEmuLcdNumPixelsY(VrEmuLcd *lcd);
* 1 = pixel on
*
*/
-VR_LCD_EMU_DLLEXPORT
+VR_EMU_LCD_DLLEXPORT
char vrEmuLcdPixelState(VrEmuLcd *lcd, int x, int y);
#endif // _VR_EMU_LCD_H_
\ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..8df13d4
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,9 @@
+enable_testing()
+
+add_executable (vrEmuLcdTest vrEmuLcdTest.c)
+
+target_link_libraries(vrEmuLcdTest vrEmuLcd)
+
+set(TEST_RUNNER ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}vrEmuLcdTest)
+
+add_test(lcd_hello_world ${TEST_RUNNER})
\ No newline at end of file
diff --git a/test/vrEmuLcdTest.c b/test/vrEmuLcdTest.c
new file mode 100644
index 0000000..bfbe405
--- /dev/null
+++ b/test/vrEmuLcdTest.c
@@ -0,0 +1,42 @@
+#include "vrEmuLcd.h"
+#include
+
+#define LCD_WIDTH 16
+#define LCD_HEIGHT 2
+
+int main()
+{
+ VrEmuLcd *lcd = vrEmuLcdNew(LCD_WIDTH, LCD_HEIGHT, EmuLcdRomA00);
+
+ // send it commands:
+ vrEmuLcdSendCommand(lcd, LCD_CMD_FUNCTION | LCD_CMD_FUNCTION_LCD_2LINE | 0x10);
+ vrEmuLcdSendCommand(lcd, LCD_CMD_CLEAR);
+ vrEmuLcdSendCommand(lcd, LCD_CMD_HOME);
+ vrEmuLcdSendCommand(lcd, LCD_CMD_DISPLAY | LCD_CMD_DISPLAY_ON);
+
+ // send it data
+ vrEmuLcdWriteByte(lcd, 'H');
+ vrEmuLcdWriteByte(lcd, 'e');
+ vrEmuLcdWriteByte(lcd, 'l');
+ vrEmuLcdWriteByte(lcd, 'l');
+ vrEmuLcdWriteByte(lcd, 'o');
+
+ // or cheat
+ vrEmuLcdWriteString(lcd, " world!");
+
+ // then periodically, render it.
+ vrEmuLcdUpdatePixels(lcd); // generates a snapshot of the pixels state
+
+ for (int y = 0; y < vrEmuLcdNumPixelsY(lcd); ++y) {
+ for (int x = 0; x < vrEmuLcdNumPixelsX(lcd); ++x) {
+
+ // do whatever you like with the pixel information. render it to a texture, output it to a console, whatever
+ // values returned are: -1 = no pixel (character borders), 0 = pixel off, 1 = pixel on
+ char pixel = vrEmuLcdPixelState(lcd, x, y);
+ printf("%c", (pixel<0)?' ':(pixel==0?'.':'#'));
+ }
+ printf("\n");
+ }
+
+ vrEmuLcdDestroy(lcd);
+}