30 esp_ble_gattc_cb_param_t *param) {
32 case ESP_GATTC_OPEN_EVT: {
33 if (param->open.status == ESP_GATT_OK) {
34 ESP_LOGI(TAG,
"Connected successfully!");
39 case ESP_GATTC_DISCONNECT_EVT: {
40 ESP_LOGW(TAG,
"Disconnected!");
44 case ESP_GATTC_SEARCH_CMPL_EVT: {
45 if (this->
parent()->get_service(SERVICE_UUID_V1) !=
nullptr) {
50 }
else if (this->
parent()->get_service(SERVICE_UUID_V2) !=
nullptr) {
56 ESP_LOGW(TAG,
"No supported device has been found, disconnecting");
64 char service_buf[esp32_ble::UUID_STR_LEN];
65 char char_buf[esp32_ble::UUID_STR_LEN];
66 ESP_LOGW(TAG,
"No sensor read characteristic found at service %s char %s",
service_uuid_.
to_str(service_buf),
73 if (write_chr ==
nullptr) {
74 char service_buf[esp32_ble::UUID_STR_LEN];
75 char char_buf[esp32_ble::UUID_STR_LEN];
76 ESP_LOGW(TAG,
"No sensor write characteristic found at service %s char %s",
service_uuid_.
to_str(service_buf),
83 esp_ble_gattc_register_for_notify(gattc_if, this->
parent()->get_remote_bda(), this->
read_handle_);
85 ESP_LOGW(TAG,
"Error registering for sensor notify, status=%d",
status);
90 case ESP_GATTC_WRITE_DESCR_EVT: {
91 if (param->write.status != ESP_GATT_OK) {
92 ESP_LOGE(TAG,
"write descr failed, error status = %x", param->write.status);
95 ESP_LOGV(TAG,
"Write descr success, writing 0x%02X at write_handle=%d", this->
write_command_,
99 (uint8_t *) &
write_command_, ESP_GATT_WRITE_TYPE_NO_RSP, ESP_GATT_AUTH_REQ_NONE);
106 case ESP_GATTC_NOTIFY_EVT: {
107 if (param->notify.is_notify) {
108 ESP_LOGV(TAG,
"ESP_GATTC_NOTIFY_EVT, receive notify value, %d bytes", param->notify.value_len);
110 ESP_LOGV(TAG,
"ESP_GATTC_NOTIFY_EVT, receive indicate value, %d bytes", param->notify.value_len);
123 ESP_LOGW(TAG,
"Unexpected empty message");
127 uint8_t command = value[0];
129 if ((command == WRITE_COMMAND_V1 && value_len < 20) || (command == WRITE_COMMAND_V2 && value_len < 68)) {
130 ESP_LOGW(TAG,
"Unexpected command 0x%02X message length %d", command, value_len);
138 ESP_LOGV(TAG,
"radon sensors raw bytes");
139 ESP_LOG_BUFFER_HEX_LEVEL(TAG, value, value_len, ESP_LOG_VERBOSE);
142 constexpr float convert_to_bwpm3 = 37.0;
147 if (command == WRITE_COMMAND_V1) {
150 memcpy(&temp, value + 2,
sizeof(
float));
151 radon_now = temp * convert_to_bwpm3;
152 memcpy(&temp, value + 6,
sizeof(
float));
153 radon_day = temp * convert_to_bwpm3;
154 memcpy(&temp, value + 10,
sizeof(
float));
155 radon_month = temp * convert_to_bwpm3;
156 }
else if (command == WRITE_COMMAND_V2) {
159 memcpy(&temp, value + 33,
sizeof(uint16_t));
161 memcpy(&temp, value + 35,
sizeof(uint16_t));
163 memcpy(&temp, value + 37,
sizeof(uint16_t));
166 ESP_LOGW(TAG,
"Unexpected command value: 0x%02X", command);
175 if (radon_month > 0) {
176 ESP_LOGV(TAG,
"Radon Long Term based on month");
179 ESP_LOGV(TAG,
"Radon Long Term based on day");
185 " Measurements (Bq/m³) now: %0.03f, day: %0.03f, month: %0.03f\n"
186 " Measurements (pCi/L) now: %0.03f, day: %0.03f, month: %0.03f",
187 radon_now, radon_day, radon_month, radon_now / convert_to_bwpm3, radon_day / convert_to_bwpm3,
188 radon_month / convert_to_bwpm3);