diff --git a/epicardium/ble/card10.c b/epicardium/ble/card10.c index 2105ac02ca03e168fe8711f8c2797799e6801070..dd88134ea42c7cf41068f8462ace811399b26d10 100644 --- a/epicardium/ble/card10.c +++ b/epicardium/ble/card10.c @@ -114,7 +114,7 @@ static const uint8_t UUID_attChar_vibra[] = { /* BLE UUID for card10 char rockets */ static const uint8_t UUID_char_rockets[] = { - ATT_PROP_WRITE_NO_RSP, + ATT_PROP_READ | ATT_PROP_WRITE_NO_RSP, UINT16_TO_BYTES(CARD10_ROCKETS_VAL_HDL), CARD10_UUID_SUFFIX, 0x10, CARD10_UUID_PREFIX }; @@ -123,6 +123,9 @@ static const uint8_t UUID_attChar_rockets[] = { CARD10_UUID_SUFFIX, 0x10, CARD10_UUID_PREFIX }; +static uint8_t rocketsValue[] = { 0, 0, 0 }; +static uint16_t rocketsLen = sizeof(rocketsValue); + /* BLE UUID for card10 led background bottom left */ static const uint8_t UUID_char_led_bg_bottom_left[] = { ATT_PROP_WRITE_NO_RSP, @@ -302,12 +305,14 @@ static const attsAttr_t card10SvcAttrList[] = { .maxLen = sizeof(UUID_char_rockets), .permissions = ATTS_PERMIT_READ }, { .pUuid = UUID_attChar_rockets, - .pValue = NULL, + .pValue = rocketsValue, + .pLen = &rocketsLen, .maxLen = 3 * sizeof(uint8_t), - .settings = ATTS_SET_WRITE_CBACK, + .settings = (ATTS_SET_WRITE_CBACK | ATTS_SET_READ_CBACK), .permissions = (ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC | - ATTS_PERMIT_WRITE_AUTH) }, + ATTS_PERMIT_WRITE_AUTH | ATTS_PERMIT_READ | + ATTS_PERMIT_READ_ENC | ATTS_PERMIT_READ_AUTH) }, // BG LED Bottom left @@ -736,6 +741,17 @@ static uint8_t readCard10CB( APP_TRACE_INFO0("ble-card10: read time\n"); return ATT_SUCCESS; + case CARD10_ROCKETS_VAL_HDL: + pAttr->pValue[0] = epic_leds_get_rocket(0); + pAttr->pValue[1] = epic_leds_get_rocket(1); + pAttr->pValue[2] = epic_leds_get_rocket(2); + APP_TRACE_INFO3( + "ble-card10: get rockets 0:%d, 1:%d, 2:%d\n", + pAttr->pValue[0], + pAttr->pValue[1], + pAttr->pValue[2] + ); + return ATT_SUCCESS; case CARD10_PERSONAL_STATE_VAL_HDL: ui16 = epic_personal_state_get(); *pAttr->pValue = ui16; diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 52c02b9f426e5c07b0499f24478dffcfb53e8271..34c809c9651ffa0f865efc48a4226dfcc3910909 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -95,6 +95,7 @@ typedef _Bool bool; #define API_LEDS_SET_ALL_HSV 0x6b #define API_LEDS_SET_GAMMA_TABLE 0x6c #define API_LEDS_CLEAR_ALL 0x6d +#define API_LEDS_GET_ROCKET 0x6e #define API_VIBRA_SET 0x70 #define API_VIBRA_VIBRATE 0x71 @@ -706,6 +707,24 @@ API(API_LEDS_UPDATE, void epic_leds_update(void)); */ API(API_LEDS_SET_ROCKET, void epic_leds_set_rocket(int led, uint8_t value)); +/** + * Get the brightness of one of the rocket LEDs. + * + * :param int led: Which LED to get. + * + * +-------+--------+----------+ + * | ID | Color | Location | + * +=======+========+==========+ + * | ``0`` | Blue | Left | + * +-------+--------+----------+ + * | ``1`` | Yellow | Top | + * +-------+--------+----------+ + * | ``2`` | Green | Right | + * +-------+--------+----------+ + * :return uint8_t value: Brightness of LED (value between 0 and 31). + */ +API(API_LEDS_GET_ROCKET, uint8_t epic_leds_get_rocket(int led)); + /** * Turn on the bright side LED which can serve as a flashlight if worn on the left wrist or as a rad tattoo illuminator if worn on the right wrist. * diff --git a/epicardium/modules/leds.c b/epicardium/modules/leds.c index 93b80a993717adaa0d058da554e3d7f6433e2dc5..c4e2ef7b0fd99e2875339e999a4d5cf19a0d6a14 100644 --- a/epicardium/modules/leds.c +++ b/epicardium/modules/leds.c @@ -100,6 +100,10 @@ void epic_leds_set_rocket(int led, uint8_t value) value = value > 31 ? 31 : value; pmic_set_led(led, value); } +uint8_t epic_leds_get_rocket(int led) +{ + pmic_get_led(led); +} void epic_set_flashlight(bool power) { diff --git a/lib/card10/pmic.c b/lib/card10/pmic.c index 5927ff55f8cbe7aa6efec7d5920affe44cabcb75..081b32ebca7ca2701c25ab989f80694b576a86a8 100644 --- a/lib/card10/pmic.c +++ b/lib/card10/pmic.c @@ -122,7 +122,18 @@ void pmic_set_button_callback(pmic_button_callback_fn cb) { pmic_button_callback = cb; } - +uint8_t pmic_get_led(uint8_t led) +{ + if (led == 0) { + return MAX77650_getBRT_LED0(); + } + if (led == 1) { + return MAX77650_getBRT_LED1(); + } + if (led == 2) { + return MAX77650_getBRT_LED2(); + } +} void pmic_set_led(uint8_t led, uint8_t val) { if (led == 0) { diff --git a/lib/card10/pmic.h b/lib/card10/pmic.h index f913c99b7342dbe65b389c8172c88d25020cec9a..a3a61d46625b956608a2fe3ef9bbe1fd00e823d7 100644 --- a/lib/card10/pmic.h +++ b/lib/card10/pmic.h @@ -21,6 +21,7 @@ void pmic_init(void); void pmic_set_led(uint8_t led, uint8_t val); +uint8_t pmic_get_led(uint8_t led); void pmic_poll(void); /* weak, so it can be overwritten by applications */