diff --git a/meson.build b/meson.build index be8efd89..588038f2 100644 --- a/meson.build +++ b/meson.build @@ -106,7 +106,8 @@ stm32f405_def = {'STM32F40_41xxx': '', 'HSE_VALUE':'8000000'} ## ## Linux -linux_src = src + ['platform/drivers/display/display_libSDL.c', +linux_src = src + ['platform/targets/linux/emulator/emulator.c', + 'platform/drivers/display/display_libSDL.c', 'platform/drivers/keyboard/keyboard_linux.c', 'platform/mcu/x86_64/drivers/gpio.c', 'platform/mcu/x86_64/drivers/delays.c', @@ -121,7 +122,8 @@ linux_def = def + {'SCREEN_WIDTH': '160', 'SCREEN_HEIGHT': '128', 'PIX_FMT_RGB56 linux_inc = inc + ['rtos/uC-OS3/Ports/POSIX', 'rtos/uC-CPU/Posix', - 'platform/targets/linux'] + 'platform/targets/linux', + 'platform/targets/linux/emulator'] if not meson.is_cross_build() sdl_dep = dependency('SDL2') @@ -171,7 +173,7 @@ mduv380_def = def + stm32f405_def ## Compilation defines ## linux_c_args = [] -linux_l_args = ['--entry=systemBootstrap'] +linux_l_args = ['--entry=entry'] # Add AddressSanitizer if required if get_option('asan') diff --git a/platform/targets/linux/emulator/assets/retevis.png b/platform/targets/linux/emulator/assets/retevis.png new file mode 100644 index 00000000..ef822f6b Binary files /dev/null and b/platform/targets/linux/emulator/assets/retevis.png differ diff --git a/platform/targets/linux/emulator/emulator.c b/platform/targets/linux/emulator/emulator.c new file mode 100644 index 00000000..ae486297 --- /dev/null +++ b/platform/targets/linux/emulator/emulator.c @@ -0,0 +1,152 @@ +/*************************************************************************** + * Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN * + * Frederik Saraci IU2NRO * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + + +#include "emulator.h" +#include +#include +#include +#include + +void systemBootstrap(); + +int CLIMenu() { + int choice = 0; + printf("Select the value to change:\n"); + printf("1 -> RSSI\n"); + printf("2 -> Vbat\n"); + printf("3 -> Mic Level\n"); + printf("4 -> Volume Level\n"); + printf("5 -> Channel selector\n"); + printf("6 -> Toggle PTT\n"); + printf("7 -> Print current state\n"); + printf("8 -> Exit\n"); + printf("> "); + do { + scanf("%d", &choice); + } while (choice < 1 || choice > 7); + printf("\e[1;1H\e[2J"); + return choice; +} + +void *updateValue(float *curr_value) { + printf("Current value: %f\n", *curr_value); + printf("New value: \n"); + scanf("%f", curr_value); +} + +void *printState() { + printf("\nCurrent state\n"); + printf("RSSI : %f\n", Radio_State.RSSI); + printf("Battery: %f\n", Radio_State.Vbat); + printf("Mic : %f\n", Radio_State.micLevel); + printf("Volume : %f\n", Radio_State.volumeLevel); + printf("Channel: %f\n", Radio_State.chSelector); + printf("PTT : %s\n\n", Radio_State.PttStatus ? "true" : "false"); + +} + +void *startRadio() { + systemBootstrap(); +} +//void *startGUI(); + +void *startCLIMenu() { + int choice; + do { + choice = CLIMenu(); + switch (choice) { + case VAL_RSSI: + updateValue(&Radio_State.RSSI); + break; + case VAL_BAT: + updateValue(&Radio_State.Vbat); + break; + case VAL_MIC: + updateValue(&Radio_State.micLevel); + break; + case VAL_VOL: + updateValue(&Radio_State.volumeLevel); + break; + case VAL_CH: + updateValue(&Radio_State.chSelector); + break; + case VAL_PTT: + Radio_State.PttStatus = Radio_State.PttStatus ? false : true; + break; + case PRINT_STATE: + printState(); + break; + default: + continue; + } + } while (choice != EXIT); + printf("exiting\n"); + SDL_Quit(); + SDL_DestroyWindow(window); + exit(0); +}; + + +int emulator_main() { + Radio_State = (radio_state){12, 7, 3, 4, 1, false}; + + pthread_t gui_thread, cli_thread, radio_thread; + int err1, err2; + + err1 = pthread_create(&cli_thread, NULL, startCLIMenu, NULL); + //err2 = pthread_create(&gui_thread, NULL, startGUI, NULL); + + if (err1) { + printf("An error occurred starting the threads: %d, %d\n", err1, err2); + return 1; + } + //pthread_join(gui_thread, NULL); + pthread_create(&radio_thread, NULL, startRadio, NULL); + pthread_join(cli_thread, NULL); + + + printf("73\n"); + return 0; +} + + +void *entry() { + __asm__( + "xorl %ebp, %ebp\n\t" + "mov %RDX, %R9\n\t" + + #ifdef __ILP32__ + "mov (%rsp), %esi\n\t" + "add $4, %esp\n\t" + #else + "popq %rsi\n\t" + #endif + "mov %RSP, %RDX\n\t" + "and $~15, %RSP\n\t" + "pushq %rax\n\t" + "pushq %rsp\n\t" + "mov __libc_csu_fini@GOTPCREL(%rip), %R8\n\t" + "mov __libc_csu_init@GOTPCREL(%rip), %RCX\n\t" + "mov emulator_main@GOTPCREL(%rip), %RDI\n\t" + "call *__libc_start_main@GOTPCREL(%rip)\n\t" + "hlt\n\t"); +} + diff --git a/platform/targets/linux/emulator/emulator.h b/platform/targets/linux/emulator/emulator.h new file mode 100644 index 00000000..f50e175b --- /dev/null +++ b/platform/targets/linux/emulator/emulator.h @@ -0,0 +1,59 @@ +/*************************************************************************** + * Copyright (C) 2020 by Federico Amedeo Izzo IU2NUO, * + * Niccolò Izzo IU2KIN * + * Frederik Saraci IU2NRO * + * Silvano Seva IU2KWO * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see * + ***************************************************************************/ + +#include +#include +#include +#include + +#ifndef SCREEN_WIDTH +#define SCREEN_WIDTH 160 +#endif + +#ifndef SCREEN_HEIGHT +#define SCREEN_HEIGHT 128 +#endif + + +SDL_Renderer *renderer; /* SDL renderer */ +SDL_Window *window; /* SDL window */ +SDL_Texture *displayTexture; /* SDL rendering surface */ + +enum choices { + VAL_RSSI=1, + VAL_BAT, + VAL_MIC, + VAL_VOL, + VAL_CH, + VAL_PTT, + PRINT_STATE, + EXIT +}; + +typedef struct { + float RSSI; + float Vbat; + float micLevel; + float volumeLevel; + float chSelector; + bool PttStatus; +} radio_state; + +radio_state Radio_State; diff --git a/platform/targets/linux/platform.c b/platform/targets/linux/platform.c index cc6af635..534c2840 100644 --- a/platform/targets/linux/platform.c +++ b/platform/targets/linux/platform.c @@ -18,10 +18,11 @@ #include "platform.h" #include "gpio.h" #include +#include "emulator.h" void platform_init() { - printf("Platform init\n"); + //printf("Platform init\n"); } void platform_terminate() @@ -31,36 +32,32 @@ void platform_terminate() void platform_setBacklightLevel(uint8_t level) { - printf("platform_setBacklightLevel(%u)\n", level); + //printf("platform_setBacklightLevel(%u)\n", level); } // Simulate a fully charged lithium battery float platform_getVbat(){ - return 7.8; + return Radio_State.Vbat; } float platform_getMicLevel(){ - printf("platform_getMicLevel()\n"); - return 0.69; + return Radio_State.micLevel; } float platform_getVolumeLevel(){ - printf("platform_getVolumeLevel()\n"); - return 0.69; + return Radio_State.volumeLevel; } uint8_t platform_getChSelector(){ - printf("platform_getChSelector()\n"); - return 42; + return Radio_State.chSelector; } bool platform_getPttStatus(){ - printf("platform_getVbat()\n"); - return true; + return Radio_State.PttStatus; }