diff --git a/main/boards/common/dual_network_board.cc b/main/boards/common/dual_network_board.cc index 81f2d98f..79ac00ce 100644 --- a/main/boards/common/dual_network_board.cc +++ b/main/boards/common/dual_network_board.cc @@ -7,22 +7,22 @@ static const char *TAG = "DualNetworkBoard"; -DualNetworkBoard::DualNetworkBoard(gpio_num_t ml307_tx_pin, gpio_num_t ml307_rx_pin, size_t ml307_rx_buffer_size) +DualNetworkBoard::DualNetworkBoard(gpio_num_t ml307_tx_pin, gpio_num_t ml307_rx_pin, size_t ml307_rx_buffer_size, int32_t default_net_type) : Board(), ml307_tx_pin_(ml307_tx_pin), ml307_rx_pin_(ml307_rx_pin), ml307_rx_buffer_size_(ml307_rx_buffer_size) { // 从Settings加载网络类型 - network_type_ = LoadNetworkTypeFromSettings(); + network_type_ = LoadNetworkTypeFromSettings(default_net_type); // 只初始化当前网络类型对应的板卡 InitializeCurrentBoard(); } -NetworkType DualNetworkBoard::LoadNetworkTypeFromSettings() { +NetworkType DualNetworkBoard::LoadNetworkTypeFromSettings(int32_t default_net_type) { Settings settings("network", true); - int network_type = settings.GetInt("type", 1); // 默认使用ML307 (1) + int network_type = settings.GetInt("type", default_net_type); // 默认使用ML307 (1) return network_type == 1 ? NetworkType::ML307 : NetworkType::WIFI; } diff --git a/main/boards/common/dual_network_board.h b/main/boards/common/dual_network_board.h index df009c1c..5fd1d39b 100644 --- a/main/boards/common/dual_network_board.h +++ b/main/boards/common/dual_network_board.h @@ -25,7 +25,7 @@ private: size_t ml307_rx_buffer_size_; // 从Settings加载网络类型 - NetworkType LoadNetworkTypeFromSettings(); + NetworkType LoadNetworkTypeFromSettings(int32_t default_net_type); // 保存网络类型到Settings void SaveNetworkTypeToSettings(NetworkType type); @@ -34,7 +34,7 @@ private: void InitializeCurrentBoard(); public: - DualNetworkBoard(gpio_num_t ml307_tx_pin, gpio_num_t ml307_rx_pin, size_t ml307_rx_buffer_size = 4096); + DualNetworkBoard(gpio_num_t ml307_tx_pin, gpio_num_t ml307_rx_pin, size_t ml307_rx_buffer_size = 4096, int32_t default_net_type = 1); virtual ~DualNetworkBoard() = default; // 切换网络类型 diff --git a/main/boards/magiclick-2p5/config.h b/main/boards/magiclick-2p5/config.h index 46fc3fa5..3b8cce72 100644 --- a/main/boards/magiclick-2p5/config.h +++ b/main/boards/magiclick-2p5/config.h @@ -47,4 +47,9 @@ #define DISPLAY_BACKLIGHT_PIN GPIO_NUM_13 #define DISPLAY_BACKLIGHT_OUTPUT_INVERT true +#define ML307_RX_PIN GPIO_NUM_42 +#define ML307_TX_PIN GPIO_NUM_44 +#define ML307_POWER_PIN GPIO_NUM_40 +#define ML307_POWER_OUTPUT_INVERT false + #endif // _BOARD_CONFIG_H_ diff --git a/main/boards/magiclick-2p5/magiclick_2p5_board.cc b/main/boards/magiclick-2p5/magiclick_2p5_board.cc index 28c5110c..3ad302d4 100644 --- a/main/boards/magiclick-2p5/magiclick_2p5_board.cc +++ b/main/boards/magiclick-2p5/magiclick_2p5_board.cc @@ -1,4 +1,4 @@ -#include "wifi_board.h" +#include "dual_network_board.h" #include "display/lcd_display.h" #include "audio_codecs/es8311_audio_codec.h" #include "application.h" @@ -20,6 +20,7 @@ #include "power_manager.h" #include "power_save_timer.h" +#include "esp_wifi.h" #define TAG "magiclick_2p5" @@ -73,7 +74,7 @@ static const gc9a01_lcd_init_cmd_t gc9107_lcd_init_cmds[] = { {0xba, (uint8_t[]){0xFF, 0xFF}, 2, 0}, }; -class magiclick_2p5 : public WifiBoard { +class magiclick_2p5 : public DualNetworkBoard { private: i2c_master_bus_handle_t codec_i2c_bus_; Button main_button_; @@ -116,6 +117,19 @@ private: power_save_timer_->SetEnabled(true); } + void Enable4GModule() { + // enable the 4G module + gpio_reset_pin(ML307_POWER_PIN); + gpio_set_direction(ML307_POWER_PIN, GPIO_MODE_OUTPUT); + gpio_set_level(ML307_POWER_PIN, ML307_POWER_OUTPUT_INVERT ? 0 : 1); + } + void Disable4GModule() { + // enable the 4G module + gpio_reset_pin(ML307_POWER_PIN); + gpio_set_direction(ML307_POWER_PIN, GPIO_MODE_OUTPUT); + gpio_set_level(ML307_POWER_PIN, ML307_POWER_OUTPUT_INVERT ? 1 : 0); + } + void InitializeCodecI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -133,11 +147,37 @@ private: ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_)); } + void CheckNetType() { + if (GetNetworkType() == NetworkType::WIFI) { + Disable4GModule(); + } else if (GetNetworkType() == NetworkType::ML307) { + Enable4GModule(); + } + + } + + void InitializeButtons() { main_button_.OnClick([this]() { auto& app = Application::GetInstance(); - if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { - ResetWifiConfiguration(); + if (GetNetworkType() == NetworkType::WIFI) { + if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { + // cast to WifiBoard + auto& wifi_board = static_cast(GetCurrentBoard()); + wifi_board.ResetWifiConfiguration(); + Disable4GModule(); + } + } else if(GetNetworkType() == NetworkType::ML307) { + + Enable4GModule(); + // stop WiFi + esp_wifi_stop(); + } + }); + main_button_.OnDoubleClick([this]() { + auto& app = Application::GetInstance(); + if (app.GetDeviceState() == kDeviceStateStarting || app.GetDeviceState() == kDeviceStateWifiConfiguring) { + SwitchNetworkType(); } }); main_button_.OnPressDown([this]() { @@ -149,11 +189,7 @@ private: }); left_button_.OnClick([this]() { - power_save_timer_->WakeUp(); - auto& app = Application::GetInstance(); - if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { - ResetWifiConfiguration(); - } + power_save_timer_->WakeUp(); auto codec = GetAudioCodec(); auto volume = codec->output_volume() - 10; if (volume < 0) { @@ -253,11 +289,12 @@ private: } public: - magiclick_2p5() : + magiclick_2p5() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN, 4096, 0), main_button_(MAIN_BUTTON_GPIO), left_button_(LEFT_BUTTON_GPIO), right_button_(RIGHT_BUTTON_GPIO) { InitializeLedPower(); + CheckNetType(); InitializePowerManager(); InitializePowerSaveTimer(); InitializeCodecI2c(); @@ -305,7 +342,7 @@ public: if (!enabled) { power_save_timer_->WakeUp(); } - WifiBoard::SetPowerSaveMode(enabled); + DualNetworkBoard::SetPowerSaveMode(enabled); } };