// // Created by misaki on 2025/9/2. // #include "ToolsClass.h" #include #include #include #include #include #include #include #include #include "BAT_Driver.h" #include "PWR_Key.h" static const char *TAG = "ToolsClass"; ToolsClass* ToolsClass::instance; std::mutex ToolsClass::instance_mutex; ToolsClass *ToolsClass::getInstance() { std::lock_guard lock(instance_mutex); if (!instance) { instance = new ToolsClass(); } return instance; } ToolsClass::ToolsClass() { ESP_LOGI(TAG, "ToolsClass init"); PWR_Init(); BAT_Init(); // 电池驱动初始化 } float ToolsClass::getBatteryVolts() { return BAT_Get_Volts(); } int32_t ToolsClass::getBatteryPer() { return BAT_Get_Percent(); } // 静态:拼出完整路径 std::string ToolsClass::makeFullPath(const std::string& filename) { return "/sdcard/" + filename; } std::string ToolsClass::getChipSerialNumber() { // 获取芯片序列号(17 字节长的 "Chip ID" (乐鑫官方唯一序列号)) std::array id{}; /* 下面这个宏在 ESP32-S3 上展开为 17 byte 序列号字段,直接可用 */ esp_err_t err = esp_efuse_read_field_blob(ESP_EFUSE_OPTIONAL_UNIQUE_ID, id.data(), id.size() * 8); if (err != ESP_OK) { ESP_LOGE(TAG, "read Chip ID failed: %s", esp_err_to_name(err)); return ""; } std::stringstream ss; for (uint8_t v : id) ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(v); return ss.str(); } std::string ToolsClass::getChipMAC() { std::array mac{}; esp_efuse_mac_get_default(mac.data()); // 读出厂 MAC std::stringstream ss; for (size_t i = 0; i < mac.size(); ++i) { ss << std::hex << std::setw(2) << std::setfill('0') << static_cast(mac[i]); if (i + 1 != mac.size()) ss << ':'; } return ss.str(); } // 1. 去掉 mac 中的冒号 // 2. 拼接 chipID // 3. 取前 24 字符并转大写 std::string ToolsClass::GenerateSN(const std::string& mac, const std::string& chipID) { // 1. 去掉 MAC 里的冒号 std::string plainMac; plainMac.reserve(mac.size()); for (char ch : mac) if (ch != ':') plainMac.push_back(ch); // 2. 拼接 std::string raw = plainMac + chipID; // 3. 取前 24 位并转大写 if (raw.size() > 24) raw.resize(24); std::transform(raw.begin(), raw.end(), raw.begin(), [](unsigned char c){ return std::toupper(c); }); return raw; } std::string ToolsClass::device_version = "Beta0.3"; std::string ToolsClass::getDeviceVersion() { return device_version; }