From 686ffe516e6faedc368dc712e5e61d897603d9f2 Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Tue, 22 Nov 2022 08:38:50 +1100 Subject: [PATCH] Fill out more characteristics --- .../Core/BSP/Pinecilv2/ble_characteristics.h | 16 +++ source/Core/BSP/Pinecilv2/ble_handlers.cpp | 116 ++++++++++++++++++ source/Core/BSP/Pinecilv2/ble_handlers.h | 1 + source/Core/BSP/Pinecilv2/ble_peripheral.c | 14 +++ 4 files changed, 147 insertions(+) diff --git a/source/Core/BSP/Pinecilv2/ble_characteristics.h b/source/Core/BSP/Pinecilv2/ble_characteristics.h index 5392a59d..cd09a44b 100644 --- a/source/Core/BSP/Pinecilv2/ble_characteristics.h +++ b/source/Core/BSP/Pinecilv2/ble_characteristics.h @@ -22,6 +22,8 @@ #define BT_UUID_SVC_LIVE_DATA BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xd85efab4, 0x168e, 0x4a71, 0xaffd, 0x33e27f9bc533)) // f6d75f91-5a10-4eba-a233-47d3f26a907f #define BT_UUID_SVC_SETTINGS_DATA BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0xf6d75f91, 0x5a10, 0x4eba, 0xa233, 0x47d3f26a907f)) +// 9eae1adb-9d0d-48c5-a6e7-ae93f0ea37b0 +#define BT_UUID_SVC_BULK_DATA BT_UUID_DECLARE_128(BT_UUID_128_ENCODE(0x9eae1adb, 0x9d0d, 0x48c5, 0xa6e7, 0xae93f0ea37b0)) #define BT_UUID_CHAR_BLE_LIVE_LIVE_TEMP BT_UUID_DECLARE_16(0x0001) #define BT_UUID_CHAR_BLE_LIVE_SETPOINT_TEMP BT_UUID_DECLARE_16(0x0002) @@ -29,6 +31,20 @@ #define BT_UUID_CHAR_BLE_LIVE_HANDLE_TEMP BT_UUID_DECLARE_16(0x0004) #define BT_UUID_CHAR_BLE_LIVE_POWER_LEVEL BT_UUID_DECLARE_16(0x0005) #define BT_UUID_CHAR_BLE_LIVE_POWER_SRC BT_UUID_DECLARE_16(0x0006) +#define BT_UUID_CHAR_BLE_LIVE_TIP_RES BT_UUID_DECLARE_16(0x0007) +#define BT_UUID_CHAR_BLE_LIVE_UPTIME BT_UUID_DECLARE_16(0x0008) +#define BT_UUID_CHAR_BLE_LIVE_MOVEMENT BT_UUID_DECLARE_16(0x0009) +#define BT_UUID_CHAR_BLE_LIVE_MAX_TEMP BT_UUID_DECLARE_16(0x000A) +#define BT_UUID_CHAR_BLE_LIVE_RAW_TIP BT_UUID_DECLARE_16(0x000B) +#define BT_UUID_CHAR_BLE_LIVE_HALL_SENSOR BT_UUID_DECLARE_16(0x000C) +#define BT_UUID_CHAR_BLE_LIVE_OP_MODE BT_UUID_DECLARE_16(0x000D) +#define BT_UUID_CHAR_BLE_LIVE_EST_WATTS BT_UUID_DECLARE_16(0x000E) + +// Bulk data that returns non-fixed sized objects +#define BT_UUID_CHAR_BLE_LIVE_BULK_LIVE_DATA BT_UUID_DECLARE_16(0x0001) +#define BT_UUID_CHAR_BLE_LIVE_ACCEL_NAME BT_UUID_DECLARE_16(0x0002) +#define BT_UUID_CHAR_BLE_LIVE_BUILD BT_UUID_DECLARE_16(0x0003) +#define BT_UUID_CHAR_BLE_LIVE_DEV_ID BT_UUID_DECLARE_16(0x0004) // Settings diff --git a/source/Core/BSP/Pinecilv2/ble_handlers.cpp b/source/Core/BSP/Pinecilv2/ble_handlers.cpp index 325a2cd8..4b6f0995 100644 --- a/source/Core/BSP/Pinecilv2/ble_handlers.cpp +++ b/source/Core/BSP/Pinecilv2/ble_handlers.cpp @@ -25,6 +25,12 @@ #include "ble_handlers.h" #include "pd.h" #include "power.hpp" +#if POW_PD +#include "USBPD.h" +#include "pd.h" +#endif + +extern TickType_t lastMovementTime; int ble_char_read_status_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset) { if (attr == NULL || attr->uuid == NULL) { @@ -62,12 +68,122 @@ int ble_char_read_status_callback(struct bt_conn *conn, const struct bt_gatt_att break; case 6: // power src // Todo return enum for current power source + if (getIsPoweredByDCIN()) { + temp = 0; + } else if (USBPowerDelivery::negotiationComplete()) { + temp = 1; + } else { + temp = 2; + } + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + break; + case 7: + // Tip resistance + temp = getTipResistanceX10(); + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + break; + case 8: + // uptime + temp = xTaskGetTickCount() / TICKS_100MS; + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + break; + case 9: + // movement + temp = lastMovementTime / TICKS_100MS; + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + + break; + case 10: + // max temp + temp = TipThermoModel::getTipMaxInC(); + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + break; + case 11: + // raw tip + temp = TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true); + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + break; + case 12: + // hall sensor + { + int16_t hallEffectStrength = getRawHallEffect(); + if (hallEffectStrength < 0) + hallEffectStrength = -hallEffectStrength; + temp = hallEffectStrength; + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); + } + break; + case 13: + // Operating mode + // TODO: Needs tracking + break; + case 14: + // Estimated watts + temp = x10WattHistory.average(); + memcpy(buf, &temp, sizeof(temp)); + return sizeof(temp); break; } MSG("Unhandled attr read %d | %d\n", (uint32_t)attr->uuid, uuid_value); return 0; } +int ble_char_read_bulk_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset) { + if (attr == NULL || attr->uuid == NULL) { + return 0; + } + uint16_t uuid_value = ((struct bt_uuid_16 *)attr->uuid)->val; + // Bulk is the non-const size service + switch (uuid_value) { + case 1: + // Bulk data + { + uint32_t bulkData[] = { + TipThermoModel::getTipInC(), // Current temp + getSettingValue(SettingsOptions::SolderingTemp), // Setpoint + getHandleTemperature(0), // Handle X10 Temp in C + getInputVoltageX10(getSettingValue(SettingsOptions::VoltageDiv), 0), // Input voltage + x10WattHistory.average(), // Estimated Wattage + X10WattsToPWM(x10WattHistory.average()), // Power as PWM level + TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true), // Raw tip + }; + int lenToCopy = sizeof(bulkData) - offset; + if (lenToCopy > len) { + lenToCopy = len; + } + if (lenToCopy < 0) { + lenToCopy = 0; + } + memcpy(buf, ((uint8_t *)bulkData) + offset, lenToCopy); + return lenToCopy; + } + break; + case 2: + // Accelerometer name + // TODO: Need to store non-encoded version + break; + case 3: + // Build + // TODO: Need to store non-encoded version + break; + case 4: + // Device unique id + { + uint64_t id = getDeviceID(); + memcpy(buf, &id, sizeof(id)); + return sizeof(id); + } + break; + } + return 0; +} int ble_char_read_setting_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset) { if (attr == NULL || attr->uuid == NULL) { return 0; diff --git a/source/Core/BSP/Pinecilv2/ble_handlers.h b/source/Core/BSP/Pinecilv2/ble_handlers.h index 546eebca..72446b34 100644 --- a/source/Core/BSP/Pinecilv2/ble_handlers.h +++ b/source/Core/BSP/Pinecilv2/ble_handlers.h @@ -9,6 +9,7 @@ extern "C" { int ble_char_read_status_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset); int ble_char_read_setting_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset); +int ble_char_read_bulk_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset); int ble_char_write_setting_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *buf, u16_t len, u16_t offset, u8_t flags); diff --git a/source/Core/BSP/Pinecilv2/ble_peripheral.c b/source/Core/BSP/Pinecilv2/ble_peripheral.c index ffdaa8ea..78d8e2aa 100644 --- a/source/Core/BSP/Pinecilv2/ble_peripheral.c +++ b/source/Core/BSP/Pinecilv2/ble_peripheral.c @@ -151,6 +151,20 @@ static struct bt_gatt_attr attrs[] = { BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_HANDLE_TEMP, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_POWER_LEVEL, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_POWER_SRC, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_TIP_RES, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_UPTIME, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_MOVEMENT, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_MAX_TEMP, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_RAW_TIP, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_HALL_SENSOR, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_OP_MODE, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_EST_WATTS, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_status_callback, NULL, NULL), + + BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_BULK_DATA), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_BULK_LIVE_DATA, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_bulk_value_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_ACCEL_NAME, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_bulk_value_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_BUILD, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_bulk_value_callback, NULL, NULL), + BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_DEV_ID, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_bulk_value_callback, NULL, NULL), BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_SETTINGS_DATA), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_SAVE, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,