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