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); +}