Browse Source

1. 对chatgpt代码进行存储验证

kindring 2 years ago
parent
commit
6fc62b9921

+ 231 - 0
日常/chatgpt_esp32_蓝牙控制led_1.c

@@ -0,0 +1,231 @@
+#include <stdio.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "driver/gpio.h"
+#include "driver/pwm.h"
+#include "esp_log.h"
+#include "esp_system.h"
+#include "nvs_flash.h"
+#include "esp_bt.h"
+#include "esp_gap_ble_api.h"
+#include "esp_gattc_api.h"
+#include "esp_gatts_api.h"
+#include "esp_gatt_common_api.h"
+
+#define BUTTON_A_GPIO GPIO_NUM_5
+#define BUTTON_B_GPIO GPIO_NUM_6
+#define BUTTON_C_GPIO GPIO_NUM_7
+#define LED_GPIO GPIO_NUM_16
+
+#define PWM_CHANNEL PWM_CHANNEL_0
+#define PWM_FREQ 1000
+#define PWM_RES 100
+
+#define GATTS_TAG "GATTS_DEMO"
+#define GATTS_SERVICE_UUID 0x00FF
+#define GATTS_CHAR_UUID_LED_ON_OFF 0xFF01
+#define GATTS_CHAR_UUID_LED_BRIGHTNESS 0xFF02
+#define GATTS_CHAR_UUID_LED_CONTROL 0xFF03
+
+static bool led_on = false;
+static int led_brightness = 0;
+
+// 定义蓝牙服务和特征值UUID
+static uint16_t gatts_service_uuid = GATTS_SERVICE_UUID;
+static uint16_t gatts_char_uuid_led_on_off = GATTS_CHAR_UUID_LED_ON_OFF;
+static uint16_t gatts_char_uuid_led_brightness = GATTS_CHAR_UUID_LED_BRIGHTNESS;
+static uint16_t gatts_char_uuid_led_control = GATTS_CHAR_UUID_LED_CONTROL;
+
+// 定义蓝牙特征值句柄
+static uint16_t gatts_handle_table[3];
+
+// 定义解析BLE指令的函数
+static void parse_ble_command(uint8_t *value, size_t len) {
+    switch (value[0]) {
+        case 0x01:  // LED开关
+            if (len == 2) {
+                if (value[1] == 0x01) {
+                    led_on = true;
+                    pwm_set_duty(PWM_CHANNEL, led_brightness);
+                    pwm_start();
+                }
+                else if (value[1] == 0x00) {
+                    led_on = false;
+                    pwm_stop();
+                }
+            }
+            break;
+        case 0x02:  // 逐级增减LED亮度
+            if (len == 2) {
+                int delta = (value[1] == 0x01 ? 1 : -1);
+                led_brightness += delta;
+                if (led_brightness < 0) {
+                    led_brightness = 0;
+                }
+                else if (led_brightness > PWM_RES) {
+                    led_brightness = PWM_RES;
+                }
+                if (led_on) {
+                    pwm_set_duty(PWM_CHANNEL, led_brightness);
+                    pwm_start();
+                }
+            }
+            break;
+        case 0x03:  // 直接指定LED亮度
+            if (len == 2) {
+                led_brightness = value[1];
+                if (led_brightness < 0) {
+                    led_brightness = 0;
+                }
+                else if (led_brightness > PWM_RES) {
+                    led_brightness = PWM_RES;
+                }
+                if (
+                led_on) {
+                pwm_set_duty(PWM_CHANNEL, led_brightness);
+                pwm_start();
+            }
+        }
+        break;
+    default:
+        break;
+}
+}
+
+// 定义BLE GATT Server回调函数
+static esp_gatts_cb_event_t gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param) {
+switch (event) {
+case ESP_GATTS_REG_EVT:
+// 注册GATT服务
+esp_err_t create_attr_ret = esp_ble_gatts_create_attr_tab((esp_gatts_attr_db_t *)param->reg.create.handles, gatts_if, 3, 0);
+if (create_attr_ret != ESP_OK) {
+ESP_LOGE(GATTS_TAG, "create attr table failed, error code = %x", create_attr_ret);
+}
+else {
+// 保存特征值句柄
+memcpy(gatts_handle_table, param->reg.create.handles, sizeof(gatts_handle_table));
+}
+break;
+case ESP_GATTS_READ_EVT:
+break;
+case ESP_GATTS_WRITE_EVT:
+if (param->write.is_prep) {
+break;
+}
+if (param->write.need_rsp) {
+esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL);
+}
+parse_ble_command(param->write.value, param->write.len);
+break;
+default:
+break;
+}
+return ESP_GATT_OK;
+}
+
+// 定义按钮A的中断处理函数
+static void IRAM_ATTR button_a_isr_handler(void *arg) {
+static uint64_t button_a_pressed_time = 0;
+uint64_t button_a_current_time = esp_timer_get_time();
+if (gpio_get_level(BUTTON_A_GPIO) == 0) {
+button_a_pressed_time = button_a_current_time;
+}
+else {
+if (button_a_current_time - button_a_pressed_time > 500000) { // 长按
+led_brightness--;
+if (led_brightness < 0) {
+led_brightness = 0;
+}
+pwm_set_duty(PWM_CHANNEL, led_brightness);
+pwm_start();
+}
+else { // 短按
+led_brightness++;
+if (led_brightness > PWM_RES) {
+led_brightness = PWM_RES;
+}
+pwm_set_duty(PWM_CHANNEL, led_brightness);
+pwm_start();
+}
+}
+}
+
+// 定义按钮B的中断处理函数
+static void IRAM_ATTR button_b_isr_handler(void *arg) {
+static uint64_t button_b_pressed_time = 0;
+uint64_t button_b_current_time = esp_timer_get_time();
+if (gpio_get_level(BUTTON_B_GPIO) == 0) {
+button_b_pressed_time = button_b_current_time;
+}
+else {
+if (button_b_current_time - button_b_pressed_time > 500000) { // 长按
+led_brightness++;
+if (led_brightness > PWM_RES) {
+led_brightness = PWM_RES;
+}
+pwm_set_duty(PWM_CHANNEL, led_brightness);
+pwm_start();
+}
+else { // 短按
+led_brightness--;
+if (led_brightness < 0) {
+led_brightness = 0;
+}
+pwm_set_duty(PWM_CHANNEL, led_brightness);
+pwm_start();
+}
+}
+}
+
+// 定义按钮C的中断处理函数
+static void IRAM_ATTR button_c_isr_handler(void *arg) {
+           bool led_on = false;
+           if (gpio_get_level(LED_GPIO) == 0) {
+           led_on = true;
+           }
+           led_on = !led_on;
+           gpio_set_level(LED_GPIO, led_on ? 1 : 0);
+           }
+
+           void app_main() {
+           // 初始化GPIO
+           gpio_pad_select_gpio(BUTTON_A_GPIO);
+           gpio_pad_select_gpio(BUTTON_B_GPIO);
+           gpio_pad_select_gpio(BUTTON_C_GPIO);
+           gpio_pad_select_gpio(LED_GPIO);
+           gpio_set_direction(BUTTON_A_GPIO, GPIO_MODE_INPUT);
+           gpio_set_direction(BUTTON_B_GPIO, GPIO_MODE_INPUT);
+           gpio_set_direction(BUTTON_C_GPIO, GPIO_MODE_INPUT);
+           gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
+           gpio_set_level(LED_GPIO, 0);
+
+           // 初始化PWM
+           pwm_init(PWM_CHANNEL, NULL);
+           pwm_set_freq(PWM_CHANNEL, PWM_FREQ);
+           pwm_set_duty(PWM_CHANNEL, 0);
+           pwm_start();
+
+           // 设置按钮A的中断
+           gpio_set_intr_type(BUTTON_A_GPIO, GPIO_INTR_ANYEDGE);
+           gpio_install_isr_service(0);
+           gpio_isr_handler_add(BUTTON_A_GPIO, button_a_isr_handler, NULL);
+
+           // 设置按钮B的中断
+           gpio_set_intr_type(BUTTON_B_GPIO, GPIO_INTR_ANYEDGE);
+           gpio_isr_handler_add(BUTTON_B_GPIO, button_b_isr_handler, NULL);
+
+           // 设置按钮C的中断
+           gpio_set_intr_type(BUTTON_C_GPIO, GPIO_INTR_ANYEDGE);
+           gpio_isr_handler_add(BUTTON_C_GPIO, button_c_isr_handler, NULL);
+
+           // 初始化BLE
+           esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
+           esp_bt_controller_init(&bt_cfg);
+           esp_bt_controller_enable(ESP_BT_MODE_BTDM);
+
+           esp_bluedroid_init();
+           esp_bluedroid_enable();
+
+           esp_ble_gatts_register_callback(gatts_event_handler);
+           esp_ble_gatts_app_register(APP_ID);
+}

+ 160 - 0
日常/chatgpt_esp32_蓝牙控制led_2.c

@@ -0,0 +1,160 @@
+#define PROFILE_NUM 1
+#define PROFILE_APP_IDX 0
+
+#define LED_CHAR_UUID 0x0100
+#define LED_CHAR_PROP (ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_READ)
+#define LED_CHAR_DESCR_UUID 0x0101
+#define LED_SERVICE_UUID 0x00FF
+#define LED_VALUE_LEN 1
+
+static uint8_t led_value = 0;
+
+static uint8_t led_char_descr[ESP_UUID_LEN_16] = {
+    ESP_UUID_16(LED_CHAR_DESCR_UUID),
+    ESP_UUID_16(ESP_GATT_UUID_CHAR_CLIENT_CONFIG),
+};
+
+static esp_ble_adv_data_t adv_data = {
+    .set_scan_rsp = false,
+    .include_name = true,
+    .include_txpower = true,
+    .min_interval = 0x20,
+    .max_interval = 0x40,
+    .appearance = 0x00,
+    .manufacturer_len = 0,
+    .p_manufacturer_data = NULL,
+    .service_data_len = 0,
+    .p_service_data = NULL,
+    .service_uuid_len = sizeof(LED_SERVICE_UUID),
+    .p_service_uuid = (uint8_t *)&LED_SERVICE_UUID,
+    .flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
+};
+
+static esp_ble_adv_params_t adv_params = {
+    .adv_int_min = 0x20,
+    .adv_int_max = 0x40,
+    .adv_type = ADV_TYPE_NONCONN_IND,
+    .own_addr_type = BLE_ADDR_TYPE_PUBLIC,
+    .channel_map = ADV_CHNL_ALL,
+    .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,
+};
+
+static esp_gatts_attr_db_t gatt_db[1] = {
+    [0] = {
+        .att_desc = {
+            .uuid_length = ESP_UUID_LEN_16,
+            .uuid_p = (uint8_t *)&LED_CHAR_UUID,
+            .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
+            .max_length = LED_VALUE_LEN,
+            .length = LED_VALUE_LEN,
+        },
+        .desc = {
+            .uuid_length = ESP_UUID_LEN_16,
+            .uuid_p = (uint8_t *)&LED_CHAR_DESCR_UUID,
+            .perm = ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
+            .max_length = sizeof(uint16_t),
+            .length = sizeof(uint16_t),
+            .value = (uint8_t *)&led_char_descr,
+        },
+        .attr_control = {
+            .auto_rsp = ESP_GATT_AUTO_RSP,
+        },
+    },
+};
+
+static esp_gatts_attr_db_t *gatt_db_ptr = gatt_db;
+
+static esp_gatts_service_t gatt_service = {
+    .uuid = {
+        .len = ESP_UUID_LEN_16,
+        .uuid = (uint8_t *)&LED_SERVICE_UUID,
+    },
+    .num_handle = 1,
+    .handle = NULL,
+    .end_handle = NULL,
+    .type = ESP_GATT_SVC_TYPE_PRIMARY,
+    .parent = NULL,
+    .desc = {
+        .uuid_length = 0,
+        .uuid_p = NULL,
+        .perm = 0,
+        .max_length = 0,
+        .length = 0,
+        .value = NULL,
+    },
+    .srvc_db = gatt
+static void gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param)
+{
+    switch (event) {
+        case ESP_GATTS_REG_EVT:
+            esp_ble_gap_set_device_name("LED Control");
+            esp_ble_gap_config_adv_data(&adv_data);
+            esp_ble_gatts_create_service(gatts_if, &gatt_service, PROFILE_NUM);
+            break;
+        case ESP_GATTS_READ_EVT:
+            if (param->read.handle == gatt_db[0].att_desc.handle) {
+                esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id, ESP_GATT_OK, &led_value, sizeof(led_value));
+            }
+            break;
+        case ESP_GATTS_WRITE_EVT:
+            if (param->write.handle == gatt_db[0].att_desc.handle) {
+                led_value = *param->write.value;
+                update_led_brightness(led_value);
+                esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, NULL, 0);
+            }
+            break;
+        case ESP_GATTS_CREAT_ATTR_TAB_EVT:
+            if (param->add_attr_tab.status != ESP_GATT_OK) {
+                break;
+            }
+            gatt_db_ptr[0].att_desc.handle = param->add_attr_tab.handles[0];
+            gatt_db_ptr[0].desc.handle = param->add_attr_tab.handles[1];
+            esp_ble_gatts_start_service(gatt_db_ptr[0].att_desc.handle);
+            break;
+        case ESP_GATTS_CONNECT_EVT:
+            esp_ble_gap_stop_advertising();
+            break;
+        case ESP_GATTS_DISCONNECT_EVT:
+            esp_ble_gap_start_advertising(&adv_params);
+            break;
+        default:
+            break;
+    }
+}
+
+void app_main()
+{
+    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
+    gpio_set_direction(BUTTON_A_PIN, GPIO_MODE_INPUT);
+    gpio_set_direction(BUTTON_B_PIN, GPIO_MODE_INPUT);
+    gpio_set_direction(BUTTON_C_PIN, GPIO_MODE_INPUT);
+
+    esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
+    esp_bt_controller_init(&bt_cfg);
+    esp_bt_controller_enable(ESP_BT_MODE_BLE);
+
+    esp
+    esp_bluedroid_init();
+    esp_bluedroid_enable();
+    esp_gap_ble_set_device_name("LED Control");
+    esp_gap_ble_set_advertise_mode(ESP_BLE_ADV_TYPE_ADV_IND);
+    esp_gap_ble_add_service_uuid(&gatt_service_id);
+    esp_gap_ble_set_adv_data(&adv_data);
+    esp_gap_ble_start_advertising(&adv_params);
+
+    esp_ble_gatts_register_callback(gatts_event_handler);
+    esp_ble_gatts_app_register(PROFILE_NUM);
+
+    while (1) {
+        if (gpio_get_level(BUTTON_A_PIN) == 0) {
+            increase_led_brightness();
+        }
+        if (gpio_get_level(BUTTON_B_PIN) == 0) {
+            decrease_led_brightness();
+        }
+        if (gpio_get_level(BUTTON_C_PIN) == 0) {
+            toggle_led();
+        }
+        vTaskDelay(50 / portTICK_PERIOD_MS);
+    }
+}

+ 115 - 0
日常/gpt_esp32_控制gpio.c

@@ -0,0 +1,115 @@
+#include <stdio.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "driver/gpio.h"
+#include "driver/pwm.h"
+
+#define BUTTON_A_GPIO GPIO_NUM_5
+#define BUTTON_B_GPIO GPIO_NUM_6
+#define BUTTON_C_GPIO GPIO_NUM_7
+#define LED_GPIO GPIO_NUM_16
+
+#define PWM_CHANNEL PWM_CHANNEL_0
+#define PWM_FREQ 1000
+#define PWM_RES 100
+
+static bool led_on = false;
+static int led_brightness = 0;
+
+static void button_a_handler(void *arg) {
+    int level = gpio_get_level(BUTTON_A_GPIO);
+    if (level == 1) {
+        led_brightness++;
+        if (led_brightness > PWM_RES) {
+            led_brightness = PWM_RES;
+        }
+        pwm_set_duty(PWM_CHANNEL, led_brightness);
+        pwm_start();
+    }
+    else {
+        vTaskDelay(500 / portTICK_RATE_MS);
+        while (gpio_get_level(BUTTON_A_GPIO) == 0 && led_brightness > 0) {
+            led_brightness--;
+            pwm_set_duty(PWM_CHANNEL, led_brightness);
+            pwm_start();
+            vTaskDelay(500 / portTICK_RATE_MS);
+        }
+    }
+}
+
+static void button_b_handler(void *arg) {
+    int level = gpio_get_level(BUTTON_B_GPIO);
+    if (level == 1) {
+        led_brightness--;
+        if (led_brightness < 0) {
+            led_brightness = 0;
+        }
+        pwm_set_duty(PWM_CHANNEL, led_brightness);
+        pwm_start();
+    }
+    else {
+        vTaskDelay(500 / portTICK_RATE_MS);
+        while (gpio_get_level(BUTTON_B_GPIO) == 0 && led_brightness < PWM_RES) {
+            led_brightness++;
+            pwm_set_duty(PWM_CHANNEL, led_brightness);
+            pwm_start();
+            vTaskDelay(500 / portTICK_RATE_MS);
+        }
+    }
+}
+
+static void button_c_handler(void *arg) {
+    int level = gpio_get_level(BUTTON_C_GPIO);
+    if (level == 1) {
+        led_on = !led_on;
+        if (led_on) {
+            pwm_set_duty(PWM_CHANNEL, led_brightness);
+            pwm_start();
+        }
+        else {
+            pwm_stop();
+        }
+    }
+}
+
+void app_main() {
+    // 初始化GPIO
+    gpio_pad_select_gpio(BUTTON_A_GPIO);
+    gpio_set_direction(BUTTON_A_GPIO, GPIO_MODE_INPUT);
+    gpio_set_pull_mode(BUTTON_A_GPIO, GPIO_PULLUP_ONLY);
+    gpio_install_isr_service(0);
+    gpio_isr_handler_add(BUTTON_A_GPIO, button_a_handler, NULL);
+
+    gpio_pad_select_gpio(BUTTON_B_GPIO);
+    gpio_set_direction(BUTTON_B_GPIO, GPIO_MODE_INPUT);
+    gpio_set_pull_mode(BUTTON_B_GPIO, GPIO_PULLUP_ONLY);
+    gpio_isr_handler_add(BUTTON_B_GPIO, button_b_handler, NULL);
+
+    gpio_pad_select_gpio(BUTTON_C_GPIO);
+    gpio_set_direction(BUTTON_C_GPIO, GPIO_MODE_INPUT);
+    gpio_set_pull_mode(BUTTON_C_GPIO, GPIO_PULLUP_ONLY);
+    gpio_isr_handler_add(BUTTON_C_GPIO, button_c_handler, NULL);
+
+    gpio_pad_select_gpio(LED_GPIO);
+    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
+
+    // 初始化PWM
+    pwm_init(PWM_CHANNEL, NULL);
+    pwm_set_freq(PWM_CHANNEL, PWM_FREQ);
+    pwm_set_resolution(PWM_CHANNEL, PWM_RES);
+
+    while (1) {
+        vTaskDelay(
+portMAX_DELAY);
+}
+}
+
+//该程序使用了3个GPIO输入引脚和1个GPIO输出引脚,以及1个PWM通道。
+//
+//程序中定义了三个按钮的GPIO引脚,以及一个LED的GPIO引脚和PWM通道。然后在`app_main`函数中初始化GPIO和PWM,并创建三个GPIO中断处理函数分别处理三个按钮的按下和长按操作。
+//
+//对于按钮A和B,按下按钮时会逐步增加或减小LED的亮度,而长按按钮时,每500毫秒亮度会逐步减小或增加。对于按钮C,按下时切换LED的开和关。
+//
+//最后,在`app_main`函数中通过一个死循环让程序一直运行。
+//
+//请注意,本程序的实现可能与您的ESP32板的具体规格有关,需要根据您的板的规格进行调整。

+ 142 - 0
日常/gpt_flutter_控制蓝牙.dart

@@ -0,0 +1,142 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:flutter_blue/flutter_blue.dart';
+
+void main() => runApp(MyApp());
+
+const String SERVICE_UUID = "a00e8cb8-1267-4e62-9e61-9c9d2c27f23d";
+const String CHARACTERISTIC_UUID = "a00e8cb9-1267-4e62-9e61-9c9d2c27f23d";
+
+class MyApp extends StatelessWidget {
+@override
+Widget build(BuildContext context) {
+return MaterialApp(
+title: 'LED Control',
+theme: ThemeData(primarySwatch: Colors.blue),
+home: MyHomePage(title: 'LED Control'),
+);
+}
+}
+
+class MyHomePage extends StatefulWidget {
+MyHomePage({Key? key, required this.title}) : super(key: key);
+
+final String title;
+
+@override
+_MyHomePageState createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State<MyHomePage> {
+FlutterBlue flutterBlue = FlutterBlue.instance;
+StreamSubscription<ScanResult>? scanSubscription;
+BluetoothDevice? device;
+BluetoothCharacteristic? characteristic;
+bool connected = false;
+int brightness = 0;
+String input = "";
+
+@override
+void initState() {
+super.initState();
+startScan();
+}
+
+@override
+void dispose() {
+stopScan();
+super.dispose();
+}
+
+void startScan() {
+scanSubscription = flutterBlue.scan().listen((scanResult) {
+if (scanResult.device.name == "LED Control") {
+stopScan();
+setState(() {
+device = scanResult.device;
+});
+}
+});
+}
+
+void stopScan() {
+scanSubscription?.cancel();
+scanSubscription = null;
+}
+
+void connectToDevice() async {
+await device?.connect();
+List<BluetoothService> services = await device?.discoverServices();
+for (BluetoothService service in services) {
+if (service.uuid.toString() == SERVICE_UUID) {
+for (BluetoothCharacteristic c in service.characteristics) {
+if (c.uuid.toString() == CHARACTERISTIC_UUID) {
+characteristic = c;
+}
+}
+}
+}
+setState(() {
+connected = true;
+});
+}
+
+void disconnectFromDevice() async {
+await device?.disconnect();
+setState(() {
+connected = false;
+});
+}
+
+void setBrightness(int value) async {
+if (characteristic != null) {
+await characteristic?.write([value]);
+}
+}
+
+@override
+Widget build(BuildContext context) {
+return Scaffold(
+appBar: AppBar(
+title: Text(widget.title),
+),
+body: Center(
+child: Column(
+mainAxisAlignment: MainAxisAlignment.center,
+children: <Widget>[
+Text(connected ? "Connected" : "Disconnected"),
+Text("Brightness: $brightness"),
+Slider(
+value: brightness.toDouble(),
+min: 0,
+max: 100,
+onChanged: (double value) {
+setState(() {
+brightness = value.round();
+});
+},
+onChangeEnd: (double value) {
+setBrightness(value.round());
+},
+),
+TextField(
+decoration: InputDecoration(labelText: 'Brightness value'),
+keyboardType: TextInputType.number,
+onChanged: (String value) {
+input = value;
+},
+onSubmitted: (String value) {
+setBrightness(int.parse(value));
+},
+),
+ElevatedButton(
+child: Text
+            connected ? "Disconnect" : "Connect",
+          onPressed: connected ? disconnectFromDevice : connectToDevice,
+        ),
+      ],
+    ),
+  ),
+);
+}
+}