From 5644b289fe6fb9561ede6b58e64ac25d6c2f0553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 16 Jun 2021 10:17:03 +0200 Subject: [PATCH] feat: add option to run on x86 computer with sdl --- image-viewer/Makefile | 14 ++++++- image-viewer/include/xwin_sdl.h | 14 +++++++ image-viewer/src/display_utils.c | 26 +++++++++++- image-viewer/src/input.c | 9 ++++ image-viewer/src/main.c | 6 ++- image-viewer/src/mzapo_phys.c | 4 ++ image-viewer/src/xwin_sdl.c | 71 ++++++++++++++++++++++++++++++++ 7 files changed, 139 insertions(+), 5 deletions(-) create mode 100644 image-viewer/include/xwin_sdl.h create mode 100644 image-viewer/src/xwin_sdl.c diff --git a/image-viewer/Makefile b/image-viewer/Makefile index 4726eec..437f1a1 100644 --- a/image-viewer/Makefile +++ b/image-viewer/Makefile @@ -3,13 +3,23 @@ OBJ_DIR=./obj BIN_DIR?=./bin INC_DIR=./include $(INHERIT_INCLUDES) -CC = arm-linux-gnueabihf-gcc -CXX = arm-linux-gnueabihf-g++ +ifdef COMPUTER + CC = clang +else + CC = arm-linux-gnueabihf-gcc + CXX = arm-linux-gnueabihf-g++ +endif CPPFLAGS = -I . CFLAGS =-g -std=gnu99 -O1 -Wall CXXFLAGS = -g -std=gnu++11 -O1 -Wall + +ifdef COMPUTER +LDFLAGS = -lrt -lpthread -lmagic -ljpeg -lpng $(shell sdl2-config --libs) -lSDL2_image +CFLAGS += -DCOMPUTER $(shell sdl2-config --cflags) +else LDFLAGS = -lrt -lpthread -l :libmagic.so.1 -l :libjpeg.so.62 -l :libz.so -l :libpng16.so.16 +endif NAME=image-viewer BINARY=$(BIN_DIR)/$(NAME) diff --git a/image-viewer/include/xwin_sdl.h b/image-viewer/include/xwin_sdl.h new file mode 100644 index 0000000..a0bec28 --- /dev/null +++ b/image-viewer/include/xwin_sdl.h @@ -0,0 +1,14 @@ +#ifndef __XWIN_SDL_H__ +#define __XWIN_SDL_H__ + +#include +#include +#include + +int xwin_init(uint16_t w, uint16_t h); +void xwin_close(); +void xwin_redraw(uint16_t w, uint16_t h, uint8_t *img); +bool xwin_poll_event(SDL_Event *event); +void xwin_save_image(char *output_name); + +#endif diff --git a/image-viewer/src/display_utils.c b/image-viewer/src/display_utils.c index e8895e8..321704b 100644 --- a/image-viewer/src/display_utils.c +++ b/image-viewer/src/display_utils.c @@ -2,6 +2,9 @@ #include "mzapo_parlcd.h" #include +#ifdef COMPUTER +#include "xwin_sdl.h" +#endif const display_pixel_t BLACK_PIXEL = {.bits = 0}; const display_pixel_t WHITE_PIXEL = {.bits = 0xFFFF}; @@ -9,6 +12,12 @@ 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}; +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; +} + display_pixel_t raw_pixel_onebit_convert_to_display(raw_pixel_onebit_t pixel, raw_pixel_onebit_t max) { display_pixel_t new = { @@ -44,13 +53,28 @@ display_t display_init(display_data_t data) { display_clear(&display); } + #ifdef COMPUTER + xwin_init(DISPLAY_WIDTH, DISPLAY_HEIGHT); + #endif return display; } void display_deinit(display_t *display) { - display_clear(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; } diff --git a/image-viewer/src/input.c b/image-viewer/src/input.c index 28ffc15..d6ade66 100644 --- a/image-viewer/src/input.c +++ b/image-viewer/src/input.c @@ -89,6 +89,15 @@ int16_t commands_execute(commands_t * commands, input_type_t type, char filter, } void commands_update_rotation_encoders(rotation_encoders_t *encoders) { + if (encoders->base_address == NULL) { + for (int i = 0; i < ROTATION_ENCODERS_COUNT; i++) { + encoders->encoders_state[i].absolute = 0; + encoders->encoders_state[i].delta = 0; + encoders->encoders_state[i].button = false; + encoders->encoders_state[i].button_prev = false; + } + return; + } uint8_t btns = *(volatile uint8_t*)(encoders->base_address + ROTATION_ENCODERS_COUNT); for (int i = 0; i < ROTATION_ENCODERS_COUNT; i++) { diff --git a/image-viewer/src/main.c b/image-viewer/src/main.c index b38cc22..e8d1545 100644 --- a/image-viewer/src/main.c +++ b/image-viewer/src/main.c @@ -52,8 +52,10 @@ int main(int argc, char *argv[]) }; void *reg_knobs_base = - map_phys_address(SPILED_REG_BASE_PHYS, SPILED_REG_SIZE, 0) + - SPILED_REG_KNOBS_8BIT_o; + map_phys_address(SPILED_REG_BASE_PHYS, SPILED_REG_SIZE, 0); + if (reg_knobs_base != NULL) { + reg_knobs_base += SPILED_REG_KNOBS_8BIT_o; + } logger_debug(&logger, __FILE__, __FUNCTION__, __LINE__, "Initializing display...", argv[1]); diff --git a/image-viewer/src/mzapo_phys.c b/image-viewer/src/mzapo_phys.c index 4553f56..48109e1 100644 --- a/image-viewer/src/mzapo_phys.c +++ b/image-viewer/src/mzapo_phys.c @@ -27,6 +27,9 @@ 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; + #else unsigned long mem_window_size; unsigned long pagesize; unsigned char *mm; @@ -53,4 +56,5 @@ void *map_phys_address(off_t region_base, size_t region_size, int opt_cached) } return (void *)mem; + #endif } diff --git a/image-viewer/src/xwin_sdl.c b/image-viewer/src/xwin_sdl.c new file mode 100644 index 0000000..2e2b54c --- /dev/null +++ b/image-viewer/src/xwin_sdl.c @@ -0,0 +1,71 @@ +/* + * File name: xwin_sdl.c + * Date: 2015/06/18 14:37 + * Author: Jan Faigl + */ + +#include + +#include +#include + +#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 */ -- 2.48.1