29 esp_ble_gattc_cb_param_t *param) {
31 case ESP_GATTC_OPEN_EVT: {
32 if (param->open.status == ESP_GATT_OK) {
33 ESP_LOGI(TAG,
"Connected successfully!");
38 case ESP_GATTC_DISCONNECT_EVT: {
39 ESP_LOGW(TAG,
"Disconnected!");
43 case ESP_GATTC_SEARCH_CMPL_EVT: {
44 if (this->
parent()->get_service(SERVICE_UUID_V1) !=
nullptr) {
49 }
else if (this->
parent()->get_service(SERVICE_UUID_V2) !=
nullptr) {
55 ESP_LOGW(TAG,
"No supported device has been found, disconnecting");
63 char service_buf[esp32_ble::UUID_STR_LEN];
64 char char_buf[esp32_ble::UUID_STR_LEN];
65 ESP_LOGW(TAG,
"No sensor read characteristic found at service %s char %s",
service_uuid_.
to_str(service_buf),
72 if (write_chr ==
nullptr) {
73 char service_buf[esp32_ble::UUID_STR_LEN];
74 char char_buf[esp32_ble::UUID_STR_LEN];
75 ESP_LOGW(TAG,
"No sensor write characteristic found at service %s char %s",
service_uuid_.
to_str(service_buf),
82 esp_ble_gattc_register_for_notify(gattc_if, this->
parent()->get_remote_bda(), this->
read_handle_);
84 ESP_LOGW(TAG,
"Error registering for sensor notify, status=%d",
status);
89 case ESP_GATTC_WRITE_DESCR_EVT: {
90 if (param->write.status != ESP_GATT_OK) {
91 ESP_LOGE(TAG,
"write descr failed, error status = %x", param->write.status);
94 ESP_LOGV(TAG,
"Write descr success, writing 0x%02X at write_handle=%d", this->
write_command_,
98 (uint8_t *) &
write_command_, ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE);
105 case ESP_GATTC_NOTIFY_EVT: {
106 if (param->notify.is_notify) {
107 ESP_LOGV(TAG,
"ESP_GATTC_NOTIFY_EVT, receive notify value, %d bytes", param->notify.value_len);
109 ESP_LOGV(TAG,
"ESP_GATTC_NOTIFY_EVT, receive indicate value, %d bytes", param->notify.value_len);
122 ESP_LOGW(TAG,
"Unexpected empty message");
126 uint8_t command = value[0];
128 if ((command == WRITE_COMMAND_V1 && value_len < 20) || (command == WRITE_COMMAND_V2 && value_len < 68)) {
129 ESP_LOGW(TAG,
"Unexpected command 0x%02X message length %d", command, value_len);
137 ESP_LOGV(TAG,
"radon sensors raw bytes");
138 ESP_LOG_BUFFER_HEX_LEVEL(TAG, value, value_len, ESP_LOG_VERBOSE);
141 constexpr float convert_to_bwpm3 = 37.0;
146 if (command == WRITE_COMMAND_V1) {
149 memcpy(&temp, value + 2,
sizeof(
float));
150 radon_now = temp * convert_to_bwpm3;
151 memcpy(&temp, value + 6,
sizeof(
float));
152 radon_day = temp * convert_to_bwpm3;
153 memcpy(&temp, value + 10,
sizeof(
float));
154 radon_month = temp * convert_to_bwpm3;
155 }
else if (command == WRITE_COMMAND_V2) {
158 memcpy(&temp, value + 33,
sizeof(uint16_t));
160 memcpy(&temp, value + 35,
sizeof(uint16_t));
162 memcpy(&temp, value + 37,
sizeof(uint16_t));
165 ESP_LOGW(TAG,
"Unexpected command value: 0x%02X", command);
174 if (radon_month > 0) {
175 ESP_LOGV(TAG,
"Radon Long Term based on month");
178 ESP_LOGV(TAG,
"Radon Long Term based on day");
184 " Measurements (Bq/m³) now: %0.03f, day: %0.03f, month: %0.03f\n"
185 " Measurements (pCi/L) now: %0.03f, day: %0.03f, month: %0.03f",
186 radon_now, radon_day, radon_month, radon_now / convert_to_bwpm3, radon_day / convert_to_bwpm3,
187 radon_month / convert_to_bwpm3);