diff --git a/epicardium/ble/card10.c b/epicardium/ble/card10.c index ab562db28b448493238a1c234c8cdcf9a96f0716..d49b9a21fabe0dec30ad7536364ed044f44d3026 100644 --- a/epicardium/ble/card10.c +++ b/epicardium/ble/card10.c @@ -59,6 +59,9 @@ enum { /*!< \brief flashlight characteristic */ CARD10_FLASHLIGHT_CH_HDL, CARD10_FLASHLIGHT_VAL_HDL, + /*!< \brief flashlight characteristic */ + CARD10_PERSONAL_STATE_CH_HDL, + CARD10_PERSONAL_STATE_VAL_HDL, /*!< \brief leds above characteristic */ CARD10_LEDS_ABOVE_CH_HDL, CARD10_LEDS_ABOVE_VAL_HDL, @@ -204,6 +207,20 @@ static const uint8_t UUID_attChar_flashlight[] = { CARD10_UUID_SUFFIX, 0x18, CARD10_UUID_PREFIX }; +/* BLE UUID for card10 personal state */ +static const uint8_t UUID_char_personal_state[] = { + ATT_PROP_READ | ATT_PROP_WRITE, + UINT16_TO_BYTES(CARD10_PERSONAL_STATE_VAL_HDL), + CARD10_UUID_SUFFIX, 0x19, CARD10_UUID_PREFIX +}; + +static const uint8_t UUID_attChar_personal_state[] = { + CARD10_UUID_SUFFIX, 0x19, CARD10_UUID_PREFIX +}; + +static uint8_t personalStateValue = 0; +static uint16_t personalStateLen = sizeof(personalStateValue); + /* BLE UUID for card10 above leds */ static const uint8_t UUID_char_leds_above[] = { ATT_PROP_WRITE_NO_RSP, @@ -443,6 +460,27 @@ static const attsAttr_t card10SvcAttrList[] = ATTS_PERMIT_WRITE_AUTH) }, + // personal state + + { + .pUuid = attChUuid, + .pValue = (uint8_t *) UUID_char_personal_state, + .pLen = (uint16_t *) &UUID_char_len, + .maxLen = sizeof(UUID_char_personal_state), + .permissions = ATTS_PERMIT_READ + }, + { + .pUuid = UUID_attChar_personal_state, + .pValue = &personalStateValue, + .pLen = &personalStateLen, + .maxLen = sizeof(uint16_t), + .settings = (ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK), + .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 { @@ -461,7 +499,7 @@ static const attsAttr_t card10SvcAttrList[] = ATTS_PERMIT_WRITE_AUTH) }, - // ABOVE LEDS + // Light sensor { .pUuid = attChUuid, @@ -654,6 +692,41 @@ static uint8_t writeCard10CB( epic_set_flashlight(pValue[0]); APP_TRACE_INFO1("set flashlight to: %d\n", pValue[0]); return ATT_SUCCESS; + // personal state + case CARD10_PERSONAL_STATE_VAL_HDL: + BYTES_TO_UINT16(ui16, pValue); + if (ui16 <= STATE_MAX) { + if (operation == ATT_PDU_WRITE_CMD || + operation == ATT_PDU_SIGNED_WRITE_CMD || + operation == ATT_PDU_WRITE_REQ || + operation == ATT_PDU_EXEC_WRITE_REQ) { + epic_personal_state_set(ui16, true); + APP_TRACE_INFO1( + "ble-card10: set personal state to: %d\n", + ui16 + ); + return ATT_SUCCESS; + } else if (operation == ATT_PDU_PREP_WRITE_REQ) { + APP_TRACE_INFO1( + "ble_card10: personal state would be okay: %d\n", + ui16 + ); + return ATT_SUCCESS; + } else { + APP_TRACE_INFO1( + "ble-card10: personal state with unknown operation: %d\n", + operation + ); + return ATT_ERR_INVALID_PDU; + } + } else { + APP_TRACE_INFO2( + "ble-card: personal state invalid value (0-%d): %d\n", + STATE_MAX - 1, + ui16 + ); + return ATT_ERR_RANGE; + } // leds above case CARD10_LEDS_ABOVE_VAL_HDL: for (ui16 = 0; ui16 < 11; ui16++) { @@ -693,6 +766,11 @@ static uint8_t readCard10CB( uint16_t ui16 = 0; switch (handle) { + case CARD10_PERSONAL_STATE_VAL_HDL: + ui16 = epic_personal_state_get(); + *pAttr->pValue = ui16; + APP_TRACE_INFO1("ble-card10: read personal state: %d\n", ui16); + return ATT_SUCCESS; case CARD10_LIGHT_SENSOR_VAL_HDL: epic_light_sensor_get(&ui16); *pAttr->pValue = ui16; diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 043b0e4bac8745a02dc0ae97ff29a61e135f9810..08f5ff97b7eaad401e360875c5bd8cd040f9a704 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -820,6 +820,8 @@ enum personal_state { STATE_COMMUNICATION = 3, /** ``4``, "camp" - I am focussed on self-, camp-, or community maintenance - yellow led, fade on and off. */ STATE_CAMP = 4, + /** STATE_MAX gives latest value and count of possible STATEs**/ + STATE_MAX = 5, }; /**