Skip to content
Snippets Groups Projects
Commit 956c9c91 authored by rahix's avatar rahix
Browse files

Merge 'BLE cleanups and security updates'

See merge request !244
parents 53297345 31ef150a
No related branches found
No related tags found
1 merge request!244BLE: Some cleanups and security updates
Pipeline #3633 passed
...@@ -256,228 +256,272 @@ static uint16_t initLightSensorLen = sizeof(initLightSensorValue); ...@@ -256,228 +256,272 @@ static uint16_t initLightSensorLen = sizeof(initLightSensorValue);
*/ */
static const attsAttr_t card10SvcAttrList[] = { static const attsAttr_t card10SvcAttrList[] = {
{ .pUuid = attPrimSvcUuid, {
.pValue = (uint8_t *)UUID_svc, .pUuid = attPrimSvcUuid,
.pLen = (uint16_t *)&UUID_len, .pValue = (uint8_t *)UUID_svc,
.maxLen = sizeof(UUID_svc), .pLen = (uint16_t *)&UUID_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_svc),
.permissions = ATTS_PERMIT_READ,
},
// TIME // TIME
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_time, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_time,
.maxLen = sizeof(UUID_char_time), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_time),
{ .pUuid = UUID_attChar_time, .permissions = ATTS_PERMIT_READ,
.pValue = timeValue, },
.pLen = &timeLen, {
.maxLen = sizeof(uint64_t), .pUuid = UUID_attChar_time,
.settings = (ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK), .pValue = timeValue,
.permissions = .pLen = &timeLen,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint64_t),
ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ | .settings = ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK,
ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH) }, .permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ |
ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH,
},
// VIBRA // VIBRA
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_vibra, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_vibra,
.maxLen = sizeof(UUID_char_vibra), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_vibra),
{ .pUuid = UUID_attChar_vibra, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = sizeof(uint16_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_vibra,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint16_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// ROCKETS // ROCKETS
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_rockets, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_rockets,
.maxLen = sizeof(UUID_char_rockets), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_rockets),
{ .pUuid = UUID_attChar_rockets, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_rockets,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// BG LED Bottom left // BG LED Bottom left
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_led_bg_bottom_left, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_led_bg_bottom_left,
.maxLen = sizeof(UUID_char_led_bg_bottom_left), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_led_bg_bottom_left),
{ .pUuid = UUID_attChar_led_bg_bottom_left, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_led_bg_bottom_left,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// BG LED Bottom right // BG LED Bottom right
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_led_bg_bottom_right, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_led_bg_bottom_right,
.maxLen = sizeof(UUID_char_led_bg_bottom_right), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_led_bg_bottom_right),
{ .pUuid = UUID_attChar_led_bg_bottom_right, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_led_bg_bottom_right,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// BG LED top right // BG LED top right
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_led_bg_top_right, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_led_bg_top_right,
.maxLen = sizeof(UUID_char_led_bg_top_right), .pLen = (uint16_t *)&UUID_char_len,
.settings = 0, .maxLen = sizeof(UUID_char_led_bg_top_right),
.permissions = ATTS_PERMIT_READ }, .settings = 0,
{ .pUuid = UUID_attChar_led_bg_top_right, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_led_bg_top_right,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// BG LED top left // BG LED top left
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_led_bg_top_left, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_led_bg_top_left,
.maxLen = sizeof(UUID_char_led_bg_top_left), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_led_bg_top_left),
{ .pUuid = UUID_attChar_led_bg_top_left, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_led_bg_top_left,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// Dim bottom module // Dim bottom module
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_leds_bottom_dim, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_leds_bottom_dim,
.maxLen = sizeof(UUID_char_leds_bottom_dim), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_leds_bottom_dim),
{ .pUuid = UUID_attChar_leds_bottom_dim, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.pLen = 0, {
.maxLen = sizeof(uint8_t), .pUuid = UUID_attChar_leds_bottom_dim,
.settings = ATTS_SET_WRITE_CBACK, .pValue = NULL,
.permissions = .pLen = 0,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// Dim top module // Dim top module
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_leds_top_dim, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_leds_top_dim,
.maxLen = sizeof(UUID_char_leds_top_dim), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_leds_top_dim),
{ .pUuid = UUID_attChar_leds_top_dim, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_leds_top_dim,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// led powersafe // led powersafe
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_led_powersafe, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_led_powersafe,
.maxLen = sizeof(UUID_char_led_powersafe), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_led_powersafe),
{ .pUuid = UUID_attChar_led_powersafe, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_led_powersafe,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// flashlight // flashlight
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_flashlight, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_flashlight,
.maxLen = sizeof(UUID_char_flashlight), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_flashlight),
{ .pUuid = UUID_attChar_flashlight, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_flashlight,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// personal state // personal state
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_personal_state, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_personal_state,
.maxLen = sizeof(UUID_char_personal_state), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_personal_state),
{ .pUuid = UUID_attChar_personal_state, .permissions = ATTS_PERMIT_READ,
.pValue = &personalStateValue, },
.pLen = &personalStateLen, {
.maxLen = sizeof(uint16_t), .pUuid = UUID_attChar_personal_state,
.settings = (ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK), .pValue = &personalStateValue,
.permissions = .pLen = &personalStateLen,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = sizeof(uint16_t),
ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ | .settings = ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK,
ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH) }, .permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ |
ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH,
},
// ABOVE LEDS // ABOVE LEDS
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_leds_above, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_leds_above,
.maxLen = sizeof(UUID_char_leds_above), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_leds_above),
{ .pUuid = UUID_attChar_leds_above, .permissions = ATTS_PERMIT_READ,
.pValue = NULL, },
.maxLen = 11 * 3 * sizeof(uint8_t), {
.settings = ATTS_SET_WRITE_CBACK, .pUuid = UUID_attChar_leds_above,
.permissions = .pValue = NULL,
(ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | .maxLen = 11 * 3 * sizeof(uint8_t),
ATTS_PERMIT_WRITE_AUTH) }, .settings = ATTS_SET_WRITE_CBACK,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
// Light sensor // Light sensor
{ .pUuid = attChUuid, {
.pValue = (uint8_t *)UUID_char_light_sensor, .pUuid = attChUuid,
.pLen = (uint16_t *)&UUID_char_len, .pValue = (uint8_t *)UUID_char_light_sensor,
.maxLen = sizeof(UUID_char_light_sensor), .pLen = (uint16_t *)&UUID_char_len,
.permissions = ATTS_PERMIT_READ }, .maxLen = sizeof(UUID_char_light_sensor),
{ .pUuid = UUID_attChar_light_sensor, .permissions = ATTS_PERMIT_READ,
.pValue = initLightSensorValue, },
.pLen = &initLightSensorLen, {
.maxLen = sizeof(uint8_t), .pUuid = UUID_attChar_light_sensor,
.settings = ATTS_SET_READ_CBACK, .pValue = initLightSensorValue,
.permissions = .pLen = &initLightSensorLen,
(ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC | .maxLen = sizeof(uint8_t),
ATTS_PERMIT_READ_AUTH) }, .settings = ATTS_SET_READ_CBACK,
.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
ATTS_PERMIT_READ_AUTH,
},
}; };
// validating, that the service really get all charateristics // validating, that the service really get all charateristics
......
...@@ -143,7 +143,8 @@ static const attsAttr_t fileTransCfgList[] = { ...@@ -143,7 +143,8 @@ static const attsAttr_t fileTransCfgList[] = {
.pLen = NULL, .pLen = NULL,
.maxLen = 128, .maxLen = 128,
.settings = ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, .settings = ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_AUTH, .permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
}, },
/* File transfer Central RX characteristic */ /* File transfer Central RX characteristic */
{ {
...@@ -161,7 +162,8 @@ static const attsAttr_t fileTransCfgList[] = { ...@@ -161,7 +162,8 @@ static const attsAttr_t fileTransCfgList[] = {
.pLen = &attRxChConfigValue_len, .pLen = &attRxChConfigValue_len,
.maxLen = sizeof(attRxChConfigValue), .maxLen = sizeof(attRxChConfigValue),
.settings = ATTS_SET_VARIABLE_LEN, .settings = ATTS_SET_VARIABLE_LEN,
.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_AUTH, .permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
ATTS_PERMIT_READ_AUTH,
}, },
/* File transfer Central RX notification channel */ /* File transfer Central RX notification channel */
{ {
...@@ -170,8 +172,9 @@ static const attsAttr_t fileTransCfgList[] = { ...@@ -170,8 +172,9 @@ static const attsAttr_t fileTransCfgList[] = {
.pLen = &attRxChConfigValue_len, .pLen = &attRxChConfigValue_len,
.maxLen = sizeof(attRxChConfigValue), .maxLen = sizeof(attRxChConfigValue),
.settings = ATTS_SET_CCC, .settings = ATTS_SET_CCC,
.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_AUTH | .permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_AUTH, ATTS_PERMIT_READ_AUTH | ATTS_PERMIT_WRITE |
ATTS_PERMIT_WRITE_ENC | ATTS_PERMIT_WRITE_AUTH,
}, },
}; };
......
...@@ -31,66 +31,84 @@ enum { UART_SVC_HDL = UART_START_HDL, /*!< \brief UART service declaration */ ...@@ -31,66 +31,84 @@ enum { UART_SVC_HDL = UART_START_HDL, /*!< \brief UART service declaration */
/* clang-format off */ /* clang-format off */
static const uint8_t UARTSvc[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x01,0x00,0x40,0x6E}; static const uint8_t UARTSvc[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x01,0x00,0x40,0x6E};
static const uint16_t UARTSvc_len = sizeof(UARTSvc);
static const uint8_t uartRxCh[] = {ATT_PROP_WRITE, UINT16_TO_BYTES(UART_RX_HDL), 0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x02,0x00,0x40,0x6E}; static const uint8_t uartRxCh[] = {ATT_PROP_WRITE, UINT16_TO_BYTES(UART_RX_HDL), 0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x02,0x00,0x40,0x6E};
const uint8_t attUartRxChUuid[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5, 0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x02,0x00,0x40,0x6E}; static const uint16_t uartRxCh_len = sizeof(uartRxCh);
static const uint8_t attUartRxChUuid[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5, 0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x02,0x00,0x40,0x6E};
static const uint8_t uartTxCh[] = {ATT_PROP_READ | ATT_PROP_NOTIFY, UINT16_TO_BYTES(UART_TX_HDL), 0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x03,0x00,0x40,0x6E}; static const uint8_t uartTxCh[] = {ATT_PROP_READ | ATT_PROP_NOTIFY, UINT16_TO_BYTES(UART_TX_HDL), 0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x03,0x00,0x40,0x6E};
const uint8_t attUartTxChUuid[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5, 0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x03,0x00,0x40,0x6E}; static const uint16_t uartTxCh_len = sizeof(uartTxCh);
/* clang-format on */ static const uint8_t attUartTxChUuid[] = {0x9E,0xCA,0xDC,0x24,0x0E,0xE5, 0xA9,0xE0,0x93,0xF3,0xA3,0xB5,0x03,0x00,0x40,0x6E};
static void *SvcUARTAddGroupDyn(void) static uint8_t ble_uart_tx_buf[128];
{ static uint16_t ble_uart_buf_tx_fill = 0;
void *pSHdl; /* clang-format on */
uint8_t initCcc[] = { UINT16_TO_BYTES(0x0000) };
/* Create the service */
pSHdl = AttsDynCreateGroup(UART_START_HDL, UART_END_HDL);
if (pSHdl != NULL) {
/* clang-format off */
/* Primary service */
AttsDynAddAttrConst( pSHdl, attPrimSvcUuid, UARTSvc, sizeof(UARTSvc),
0, ATTS_PERMIT_READ);
/* UART rx characteristic */
AttsDynAddAttrConst( pSHdl, attChUuid, uartRxCh, sizeof(uartRxCh),
0, ATTS_PERMIT_READ);
// XXX: attUartRxChUuid is 16 bytes but nothing says so....
/* UART rx value */
// XXX: not sure if max value of 128 is fine...
AttsDynAddAttr( pSHdl, attUartRxChUuid, NULL, 0, 128,
ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, ATTS_PERMIT_WRITE);
/* UART tx characteristic */
AttsDynAddAttrConst( pSHdl, attChUuid, uartTxCh, sizeof(uartTxCh),
0, ATTS_PERMIT_READ);
/* UART tx value */
/* TODO: do we need ATTS_SET_READ_CBACK ? */
AttsDynAddAttr( pSHdl, attUartTxChUuid, NULL, 0, sizeof(uint8_t),
ATTS_SET_READ_CBACK, ATTS_PERMIT_READ);
/* UART tx CCC descriptor */
AttsDynAddAttr( pSHdl, attCliChCfgUuid, initCcc, sizeof(uint16_t), sizeof(uint16_t),
ATTS_SET_CCC, ATTS_PERMIT_READ | ATTS_PERMIT_WRITE);
/* clang-format on */
}
return pSHdl; /* Attribute list for uriCfg group */
} static const attsAttr_t uartAttrCfgList[] = {
/* Primary service */
{
.pUuid = attPrimSvcUuid,
.pValue = (uint8_t *)UARTSvc,
.pLen = (uint16_t *)&UARTSvc_len,
.maxLen = sizeof(UARTSvc),
.settings = 0,
.permissions = ATTS_PERMIT_READ,
},
/* UART rx characteristic */
{
.pUuid = attChUuid,
.pValue = (uint8_t *)uartRxCh,
.pLen = (uint16_t *)&uartRxCh_len,
.maxLen = sizeof(uartRxCh),
.settings = 0,
.permissions = ATTS_PERMIT_READ,
},
/* UART rx value */
{
.pUuid = attUartRxChUuid,
.pValue = NULL,
.pLen = NULL,
.maxLen = 128,
.settings = ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH,
},
/* UART tx characteristic */
{
.pUuid = attChUuid,
.pValue = (uint8_t *)uartTxCh,
.pLen = (uint16_t *)&uartTxCh_len,
.maxLen = sizeof(uartTxCh),
.settings = 0,
.permissions = ATTS_PERMIT_READ,
},
/* UART tx value */
{
.pUuid = attUartTxChUuid,
.pValue = ble_uart_tx_buf,
.pLen = &ble_uart_buf_tx_fill,
.maxLen = sizeof(ble_uart_tx_buf),
.settings = 0,
.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
ATTS_PERMIT_READ_AUTH,
},
/* UART tx CCC descriptor */
{
.pUuid = attCliChCfgUuid,
.pValue = NULL,
.pLen = NULL,
.maxLen = 0,
.settings = ATTS_SET_CCC,
.permissions = ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC |
ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ |
ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH,
},
};
dmConnId_t active_connection = 0; dmConnId_t active_connection = 0;
static uint8_t UARTReadCback(
dmConnId_t connId,
uint16_t handle,
uint8_t operation,
uint16_t offset,
attsAttr_t *pAttr
) {
printf("read callback\n");
return ATT_SUCCESS;
}
static uint8_t UARTWriteCback( static uint8_t UARTWriteCback(
dmConnId_t connId, dmConnId_t connId,
uint16_t handle, uint16_t handle,
...@@ -119,8 +137,6 @@ static uint8_t UARTWriteCback( ...@@ -119,8 +137,6 @@ static uint8_t UARTWriteCback(
return ATT_SUCCESS; return ATT_SUCCESS;
} }
static uint8_t ble_uart_tx_buf[128];
static uint8_t ble_uart_buf_tx_fill;
static int ble_uart_lasttick = 0; static int ble_uart_lasttick = 0;
void ble_uart_write(uint8_t *pValue, uint8_t len) void ble_uart_write(uint8_t *pValue, uint8_t len)
...@@ -134,11 +150,6 @@ void ble_uart_write(uint8_t *pValue, uint8_t len) ...@@ -134,11 +150,6 @@ void ble_uart_write(uint8_t *pValue, uint8_t len)
if (ble_uart_buf_tx_fill == 128 || pValue[i] == '\r' || if (ble_uart_buf_tx_fill == 128 || pValue[i] == '\r' ||
pValue[i] == '\n') { pValue[i] == '\n') {
if (ble_uart_buf_tx_fill > 0) { if (ble_uart_buf_tx_fill > 0) {
AttsSetAttr(
UART_TX_HDL,
ble_uart_buf_tx_fill,
ble_uart_tx_buf
);
if (active_connection) { if (active_connection) {
int x = xTaskGetTickCount() - int x = xTaskGetTickCount() -
ble_uart_lasttick; ble_uart_lasttick;
...@@ -165,11 +176,15 @@ void ble_uart_write(uint8_t *pValue, uint8_t len) ...@@ -165,11 +176,15 @@ void ble_uart_write(uint8_t *pValue, uint8_t len)
} }
} }
static attsGroup_t uartCfgGroup = {
.pAttr = (attsAttr_t *)uartAttrCfgList,
.writeCback = UARTWriteCback,
.startHandle = UART_START_HDL,
.endHandle = UART_END_HDL,
};
void bleuart_init(void) void bleuart_init(void)
{ {
/* Add the UART service dynamically */ /* Add the UART service */
void *pSHdl; AttsAddGroup(&uartCfgGroup);
pSHdl = SvcUARTAddGroupDyn();
AttsDynRegister(pSHdl, UARTReadCback, UARTWriteCback);
//AttsDynRegister(pSHdl, NULL, UARTWriteCback);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment