Добавить новую характеристику для светодиодных услуг

Я пытаюсь добавить новую характеристику в свой проект, где я могу включать и выключать led0 и led1. Однако у меня есть несколько сложностей.

  1. Характеристика Led1 не отображается на экране телефона

  2. Я не совсем понимаю или не знаю, как использовать 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
  }

0 ответов

Другие вопросы по тегам