You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
6.2 KiB
142 lines
6.2 KiB
/* |
|
* EEZ Modular Firmware |
|
* Copyright (C) 2021-present, Envox d.o.o. |
|
* |
|
* 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 <http://www.gnu.org/licenses/>. |
|
*/ |
|
|
|
#include <stdio.h> |
|
#include <math.h> |
|
|
|
#include <eez/core/os.h> |
|
|
|
#include <eez/flow/flow.h> |
|
#include <eez/flow/components.h> |
|
#include <eez/flow/flow_defs_v3.h> |
|
#include <eez/flow/queue.h> |
|
#include <eez/flow/hooks.h> |
|
|
|
#if defined(__EMSCRIPTEN__) |
|
#include <eez/flow/dashboard_api.h> |
|
#endif |
|
|
|
using namespace eez::gui; |
|
|
|
namespace eez { |
|
namespace flow { |
|
|
|
void executeStartComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeEndComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeInputComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeOutputComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeWatchVariableComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeEvalExprComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeSetVariableComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeSwitchComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeCompareComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeIsTrueComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeConstantComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeLogComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeCallActionComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeDelayComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeErrorComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeCatchErrorComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeCounterComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeLoopComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeShowPageComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeShowMessageBoxComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeShowKeyboardComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeShowKeypadComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeSelectLanguageComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeSetPageDirectionComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeAnimateComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeNoopComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeOnEventComponent(FlowState *flowState, unsigned componentIndex); |
|
|
|
void executeLayoutViewWidgetComponent(FlowState *flowState, unsigned componentIndex); |
|
void executeRollerWidgetComponent(FlowState *flowState, unsigned componentIndex); |
|
|
|
typedef void (*ExecuteComponentFunctionType)(FlowState *flowState, unsigned componentIndex); |
|
|
|
static ExecuteComponentFunctionType g_executeComponentFunctions[] = { |
|
executeStartComponent, |
|
executeEndComponent, |
|
executeInputComponent, |
|
executeOutputComponent, |
|
executeWatchVariableComponent, |
|
executeEvalExprComponent, |
|
executeSetVariableComponent, |
|
executeSwitchComponent, |
|
executeCompareComponent, |
|
executeIsTrueComponent, |
|
executeConstantComponent, |
|
executeLogComponent, |
|
executeCallActionComponent, |
|
executeDelayComponent, |
|
executeErrorComponent, |
|
executeCatchErrorComponent, |
|
executeCounterComponent, // COMPONENT_TYPE_COUNTER_ACTION |
|
executeLoopComponent, |
|
executeShowPageComponent, |
|
nullptr, // COMPONENT_TYPE_SCPIACTION |
|
executeShowMessageBoxComponent, |
|
executeShowKeyboardComponent, |
|
executeShowKeypadComponent, |
|
executeNoopComponent, // COMPONENT_TYPE_NOOP_ACTION |
|
nullptr, // COMPONENT_TYPE_COMMENT_ACTION |
|
executeSelectLanguageComponent, // COMPONENT_TYPE_SELECT_LANGUAGE_ACTION |
|
executeSetPageDirectionComponent, // COMPONENT_TYPE_SET_PAGE_DIRECTION_ACTION |
|
executeAnimateComponent, // COMPONENT_TYPE_ANIMATE_ACTION |
|
executeOnEventComponent, // COMPONENT_TYPE_ON_EVENT_ACTION |
|
}; |
|
|
|
void registerComponent(ComponentTypes componentType, ExecuteComponentFunctionType executeComponentFunction) { |
|
if (componentType >= defs_v3::COMPONENT_TYPE_START_ACTION) { |
|
g_executeComponentFunctions[componentType - defs_v3::COMPONENT_TYPE_START_ACTION] = executeComponentFunction; |
|
} |
|
} |
|
|
|
void executeComponent(FlowState *flowState, unsigned componentIndex) { |
|
auto component = flowState->flow->components[componentIndex]; |
|
|
|
#if defined(__EMSCRIPTEN__) |
|
if (component->type >= defs_v3::FIRST_DASHBOARD_COMPONENT_TYPE) { |
|
if (executeDashboardComponentHook) { |
|
executeDashboardComponentHook(component->type, getFlowStateIndex(flowState), componentIndex); |
|
return; |
|
} |
|
} else |
|
#endif // __EMSCRIPTEN__ |
|
if (component->type >= defs_v3::COMPONENT_TYPE_START_ACTION) { |
|
auto executeComponentFunction = g_executeComponentFunctions[component->type - defs_v3::COMPONENT_TYPE_START_ACTION]; |
|
if (executeComponentFunction != nullptr) { |
|
executeComponentFunction(flowState, componentIndex); |
|
return; |
|
} |
|
} else if (component->type < 1000) { |
|
if (component->type == defs_v3::COMPONENT_TYPE_LAYOUT_VIEW_WIDGET) { |
|
executeLayoutViewWidgetComponent(flowState, componentIndex); |
|
} else if (component->type == defs_v3::COMPONENT_TYPE_ROLLER_WIDGET) { |
|
executeRollerWidgetComponent(flowState, componentIndex); |
|
} |
|
return; |
|
} |
|
|
|
char errorMessage[100]; |
|
snprintf(errorMessage, sizeof(errorMessage), "Unknown component at index = %d, type = %d\n", componentIndex, component->type); |
|
throwError(flowState, componentIndex, errorMessage); |
|
} |
|
|
|
} // namespace flow |
|
} // namespace eez
|
|
|