M Makefile => Makefile +11 -3
  
@@ 25,11 25,15 @@ LIB_PHERIPHERALS=$(BIN_DIR)/libmzapo-pheripherals.so
 LIB_GUI=$(BIN_DIR)/libmzapo-gui.so
 TEXT_VIEWER=$(BIN_DIR)/text-viewer
 FILE_BROWSER=$(BIN_DIR)/file-browser
+MZAPO_SDL=$(BIN_DIR)/libmzapo_sdl.so
 
 ifdef COMPUTER
 DEPENDENCIES=./.computer
+COMPUTER_SDL=mzapo-sdl
+INHERIT_INCLUDES += -I$(ROOT_DIR)/mzapo-sdl/include
 else
 DEPENDENCIES=./.arm
+COMPUTER_SDL=
 endif
 
 all: $(DEPENDENCIES) image-viewer text-viewer file-browser
@@ 39,14 43,15 @@ lib-pheripherals: $(LIB_PHERIPHERALS)
 lib-gui: $(LIB_GUI)
 text-viewer: $(TEXT_VIEWER)
 file-browser: $(FILE_BROWSER)
+mzapo-sdl: $(MZAPO_SDL)
 
-$(IMAGE_VIEWER): $(DEPENDENCIES) lib-pheripherals FORCE
+$(IMAGE_VIEWER): $(DEPENDENCIES) lib-pheripherals $(COMPUTER_SDL) FORCE
 	@make -C image-viewer
 
-$(TEXT_VIEWER): $(DEPENDENCIES) lib-pheripherals lib-gui FORCE
+$(TEXT_VIEWER): $(DEPENDENCIES) lib-pheripherals lib-gui $(COMPUTER_SDL) FORCE
 	@make -C text-viewer
 
-$(FILE_BROWSER): $(DEPENDENCIES) lib-pheripherals lib-gui FORCE
+$(FILE_BROWSER): $(DEPENDENCIES) lib-pheripherals lib-gui $(COMPUTER_SDL) FORCE
 	@make -C file-browser
 
 $(DEPENDENCIES):
@@ 59,6 64,9 @@ $(LIB_PHERIPHERALS): $(DEPENDENCIES) FORCE
 $(LIB_GUI): $(DEPENDENCIES) FORCE
 	@make -C lib-gui
 
+$(MZAPO_SDL): FORCE
+	@make -C mzapo-sdl
+
 copy-executable: all
 	ssh $(SSH_OPTIONS) -t $(TARGET_USER)@$(TARGET_IP) killall gdbserver 1>/dev/null 2>/dev/null || true
 	ssh $(SSH_OPTIONS) $(TARGET_USER)@$(TARGET_IP) mkdir -p $(TARGET_DIR)
 
M file-browser/Makefile => file-browser/Makefile +1 -1
  
@@ 16,7 16,7 @@ CFLAGS =-g -std=gnu99 -O1 -Wall -D ILI9481
 CXXFLAGS = -g -std=gnu++11 -O1 -Wall
 
 ifdef COMPUTER
-LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -lmagic $(shell sdl2-config --libs) -lSDL2_image
+LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -lmagic $(shell sdl2-config --libs) -lSDL2_image -lmzapo_sdl
 CFLAGS += -DCOMPUTER $(shell sdl2-config --cflags)
 else
 LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -l :libmagic.so.1
 
M image-viewer/Makefile => image-viewer/Makefile +1 -1
  
@@ 16,7 16,7 @@ CFLAGS =-g -std=gnu99 -O1 -Wall -D ILI9481
 CXXFLAGS = -g -std=gnu++11 -O1 -Wall
 
 ifdef COMPUTER
-LDFLAGS = -lmzapo-pheripherals -lmagic -ljpeg -lpng $(shell sdl2-config --libs) -lSDL2_image
+LDFLAGS = -lmzapo-pheripherals -lmagic -ljpeg -lpng $(shell sdl2-config --libs) -lSDL2_image -lmzapo_sdl
 CFLAGS += -DCOMPUTER $(shell sdl2-config --cflags)
 else
 LDFLAGS = -lmzapo-pheripherals -l :libmagic.so.1 -l :libjpeg.so.62 -l :libz.so -l :libpng16.so.16
 
M image-viewer/src/main.c => image-viewer/src/main.c +12 -0
  
@@ 24,6 24,10 @@
 #include "serialize_lock.h"
 #include "mzapo_rgb_led.h"
 
+#ifdef COMPUTER
+#include "mzapo_sdl.h"
+#endif
+
 typedef enum {
   SUCCESS,
   TOO_FEW_ARGUMENTS,
@@ 32,6 36,10 @@ typedef enum {
 
 int main(int argc, char *argv[])
 {
+#ifdef COMPUTER
+  mzapo_sdl_init();
+#endif
+
   /* Try to acquire lock the first */
   if (serialize_lock(1) <= 0) {
     printf("System is occupied\n");
@@ 107,5 115,9 @@ int main(int argc, char *argv[])
               argv[1]);
 
   ledstrip_clear(&ledstrip);
+
+#ifdef COMPUTER
+  mzapo_sdl_deinit();
+#endif
   return SUCCESS;
 }
 
D lib-pheripherals/include/xwin_sdl.h => lib-pheripherals/include/xwin_sdl.h +0 -48
  
@@ 1,48 0,0 @@
-#ifndef __XWIN_SDL_H__
-#define __XWIN_SDL_H__
-
-#include <SDL.h>
-#include <stdbool.h>
-#include <stdint.h>
-
-/**
- * @brief Init SDL window
- *
- * @param w width
- * @param h height
- * @return int
- */
-int xwin_init(uint16_t w, uint16_t h);
-
-/**
- * @brief Close SDL window
- *
- */
-void xwin_close();
-
-/**
- * @brief Redraw SDL window with img data in format rgb888 stacked together
- *
- * @param w width of img
- * @param h height of img
- * @param img data with rgb888 stacked together
- */
-void xwin_redraw(uint16_t w, uint16_t h, uint8_t *img);
-
-/**
- * @brief Poll event to show OS window is responsive
- *
- * @param event
- * @return true event was polled
- * @return false no event found
- */
-bool xwin_poll_event(SDL_Event *event);
-
-/**
- * @brief Save image of the window to file
- *
- * @param output_name where to save the image
- */
-void xwin_save_image(char *output_name);
-
-#endif
 
M lib-pheripherals/src/display_utils.c => lib-pheripherals/src/display_utils.c +1 -30
  
@@ 2,10 2,6 @@
 #include "mzapo_parlcd.h"
 #include <stdlib.h>
 
-#ifdef COMPUTER
-#include "xwin_sdl.h"
-#endif
-
 const display_pixel_t BLACK_PIXEL = {.bits = 0};
 const display_pixel_t WHITE_PIXEL = {.bits = 0xFFFF};
 
@@ 13,14 9,6 @@ const raw_pixel_t DISPLAY_PIXEL_MAX = {.red = (uint16_t)DISPLAY_MAX_RED,
                                        .green = (uint16_t)DISPLAY_MAX_GREEN,
                                        .blue = (uint16_t)DISPLAY_MAX_BLUE};
 
-#ifdef COMPUTER
-static void display_pixel_to_rgb(display_pixel_t pixel, uint8_t *target) {
-  *(target++) = ((float)pixel.fields.r / DISPLAY_MAX_RED) * 255;
-  *(target++) = ((float)pixel.fields.g / DISPLAY_MAX_GREEN) * 255;
-  *(target++) = ((float)pixel.fields.b / DISPLAY_MAX_BLUE) * 255;
-}
-#endif
-
 display_pixel_t raw_pixel_onebit_convert_to_display(raw_pixel_onebit_t pixel,
                                                     raw_pixel_onebit_t max) {
   display_pixel_t new = {
@@ 52,33 40,17 @@ display_t display_init(display_data_t data) {
   };
 
   if (data.base_address != NULL) {
-    parlcd_hx8357_init(data.base_address);
+    //parlcd_hx8357_init(data.base_address);
     display_clear(&display, true);
   }
 
-  #ifdef COMPUTER
-  xwin_init(DISPLAY_WIDTH, DISPLAY_HEIGHT);
-  #endif
-
   return display;
 }
 void display_deinit(display_t *display) {
-#ifdef COMPUTER
-  xwin_close();
-#else
   display_clear(display, true);
-#endif
 }
 
 void display_render(display_t *display) {
-  #ifdef COMPUTER
-  uint8_t data[DISPLAY_WIDTH * DISPLAY_HEIGHT * 3];
-  for (int i = 0; i < DISPLAY_WIDTH * DISPLAY_HEIGHT; i++) {
-    display_pixel_to_rgb(display->pixels[i], data + i * 3);
-  }
-
-  xwin_redraw(DISPLAY_WIDTH, DISPLAY_HEIGHT, data);
-#else
   if (display->data.base_address == NULL) {
     return;
   }
@@ 88,7 60,6 @@ void display_render(display_t *display) {
   for (int i = 0; i < count; i++) {
     parlcd_write_data(display->data.base_address, display->pixels[i].bits);
   }
-  #endif
 }
 
 void display_clear(display_t *display, bool render) {
 
M lib-pheripherals/src/mzapo_parlcd.c => lib-pheripherals/src/mzapo_parlcd.c +18 -2
  
@@ 23,24 23,40 @@
 #include "mzapo_parlcd.h"
 #include "mzapo_regs.h"
 
+#ifdef COMPUTER
+#include "mzapo_sdl.h"
+#endif
+
 void parlcd_write_cr(unsigned char *parlcd_mem_base, uint16_t data)
 {
-  *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CR_o) = data;
+#ifndef COMPUTER
+  *(volatile uint16_t *)(parlcd_mem_base + PARLCD_REG_CR_o) = data;
+#endif
 }
 
 void parlcd_write_cmd(unsigned char *parlcd_mem_base, uint16_t cmd)
 {
-  *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_CMD_o) = cmd;
+#ifdef COMPUTER
+  ((mzapo_sdl_display*)(parlcd_mem_base))->cmd(cmd);
+#else
+  *(volatile uint16_t *)(parlcd_mem_base + PARLCD_REG_CMD_o) = cmd;
+#endif
 }
 
 void parlcd_write_data(unsigned char *parlcd_mem_base, uint16_t data)
 {
+#ifdef COMPUTER
+  ((mzapo_sdl_display *)(parlcd_mem_base))->data(data);
+#else
   *(volatile uint16_t*)(parlcd_mem_base + PARLCD_REG_DATA_o) = data;
+#endif
 }
 
 void parlcd_write_data2x(unsigned char *parlcd_mem_base, uint32_t data)
 {
+#ifndef COMPUTER
   *(volatile uint32_t*)(parlcd_mem_base + PARLCD_REG_DATA_o) = data;
+#endif
 }
 
 void parlcd_delay(int msec)
 
M lib-pheripherals/src/mzapo_phys.c => lib-pheripherals/src/mzapo_phys.c +5 -1
  
@@ 23,12 23,16 @@
 
 #include "mzapo_phys.h"
 
+#ifdef COMPUTER
+#include "mzapo_sdl.h"
+#endif
+
 const char *map_phys_memdev="/dev/mem";
 
 void *map_phys_address(off_t region_base, size_t region_size, int opt_cached)
 {
   #ifdef COMPUTER
-  return NULL;
+  return mzapo_sdl_map_phys(region_base, region_size);
   #else
   unsigned long mem_window_size;
   unsigned long pagesize;
 
M lib-pheripherals/src/mzapo_rgb_led.c => lib-pheripherals/src/mzapo_rgb_led.c +0 -2
  
@@ 60,8 60,6 @@ void rgb_led_update(mzapo_rgb_led_t *rgb_led) {
       struct timespec set_time = rgb_led->states[i].set_time;
       uint32_t diff = (((now.tv_sec - set_time.tv_sec) * 1000) +
                        (now.tv_nsec - set_time.tv_nsec) / 1000000);
-      printf("%u\r\n", diff);
-
       if (diff >= rgb_led->states[i].timeout_ms) {
         rgb_led->states[i].timeout_ms = 0;
         rgb_led_clear(rgb_led, i);
 
D lib-pheripherals/src/xwin_sdl.c => lib-pheripherals/src/xwin_sdl.c +0 -68
  
@@ 1,68 0,0 @@
-#ifdef COMPUTER
-#include <assert.h>
-
-#include <SDL.h>
-#include <SDL_image.h>
-
-#include "SDL_surface.h"
-#include "SDL_video.h"
-#include "xwin_sdl.h"
-
-static SDL_Window *win = NULL;
-
-int xwin_init(uint16_t w, uint16_t h) {
-  int r = 0;
-  r = SDL_Init(SDL_INIT_VIDEO);
-  assert(win == NULL);
-  win = SDL_CreateWindow("APO Test program", SDL_WINDOWPOS_UNDEFINED,
-                         SDL_WINDOWPOS_UNDEFINED, w, h, SDL_WINDOW_SHOWN);
-  assert(win != NULL);
-  SDL_SetWindowTitle(win, "APO Test program");
-  SDL_Surface *surface = SDL_CreateRGBSurface(
-                         32, 32, 24, 32 * 3, 0xff, 0xff00, 0xff0000, 0x0000);
-  SDL_SetWindowIcon(win, surface);
-  SDL_FreeSurface(surface);
-
-  SDL_SetWindowResizable(win, SDL_FALSE);
-  return r;
-}
-
-void xwin_close() {
-  assert(win != NULL);
-  SDL_DestroyWindow(win);
-  SDL_Quit();
-}
-
-void xwin_redraw(uint16_t w, uint16_t h, uint8_t *img) {
-  assert(img && win);
-  SDL_Surface *scr = SDL_GetWindowSurface(win);
-
-  for (int y = 0; y < scr->h && y < h; ++y) {
-    for (int x = 0; x < scr->w && x < w; ++x) {
-      const int idx = (y * scr->w + x) * scr->format->BytesPerPixel;
-      Uint8 *px = (Uint8 *)scr->pixels + idx;
-      uint64_t position_in_img = (y * w + x) * 3;
-      *(px + scr->format->Rshift / 8) = *(img + position_in_img);
-      *(px + scr->format->Gshift / 8) = *(img + position_in_img + 1);
-      *(px + scr->format->Bshift / 8) = *(img + position_in_img + 2);
-    }
-  }
-  SDL_UpdateWindowSurface(win);
-  SDL_FreeSurface(scr);
-}
-
-void xwin_save_image(char *output_name) {
-  IMG_Init(IMG_INIT_PNG);
-  SDL_Surface *scr = SDL_GetWindowSurface(win);
-  IMG_SavePNG(scr, output_name);
-  SDL_FreeSurface(scr);
-  IMG_Quit();
-}
-
-bool xwin_poll_event(SDL_Event *event) {
-  return SDL_PollEvent(event);
-}
-
-/* end of xwin_sdl.c */
-
-#endif
 
M text-viewer/Makefile => text-viewer/Makefile +1 -1
  
@@ 16,7 16,7 @@ CFLAGS =-g -std=gnu99 -O1 -Wall -D ILI9481
 CXXFLAGS = -g -std=gnu++11 -O1 -Wall
 
 ifdef COMPUTER
-LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -lmagic -ljpeg -lpng $(shell sdl2-config --libs) -lSDL2_image
+LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -lmagic -ljpeg -lpng $(shell sdl2-config --libs) -lSDL2_image -lmzapo_sdl
 CFLAGS += -DCOMPUTER $(shell sdl2-config --cflags)
 else
 LDFLAGS = -lmzapo-pheripherals -lmzapo-gui -l :libmagic.so.1 -l :libjpeg.so.62 -l :libz.so -l :libpng16.so.16
 
M text-viewer/src/main.c => text-viewer/src/main.c +10 -0
  
@@ 10,6 10,10 @@
 #include "mzapo_pheripherals.h"
 #include "text_viewer.h"
 
+#ifdef COMPUTER
+#include "mzapo_sdl.h"
+#endif
+
 typedef enum {
   ERROR_SUCCESS,
   ERROR_NOT_ENOUGH_ARGUMENTS,
@@ 18,6 22,9 @@ typedef enum {
 } error_t;
 
 int main(int argc, char *argv[]) {
+  #ifdef COMPUTER
+  mzapo_sdl_init();
+  #endif
   struct termios oldstdin;
 
   logger_t logger =
@@ 89,5 96,8 @@ int main(int argc, char *argv[]) {
   logger_info(&logger, __FILE__, __FUNCTION__, __LINE__,
               "Application quit");
 
+#ifdef COMPUTER
+  mzapo_sdl_deinit();
+#endif
   return ERROR_SUCCESS;
 }