diff --git a/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.cpp b/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.cpp index 65449a46..9555aa36 100644 --- a/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.cpp +++ b/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.cpp @@ -4,6 +4,7 @@ #include "Utilities/StringUtilities.h" +SimulatorAddress::SimulatorAddress() : type(AddressType::UNDEFINED) {} SimulatorAddress::SimulatorAddress(unsigned int address) : type(AddressType::ADDRESS_ONLY), address(address) {} SimulatorAddress::SimulatorAddress(unsigned int address, unsigned int mask, uint8_t shift) : type(AddressType::INTEGER), address(address), mask(mask), shift(shift) diff --git a/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.h b/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.h index 39abb567..ba05a582 100644 --- a/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.h +++ b/Sources/backend-cpp/SimulatorInterface/SimulatorInterface.h @@ -19,7 +19,7 @@ using SimulatorConnectionSettings = struct { std::string multicast_address; // UDP Multicast address group to join. }; -enum class AddressType { ADDRESS_ONLY, INTEGER, STRING }; +enum class AddressType { UNDEFINED, ADDRESS_ONLY, INTEGER, STRING }; struct SimulatorAddress { AddressType type; @@ -30,6 +30,7 @@ struct SimulatorAddress { // Only for STRING: unsigned int max_length; + SimulatorAddress(); SimulatorAddress(unsigned int address); SimulatorAddress(unsigned int address, unsigned int mask, uint8_t shift); SimulatorAddress(unsigned int address, unsigned int max_length); diff --git a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.cpp b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.cpp index 46edcac6..1b0c183e 100644 --- a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.cpp +++ b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.cpp @@ -6,66 +6,71 @@ ImageStateMonitor::ImageStateMonitor(const json &settings) { update_settings(settings); } -void ImageStateMonitor::update_settings(const json &settings) +void ImageStateMonitor::update_settings(const json &state_monitor_settings) { - const std::string dcs_id_compare_monitor_raw = EPLJSONUtils::GetStringByName(settings, "dcs_id_compare_monitor"); - const std::string dcs_id_compare_condition_raw = - EPLJSONUtils::GetStringByName(settings, "dcs_id_compare_condition"); - const std::string dcs_id_comparison_value_raw = EPLJSONUtils::GetStringByName(settings, "dcs_id_comparison_value"); + settings_per_state_.clear(); + monitor_is_set_ = state_monitor_settings["is_set"]; - const bool compare_monitor_is_populated = !dcs_id_compare_monitor_raw.empty(); - const bool comparison_value_is_populated = is_number(dcs_id_comparison_value_raw); - settings_are_filled_ = compare_monitor_is_populated && comparison_value_is_populated; - - if (settings_are_filled_) { - if (is_integer(dcs_id_compare_monitor_raw)) { - dcs_id_compare_monitor_ = SimulatorAddress(std::stoi(dcs_id_compare_monitor_raw)); + if (monitor_is_set_) { + for (const auto &state : state_monitor_settings) { + SimulatorAddress address; + if (state["monitor_address"]["type"] == "INTEGER") { + address = SimulatorAddress{state["monitor_address"]["address"], + state["monitor_address"]["mask"], + state["monitor_address"]["shift"]}; + } else if (state["monitor_address"]["type"] == "ADDRESS_ONLY") { + address = SimulatorAddress{state["monitor_address"]["address"]}; + } else { + // Unsupported type. + break; + } - } else { - if (dcs_id_compare_monitor_raw == "INTEGER") { - dcs_id_compare_monitor_ = SimulatorAddress(settings["compare_monitor_address"], - settings["compare_monitor_mask"], - settings["compare_monitor_shift"]); - } else if (dcs_id_compare_monitor_raw == "STRING") { - dcs_id_compare_monitor_ = - SimulatorAddress(settings["compare_monitor_address"], settings["compare_monitor_max_length"]); + Comparison comp_type; + if (state["comparison_type"] == "LT") { + comp_type = Comparison::LESS_THAN; + } else if (state["comparison_type"] == "GT") { + comp_type = Comparison::GREATER_THAN; + } else { + comp_type = Comparison::EQUAL_TO; } - } - dcs_id_comparison_value_ = Decimal(dcs_id_comparison_value_raw); - if (dcs_id_compare_condition_raw == "EQUAL_TO") { - dcs_id_compare_condition_ = Comparison::EQUAL_TO; - } else if (dcs_id_compare_condition_raw == "LESS_THAN") { - dcs_id_compare_condition_ = Comparison::LESS_THAN; - } else // Default in Property Inspector html is GREATER_THAN. - { - dcs_id_compare_condition_ = Comparison::GREATER_THAN; + settings_per_state_.push_back(StateMonitorSettings{address, comp_type, Decimal(state["comparison_value"])}); } } } int ImageStateMonitor::determineContextState(SimulatorInterface *simulator_interface) const { - if (settings_are_filled_) { - const auto maybe_current_game_value = simulator_interface->get_value_at_addr(dcs_id_compare_monitor_); - if (maybe_current_game_value.has_value()) { - return comparison_is_satisfied(maybe_current_game_value.value()) ? 1 : 0; + if (monitor_is_set_) { + for (int iState = 0; iState < settings_per_state_.size(); ++iState) { + const auto maybe_value = simulator_interface->get_value_at_addr(settings_per_state_[iState].address); + if (!maybe_value) { + return 0; // Return early if not all addresses are readable. + } + if (maybe_value && comparison_is_satisfied(maybe_value.value())) { + return iState; + } } + // If no conditional states are satisfied, then the last state is set. + return settings_per_state_.size() + 1; } + // Default to first state. return 0; } -bool ImageStateMonitor::comparison_is_satisfied(Decimal current_game_value) const +bool ImageStateMonitor::comparison_is_satisfied(const Decimal ¤t_game_value, + const Comparison &comparison, + const Decimal &comparison_value) const { bool comparison_result = false; - switch (dcs_id_compare_condition_) { + switch (comparison) { case Comparison::EQUAL_TO: - comparison_result = (current_game_value == dcs_id_comparison_value_); + comparison_result = (current_game_value == comparison_value); break; case Comparison::LESS_THAN: - comparison_result = (current_game_value < dcs_id_comparison_value_); + comparison_result = (current_game_value < comparison_value); break; case Comparison::GREATER_THAN: - comparison_result = (current_game_value > dcs_id_comparison_value_); + comparison_result = (current_game_value > comparison_value); break; } return comparison_result; diff --git a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.h b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.h index 8030995f..4152d5c7 100644 --- a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.h +++ b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/ImageStateMonitor.h @@ -31,18 +31,24 @@ class ImageStateMonitor private: enum class Comparison { GREATER_THAN, EQUAL_TO, LESS_THAN }; + using StateMonitorSettings = struct { + SimulatorAddress address; + Comparison comparison; + Decimal comparison_value; + }; + /** - * @brief Checks if current game value satisfies the comparison criteria configured in settings. - * - * @param current_game_value + * @brief Checks if current game value satisfies the comparison criteria for state. */ - bool comparison_is_satisfied(Decimal current_game_value) const; + bool comparison_is_satisfied(const Decimal ¤t_game_value, + const Comparison &comparison, + const Decimal &comparison_value) const; // Status of user-filled fields. - bool settings_are_filled_ = false; // True if all DCS ID comparison monitor settings have been set. + bool monitor_is_set_ = false; // True if all monitor settings have been set. // Stored settings extracted from user-filled fields. - SimulatorAddress dcs_id_compare_monitor_{0}; // Simulator address to monitor for state change. + std::vector settings_per_state_; Comparison dcs_id_compare_condition_ = Comparison::GREATER_THAN; // Comparison to use for DCS ID compare monitor. Decimal dcs_id_comparison_value_; // Value to compare DCS ID compare monitor value to. }; diff --git a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.cpp b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.cpp index 06c24573..84d04a0d 100644 --- a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.cpp +++ b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.cpp @@ -6,43 +6,34 @@ TitleMonitor::TitleMonitor(const json &settings) { update_settings(settings); } -void TitleMonitor::update_settings(const json &settings) +void TitleMonitor::update_settings(const json &title_monitor_settings) { - const std::string dcs_id_string_monitor_raw = EPLJSONUtils::GetStringByName(settings, "dcs_id_string_monitor"); - // Set boolean from checkbox using default false value if it doesn't exist in "settings". - const std::string string_monitor_vertical_spacing_raw = - EPLJSONUtils::GetStringByName(settings, "string_monitor_vertical_spacing"); - string_monitor_passthrough_ = EPLJSONUtils::GetBoolByName(settings, "string_monitor_passthrough_check", true); - std::stringstream string_monitor_mapping_raw; - string_monitor_mapping_raw << EPLJSONUtils::GetStringByName(settings, "string_monitor_mapping"); - - string_monitor_is_set_ = !dcs_id_string_monitor_raw.empty(); - + string_monitor_is_set_ = title_monitor_settings["is_set"]; if (string_monitor_is_set_) { - if (is_integer(dcs_id_string_monitor_raw)) { - dcs_id_string_monitor_ = SimulatorAddress(std::stoi(dcs_id_string_monitor_raw)); - - } else { - if (dcs_id_string_monitor_raw == "INTEGER") { - dcs_id_string_monitor_ = SimulatorAddress(settings["string_monitor_address"], - settings["string_monitor_mask"], - settings["string_monitor_shift"]); - } else if (dcs_id_string_monitor_raw == "STRING") { - dcs_id_string_monitor_ = - SimulatorAddress(settings["string_monitor_address"], settings["string_monitor_max_length"]); - } + SimulatorAddress address; + if (title_monitor_settings["monitor_address"]["type"] == "STRING") { + address = SimulatorAddress{title_monitor_settings["monitor_address"][0]["address"], + title_monitor_settings["monitor_address"][0]["max_len"]}; + } else if (title_monitor_settings["monitor_address"]["type"] == "INTEGER") { + address = SimulatorAddress{title_monitor_settings["monitor_address"]["address"], + title_monitor_settings["monitor_address"]["mask"], + title_monitor_settings["monitor_address"]["shift"]}; + } else if (title_monitor_settings["monitor_address"]["type"] == "ADDRESS_ONLY") { + address = SimulatorAddress{title_monitor_settings["monitor_address"]["address"]}; } - if (is_integer(string_monitor_vertical_spacing_raw)) { - string_monitor_vertical_spacing_ = std::stoi(string_monitor_vertical_spacing_raw); - } - if (!string_monitor_passthrough_) { + modify_string_ = title_monitor_settings["modify_string"]; + if (modify_string_) { string_monitor_mapping_.clear(); std::optional> maybe_token_pair; - while (maybe_token_pair = pop_key_and_value(string_monitor_mapping_raw, ',', '=')) { + std::stringstream mapping; + mapping << title_monitor_settings["mapping"]; + while (maybe_token_pair = pop_key_and_value(mapping, ',', '=')) { string_monitor_mapping_[maybe_token_pair.value().first] = maybe_token_pair.value().second; } } + vertical_spacing_ = + title_monitor_settings.contains("vertical_spacing") ? title_monitor_settings["vertical_spacing"] : 0; } } @@ -52,7 +43,7 @@ std::string TitleMonitor::determineTitle(SimulatorInterface *simulator_interface if (string_monitor_is_set_) { const std::optional maybe_current_game_value = - simulator_interface->get_string_at_addr(dcs_id_string_monitor_); + simulator_interface->get_string_at_addr(monitor_address_); if (maybe_current_game_value.has_value()) { updated_title = convertGameStateToTitle(maybe_current_game_value.value()); } @@ -64,18 +55,18 @@ std::string TitleMonitor::determineTitle(SimulatorInterface *simulator_interface std::string TitleMonitor::convertGameStateToTitle(const std::string ¤t_game_value) { std::string title; - if (string_monitor_passthrough_) { - title = current_game_value; - } else { + if (modify_string_) { title = string_monitor_mapping_[current_game_value]; + } else { + title = current_game_value; } // Apply vertical spacing. - if (string_monitor_vertical_spacing_ < 0) { - for (int i = 0; i > string_monitor_vertical_spacing_; --i) { + if (vertical_spacing_ < 0) { + for (int i = 0; i > vertical_spacing_; --i) { title = "\n" + title; } } else { - for (int i = 0; i < string_monitor_vertical_spacing_; ++i) { + for (int i = 0; i < vertical_spacing_; ++i) { title = title + "\n"; } } diff --git a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.h b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.h index 36427c84..540b2ea2 100644 --- a/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.h +++ b/Sources/backend-cpp/StreamdeckContext/ExportMonitors/TitleMonitor.h @@ -38,9 +38,9 @@ class TitleMonitor bool string_monitor_is_set_ = false; // True if all DCS ID string monitor settings have been set. - SimulatorAddress dcs_id_string_monitor_{0}; // Simulator address to monitor for context title. - int string_monitor_vertical_spacing_ = 0; // Vertical spacing (number of '\n') to include before or after title. - bool string_monitor_passthrough_ = true; // Flag set by user to passthrough string to title unaltered. + SimulatorAddress monitor_address_; // Simulator address to monitor for context title. + int vertical_spacing_ = 0; // Vertical spacing (number of '\n') to include before or after title. + bool modify_string_ = false; // Flag set if string should be modified before using as title. std::unordered_map string_monitor_mapping_; // Map of received values to title text to display on context. }; diff --git a/Sources/frontend-react-js/src/api/DcsBios/ControlReferenceInterface.tsx b/Sources/frontend-react-js/src/api/DcsBios/ControlReferenceInterface.tsx index a88a5ab2..e104af81 100644 --- a/Sources/frontend-react-js/src/api/DcsBios/ControlReferenceInterface.tsx +++ b/Sources/frontend-react-js/src/api/DcsBios/ControlReferenceInterface.tsx @@ -39,7 +39,13 @@ interface ControlOutputString { description: string, max_length: number, suffix: string, +<<<<<<< HEAD:Sources/frontend-react-js/src/api/DcsBios/ControlReferenceInterface.tsx type: "string" +||||||| constructed merge base:Sources/frontend-react-js/src/components/control-reference/ControlReferenceInterface.tsx + type: string, // Will be "string" +======= + type: "string", +>>>>>>> New version of ButtonSettings and GlobalSettings structures:Sources/frontend-react-js/src/components/control-reference/ControlReferenceInterface.tsx } export type { diff --git a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckApi.tsx b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckApi.tsx index e611a5f4..5120ad60 100644 --- a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckApi.tsx +++ b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckApi.tsx @@ -6,6 +6,8 @@ */ import { ModuleControlsJson } from "../DcsBios/ControlReferenceInterface"; +import StreamdeckButtonSettings from "./StreamdeckButtonSettings"; +import StreamdeckGlobalSettings from "./StreamdeckGlobalSettings"; export default interface StreamdeckApi { commFns: StreamdeckCommFns; @@ -38,86 +40,3 @@ export interface StreamdeckCommFns { // Request reference data for an individual module. requestModule(filename: string): void, } - -export interface StreamdeckButtonSettings { - // Simulator command settings - send_identifier: string; - send_address: string; - press_value: string; - release_value: string; - disable_release_check: boolean; - // Title Monitor settings - string_monitor_identifier: string; - dcs_id_string_monitor: string; - string_monitor_address: number; - string_monitor_mask: number; - string_monitor_shift: number; - string_monitor_max_length: number; - string_monitor_vertical_spacing: string; - string_monitor_passthrough_check: boolean; - string_monitor_mapping: string; - // State Monitor settings - compare_monitor_identifier: string; - dcs_id_compare_monitor: string; - compare_monitor_address: number; - compare_monitor_mask: number; - compare_monitor_shift: number; - compare_monitor_max_length: number; - dcs_id_compare_condition: "LESS_THAN" | "EQUAL_TO" | "GREATER_THAN"; - dcs_id_comparison_value: string; -} - -export function defaultButtonSettings(): StreamdeckButtonSettings { - return { - send_identifier: "", - send_address: "", - press_value: "1", - release_value: "0", - disable_release_check: false, - string_monitor_identifier: "", - dcs_id_string_monitor: "", - string_monitor_address: 0, - string_monitor_mask: 0, - string_monitor_shift: 0, - string_monitor_max_length: 0, - string_monitor_vertical_spacing: "0", - string_monitor_passthrough_check: true, - string_monitor_mapping: "", - compare_monitor_identifier: "", - dcs_id_compare_monitor: "", - compare_monitor_address: 0, - compare_monitor_mask: 0, - compare_monitor_shift: 0, - compare_monitor_max_length: 0, - dcs_id_compare_condition: "GREATER_THAN", - dcs_id_comparison_value: "0" - }; -} - -export interface StreamdeckGlobalSettings { - // General UI settings - autoOpenConfigureWindow: boolean; - // Connection settings to Simulator export. - ip_address: string, - listener_port: string, - send_port: string, - // Control reference query settings. - last_search_query: string, - last_selected_module: string, - dcs_install_path: string, - dcs_bios_install_path: string, -} - -export function defaultGlobalSettings(): StreamdeckGlobalSettings { - return { - autoOpenConfigureWindow: false, - ip_address: "", - listener_port: "", - send_port: "", - last_search_query: "", - last_selected_module: "", - dcs_install_path: "", - dcs_bios_install_path: "C:\\Users\\username\\Saved Games\\DCS.openbeta\\Scripts\\DCS-BIOS" - }; -} - diff --git a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckButtonSettings.tsx b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckButtonSettings.tsx new file mode 100644 index 00000000..b31635d1 --- /dev/null +++ b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckButtonSettings.tsx @@ -0,0 +1,97 @@ +export default interface StreamdeckButtonSettings { + version: number; // Version of settings interface. + state_monitor?: StateMonitorSettings[]; + title_monitor?: TitleMonitorSettings; + constant_action?: ConstantActionSettings; + state_dep_action?: StateDependentActionSettings; + increment_action?: IncrementActionSettings; +} + +export interface StateMonitorSettings { + is_set: boolean; + monitor_address: SimulatorAddress; + comparison_type: "LT" | "EQ" | "GT"; + comparison_value: string; +} + +export interface TitleMonitorSettings { + is_set: boolean; + monitor_address: SimulatorAddress[]; + modify_string: boolean; + vertical_spacing?: number; + mapping?: string; +} + +export interface ConstantActionSettings { + is_set: boolean; + on_press: CommandSettings[]; + on_release?: CommandSettings[]; + repeat_ms?: number; + short_dur_ms?: number; + type: "CONST" | "TIMED" | "RPT"; +} + +export interface StateDependentActionSettings { + for_state: ConstantActionSettings[]; +} + +export interface IncrementActionSettings { + monitor_address: SimulatorAddress; + min: string; + max: string; + cycling_allowed: boolean; + inc_value: string; + repeat_ms?: number; + alt_inc_value?: string; + short_dur_ms?: number; + type: "NONE" | "CONST" | "TIMED" | "RPT"; +} + +interface CommandSettings { + send_address: string; + value: string; +} + +interface SimulatorAddress { + address: number; + type: "ADDRESS_ONLY" | "INTEGER" | "STRING"; + mask?: number; + shift?: number; + max_len?: number; +} + + +export function defaultButtonSettings(): StreamdeckButtonSettings { + return { + version: 1, + }; +} + + +export interface OldStreamdeckButtonSettings { + // Simulator command settings + send_identifier: string; + send_address: string; + press_value: string; + release_value: string; + disable_release_check: boolean; + // Title Monitor settings + string_monitor_identifier: string; + dcs_id_string_monitor: string; + string_monitor_address: number; + string_monitor_mask: number; + string_monitor_shift: number; + string_monitor_max_length: number; + string_monitor_vertical_spacing: string; + string_monitor_passthrough_check: boolean; + string_monitor_mapping: string; + // State Monitor settings + compare_monitor_identifier: string; + dcs_id_compare_monitor: string; + compare_monitor_address: number; + compare_monitor_mask: number; + compare_monitor_shift: number; + compare_monitor_max_length: number; + dcs_id_compare_condition: "LESS_THAN" | "EQUAL_TO" | "GREATER_THAN"; + dcs_id_comparison_value: string; +} \ No newline at end of file diff --git a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckGlobalSettings.tsx b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckGlobalSettings.tsx new file mode 100644 index 00000000..96b6a7d6 --- /dev/null +++ b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckGlobalSettings.tsx @@ -0,0 +1,62 @@ +export default interface StreamdeckGlobalSettings { + version: number; + connection_settings: SimulatorConnectionSettings[], + // Control reference query settings. + last_search_query: string, + last_selected_module: string, + dcs_install_path: string, + dcs_bios_install_path: string, +} + +interface SimulatorConnectionSettings { + // Note: protocol values must align with enum labels defined in: + // Sources/backend-cpp/SimulatorInterface/SimulatorProtocolTypes.h + protocol: "DCS_BIOS" | "DCS_ExportScript", + enable: boolean, + ip_address: string, + listener_port: string, + send_port: string, + multicast_address: string, +} + +export function defaultGlobalSettings(): StreamdeckGlobalSettings { + return { + version: 1, + connection_settings: [ + { + protocol: "DCS_BIOS", + enable: false, + ip_address: "127.0.0.1", + listener_port: "5010", + send_port: "7778", + multicast_address: "239.255.50.10", + }, + { + protocol: "DCS_ExportScript", + enable: false, + ip_address: "127.0.0.1", + listener_port: "1725", + send_port: "26027", + multicast_address: "", + }, + ], + last_search_query: "", + last_selected_module: "", + dcs_install_path: "", + dcs_bios_install_path: "" + }; +} + +export interface OldStreamdeckGlobalSettings { + // General UI settings + autoOpenConfigureWindow: boolean; + // Connection settings to Simulator export. + ip_address: string, + listener_port: string, + send_port: string, + // Control reference query settings. + last_search_query: string, + last_selected_module: string, + dcs_install_path: string, + dcs_bios_install_path: string, +} diff --git a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.test.tsx b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.test.tsx index 52a01157..74401eea 100644 --- a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.test.tsx +++ b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.test.tsx @@ -1,7 +1,8 @@ import { fireEvent, render, screen } from "@testing-library/react"; import { defaultStreamdeckSocketSettings, useStreamdeckWebsocket } from "./StreamdeckWebsocket"; import WS from "jest-websocket-mock"; -import { defaultButtonSettings, defaultGlobalSettings } from "./StreamdeckApi"; +import { defaultButtonSettings } from "./StreamdeckButtonSettings"; +import { defaultGlobalSettings } from "./StreamdeckGlobalSettings"; // Settings used for unit under test. const socketSettings = defaultStreamdeckSocketSettings(); diff --git a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.tsx b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.tsx index 7aa45133..45f92a83 100644 --- a/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.tsx +++ b/Sources/frontend-react-js/src/api/Streamdeck/StreamdeckWebsocket.tsx @@ -1,5 +1,7 @@ import { useState, useEffect, useRef } from 'react'; -import StreamdeckApi, { defaultButtonSettings, defaultGlobalSettings, StreamdeckButtonSettings, StreamdeckCommFns } from './StreamdeckApi'; +import StreamdeckApi, { StreamdeckCommFns } from './StreamdeckApi'; +import StreamdeckButtongSettings, { defaultButtonSettings } from './StreamdeckButtonSettings'; +import { defaultGlobalSettings } from './StreamdeckGlobalSettings'; import { ModuleControlsJson } from '../DcsBios/ControlReferenceInterface'; export interface StreamdeckSocketSettings {