From ed444afee3a53a2a946e1841fa5b3b76116f8434 Mon Sep 17 00:00:00 2001 From: Martin Vladic Date: Fri, 30 Jul 2021 00:33:43 +0200 Subject: [PATCH] autostart flow --- src/eez/modules/psu/gui/file_manager.cpp | 18 ++++++++++++++++-- src/eez/modules/psu/gui/file_manager.h | 2 +- src/eez/platform/simulator/cmsis_os.cpp | 9 +++++++-- src/eez/scripting.cpp | 14 ++++++++++++-- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/eez/modules/psu/gui/file_manager.cpp b/src/eez/modules/psu/gui/file_manager.cpp index 19aa5efa7..76f591ad5 100644 --- a/src/eez/modules/psu/gui/file_manager.cpp +++ b/src/eez/modules/psu/gui/file_manager.cpp @@ -96,6 +96,7 @@ bool g_fileBrowserMode; DialogType g_dialogType; const char *g_fileBrowserTitle; FileType g_fileBrowserFileType; +bool (*g_fileBrowserFileTypeFilter)(FileType type); static bool (*g_fileBrowserNameFilter)(const char *fileName); static void (*g_fileBrowserOnFileSelected)(const char *filePath); @@ -123,9 +124,21 @@ bool makeAbsolutePath(const char *relativePath, char *dest) { } void catalogCallback(void *param, const char *name, FileType type, size_t size, bool isHiddenOrSystemFile) { - if (isHiddenOrSystemFile || name[0] == '.' || (g_fileBrowserMode && type != FILE_TYPE_DIRECTORY && type != g_fileBrowserFileType)) { + if (isHiddenOrSystemFile) { return; } + + if (name[0] == '.') { + return; + } + + if (g_fileBrowserMode) { + if (type != FILE_TYPE_DIRECTORY) { + if (!(g_fileBrowserFileTypeFilter ? g_fileBrowserFileTypeFilter(type) : type == g_fileBrowserFileType)) { + return; + } + } + } if (g_fileBrowserMode && g_fileBrowserNameFilter) { if (!g_fileBrowserNameFilter(name)) { @@ -1066,11 +1079,12 @@ void FileBrowserPage::set() { g_fileBrowserOnFileSelected(filePath); } -void browseForFile(const char *title, const char *directory, FileType fileType, DialogType dialogType, void(*onFileSelected)(const char *filePath), bool (*nameFilter)(const char *)) { +void browseForFile(const char *title, const char *directory, FileType fileType, DialogType dialogType, void(*onFileSelected)(const char *filePath), bool (*nameFilter)(const char *), bool (*fileTypeFilter)(FileType)) { g_fileBrowserMode = true; g_dialogType = dialogType; g_fileBrowserTitle = title; g_fileBrowserFileType = fileType; + g_fileBrowserFileTypeFilter = fileTypeFilter; g_fileBrowserNameFilter = nameFilter; g_fileBrowserOnFileSelected = onFileSelected; diff --git a/src/eez/modules/psu/gui/file_manager.h b/src/eez/modules/psu/gui/file_manager.h index 69a96b98b..c3a14cf3c 100644 --- a/src/eez/modules/psu/gui/file_manager.h +++ b/src/eez/modules/psu/gui/file_manager.h @@ -89,7 +89,7 @@ enum DialogType { DIALOG_TYPE_SAVE }; -void browseForFile(const char *title, const char *directory, FileType fileType, DialogType dialogType, void (*onFileSelected)(const char *filePath), bool (*nameFilter)(const char *) = nullptr); +void browseForFile(const char *title, const char *directory, FileType fileType, DialogType dialogType, void (*onFileSelected)(const char *filePath), bool (*nameFilter)(const char *) = nullptr, bool (*fileTypeFilter)(FileType) = nullptr); extern const char *g_fileBrowserTitle; diff --git a/src/eez/platform/simulator/cmsis_os.cpp b/src/eez/platform/simulator/cmsis_os.cpp index b9f1c0cca..50e8cb484 100644 --- a/src/eez/platform/simulator/cmsis_os.cpp +++ b/src/eez/platform/simulator/cmsis_os.cpp @@ -183,9 +183,14 @@ osEvent osMessageGet(osMessageQId queue_id, uint32_t millisec) { } osStatus osMessagePut(osMessageQId queue_id, uint32_t info, uint32_t millisec) { - while (queue_id->overflow) { - osDelay(0); + for (uint32_t i = 0; queue_id->overflow && i < millisec; i++) { + osDelay(1); + } + + if (queue_id->overflow) { + return osOK; } + uint16_t head = queue_id->head + 1; if (head >= queue_id->numElements) { head = 0; diff --git a/src/eez/scripting.cpp b/src/eez/scripting.cpp index ecdb3b346..0d8361637 100644 --- a/src/eez/scripting.cpp +++ b/src/eez/scripting.cpp @@ -617,7 +617,7 @@ void resetSettings() { bool isAutoStartEnabled() { if (!g_autoStartConditionIsChecked) { - sendMessageToLowPriorityThread(THREAD_MESSAGE_AUTO_START_SCRIPT); + sendMessageToLowPriorityThread(THREAD_MESSAGE_AUTO_START_SCRIPT, 0, 1); return true; } @@ -741,7 +741,17 @@ void onAutoStartScriptFileSelected(const char *filePath) { } void action_sys_settings_scripting_select_auto_start_script() { - browseForFile("Select auto start script", "/Scripts", FILE_TYPE_MICROPYTHON, file_manager::DIALOG_TYPE_OPEN, onAutoStartScriptFileSelected); + browseForFile( + "Select auto start script", + "/Scripts", + FILE_TYPE_MICROPYTHON, + file_manager::DIALOG_TYPE_OPEN, + onAutoStartScriptFileSelected, + nullptr, + [] (FileType type) { + return type == FILE_TYPE_MICROPYTHON || type == FILE_TYPE_APP; + } + ); } void action_sys_settings_scripting_clear_auto_start_script() {