Добавить новую характеристику для светодиодных услуг
Я пытаюсь добавить новую характеристику в свой проект, где я могу включать и выключать led0 и led1. Однако у меня есть несколько сложностей.
Характеристика Led1 не отображается на экране телефона
Я не совсем понимаю или не знаю, как использовать charID (я понимаю, что мне нужно наложить шестнадцатеричный номер на сканер, чтобы изменить его цвет, но я не знаю шестнадцатеричный номер для включения / выключения светодиода)
Кстати, ниже новая характеристика, которую я создаю для включения / выключения светодиодных целей.
вот мой код Тем не менее, это дает мне странное поведение.
project_Zero.c
static void ProjectZero_processLEDServiceCB(uint8_t charID)
{
uint32_t value = 0;
uint8_t redColor, greenColor, blueColor;
switch (PROFILE_ID_CHAR(charID))
{
case LED_CHAR0:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
/* Parsing out the RGB data and adjusting the resulting PWM */
LEDService_getParameter(charID, &value);
redColor = (value & 0xFF);
greenColor = (value & 0xFF00) >> 8;
blueColor = (value & 0xFF0000) >> 16;
PWM_setDuty(pwmRed, PWM_PERIOD_MAX * (redColor / 255.0f));
PWM_setDuty(pwmGreen, PWM_PERIOD_MAX * (greenColor / 255.0f));
PWM_setDuty(pwmBlue, PWM_PERIOD_MAX * (blueColor / 255.0f));
break;
default:
break;
}
break;
case LED_CHAR2:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
/* Parsing out the RGB data and adjusting the resulting PWM */
LEDService_getParameter(charID, &value);
if(value == 0x00){
PWM_setDuty(pwmRed, 0);
PWM_setDuty(pwmGreen, 0);
PWM_setDuty(pwmBlue, 0);
}
else if(value == 0x01){
value = 0xFF0000;
redColor = (value & 0xFF);
greenColor = (value & 0xFF00) >> 8;
blueColor = (value & 0xFF0000) >> 16;
PWM_setDuty(pwmRed, 0);
PWM_setDuty(pwmGreen, 0);
PWM_setDuty(pwmBlue, 0);
}
break;
default:
break;
}
break;
default:
break;
}
}
выше мой код для включения / выключения светодиода. Тем не менее, это дает мне странное поведение для моего списка характеристик
список характеристик
приведенные ниже коды - это то, что я изменяю в ProjectZero, предоставленном simplelink Texas Instrument
led_Service.h
/* Characteristic Types - These must be listed in order that they appear
in service */
#define LED_CHAR0 0x00
#define LED_CHAR1 0x01
#define LED_CHAR2 0x02
#define LS_LED0_ID PROFILE_ID_CREATE(LED_CHAR0,PROFILE_VALUE)
#define LS_LED1_ID PROFILE_ID_CREATE(LED_CHAR1,PROFILE_VALUE)
#define LS_LED2_ID PROFILE_ID_CREATE(LED_CHAR2,PROFILE_VALUE)
/* LED Service UUID */
#define LED_SERVICE_UUID 0x1110
/* LED Characteristic UUIDs */
#define LS_LED0_UUID 0x1111
#define LS_LED0_UUID 0x1111
#define LS_LED1_UUID 0x1112
#define LS_LED2_UUID 0x1113
#define LS_LED0_LEN 1
#define LS_LED1_LEN 1
#define LS_LED2_LEN 1
#define LS_LED0_LEN_MIN 1
#define LS_LED1_LEN_MIN 1
#define LS_LED2_LEN_MIN 1
led_Service.c
/ ************************************************* ****************************** * Атрибуты профиля - TYPEDEFS *************** ************************************************** ************* /
static SAP_Service_t LEDService;
static SAP_CharHandle_t LEDServiceCharHandles[LED_NUM_ATTR_SUPPORTED];
/* Profile Service attribute */
static UUIDType_t LEDServiceDecl =
{ SNP_128BIT_UUID_SIZE, LEDServiceUUID };
/* Characteristic "LED0" Value variable */
static uint8_t ls_LED0Val[LS_LED0_LEN] = {0};
/* Length of data in characteristic "LED0" Value variable, initialized
* to minimal size. */
static uint16_t ls_LED0ValLen = LS_LED0_LEN_MIN;
// Characteristic "LED1" Value variable
static uint8_t ls_LED1Val[LS_LED1_LEN] = {0};
// Длина данных в характеристике "LED1" Значение переменной, инициализированной до минимального размера.
static uint16_t ls_LED1ValLen = LS_LED1_LEN_MIN;
// Characteristic "LED2" Value variable
static uint8_t ls_LED2Val[LS_LED2_LEN] = {0};
// Length of data in characteristic "LED2" Value variable, initialized to minimal size.
static uint16_t ls_LED2ValLen = LS_LED2_LEN_MIN;
/ ************************************************* ****************************** * Атрибуты профиля - ТАБЛИЦА *************** ************************************************** ************* /
static SAP_Char_t LEDAttrTable[LED_NUM_ATTR_SUPPORTED] = {
/* LED0 Characteristic */
{
{ SNP_128BIT_UUID_SIZE, ls_LED0UUID }, /* UUID */
SNP_GATT_PROP_READ | SNP_GATT_PROP_WRITE | SNP_GATT_PROP_WRITE_NORSP,
/* Properties */
SNP_GATT_PERMIT_READ | SNP_GATT_PERMIT_WRITE, /* Permissions */
},
// LED2 Characteristic
{
{ SNP_128BIT_UUID_SIZE, ls_LED2UUID }, /* UUID */
SNP_GATT_PROP_READ | SNP_GATT_PROP_WRITE | SNP_GATT_PROP_WRITE_NORSP, /* Properties */
SNP_GATT_PERMIT_READ | SNP_GATT_PERMIT_WRITE, /* Permissions */
/* User Description */
/* CCCD */
/* Format */
},
};
uint8_t LEDService_setParameter(uint8_t param, uint16_t len, void *value)
{
uint8_t ret = BLE_PROFILE_SUCCESS;
uint8_t *pAttrVal;
uint16_t valMinLen;
uint16_t valMaxLen;
switch (PROFILE_ID_CHAR(param))
{
case LED_CHAR0:
pAttrVal = ls_LED0Val;
valMinLen = LS_LED0_LEN_MIN;
valMaxLen = LS_LED0_LEN;
break;
//Add a case for LED_CHAR2 to LEDService_setParameter
case LED_CHAR2:
pAttrVal = ls_LED2Val;
valMinLen = LS_LED2_LEN_MIN;
valMaxLen = LS_LED2_LEN;
break;
default:
ret = BLE_PROFILE_INVALIDPARAMETER;
break;
}
/* Check bounds, update value and send notification or indication
* if possible. */
if (len <= valMaxLen && len >= valMinLen)
{
memcpy(pAttrVal, value, len);
}
else
{
ret = BLE_PROFILE_INVALID_RANGE;
}
return ret;
}
uint8_t LEDService_getParameter(uint8_t param, void *value) {
uint8_t ret = BLE_PROFILE_SUCCESS;
switch (PROFILE_ID_CHAR(param))
{
case LED_CHAR0:
memcpy(value, ls_LED0Val, ls_LED0ValLen);
break;
//Add a case for LED_CHAR2 to LEDService_getParameter
case LED_CHAR2:
memcpy(value, ls_LED2Val, ls_LED2ValLen);
break;
default:
ret = BLE_PROFILE_INVALIDPARAMETER;
break;
}
return ret;
}
static uint8_t LEDService_ReadAttrCB(void *context, uint16_t conn,
uint16_t charHdl, uint16_t offset, uint16_t size, uint16_t * pLen,
uint8_t *pData) {
/* Get characteristic from handle */
uint8_t charID = ProfileUtil_getCharIDFromHdl(charHdl,
LEDServiceCharHandles,
LED_NUM_ATTR_SUPPORTED);
uint8_t isValid = 0;
/* Find settings for the characteristic to be read. */
switch (PROFILE_ID_CHAR(charID))
{
case LED_CHAR0:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
*pLen = sizeof(ls_LED0Val);
memcpy(pData, ls_LED0Val, sizeof(ls_LED0Val));
isValid = 1;
break;
/* Other considerations for LED0 can be inserted here */
default:
break;
}
break;
case LED_CHAR2:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
*pLen = sizeof(ls_LED2Val);
memcpy(pData, ls_LED2Val, sizeof(ls_LED2Val));
isValid = 1;
break;
/* Other considerations for LED2 can be inserted here */
default:
break;
}
break;
default:
break;
}
if (isValid)
{
return (SNP_SUCCESS);
}
/* Unable to find handle - set len to 0 and return error code */
*pLen = 0;
return (SNP_UNKNOWN_ATTRIBUTE);
}
static uint8_t LEDService_WriteAttrCB(void *context, uint16_t conn,
uint16_t charHdl, uint16_t len, uint8_t *pData) {
uint8_t status = SNP_UNKNOWN_ATTRIBUTE;
uint8_t notifyApp = PROFILE_UNKNOWN_CHAR;
/* Get characteristic from handle */
uint8_t charID = ProfileUtil_getCharIDFromHdl(charHdl,
LEDServiceCharHandles,
LED_NUM_ATTR_SUPPORTED);
/* Find settings for the characteristic to be read. */
switch (PROFILE_ID_CHAR(charID))
{
case LED_CHAR0:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
if (len == sizeof(ls_LED0Val))
{
memcpy(ls_LED0Val, pData, sizeof(ls_LED0Val));
status = SNP_SUCCESS;
notifyApp = LS_LED0_ID;
}
break;
/* Other considerations for LED1 can be inserted here */
default:
break;
}
break;
case LED_CHAR2:
switch (PROFILE_ID_CHARTYPE(charID))
{
case PROFILE_VALUE:
if (len == sizeof(ls_LED2Val))
{
memcpy(ls_LED2Val, pData, sizeof(ls_LED2Val));
status = SNP_SUCCESS;
notifyApp = LS_LED2_ID;
}
break;
/* Other considerations for LED2 can be inserted here */
default:
break;
}
break;
default:
break;
}
/* If a characteristic value changed then callback function to notify
application of change */
if ((notifyApp != PROFILE_UNKNOWN_CHAR)
&& ledServiceCallbacks->charChangeCB != NULL)
{
ledServiceCallbacks->charChangeCB(notifyApp);
}
return status;
}
Кроме того, я хотел вызвать функцию, которая принимает 32-битное целое число и создать шаблон светодиода, но я не уверен, куда мне нужно поместить функцию.
void int_to_arr(uint32_t x,int number_bit){
.... //codes for creating pattern for the led
}