예제 #1
0
extern void BatteryUpdateLevel(uint16 ucid)
{
    uint8 old_vbat;
    uint8 cur_bat_level;

    /* Read the battery level */
    cur_bat_level = readBatteryLevel();

    old_vbat = (g_batt_data.level);

    /* If the current and old battery level are not same, update the 
     * connected host if notifications are configured.
     */
    if(old_vbat != cur_bat_level)
    {
        if((ucid != GATT_INVALID_UCID) &&
           (g_batt_data.level_client_config & gatt_client_config_notification))
        {

            GattCharValueNotification(ucid, 
                                      HANDLE_BATT_LEVEL, 
                                      1, &cur_bat_level);
            
            /* Update Battery Level characteristic in database */
            g_batt_data.level = cur_bat_level;
        }
    }
}
예제 #2
0
extern void HidSendInputReport(uint16 ucid, uint8 report_id, uint8 *report)
{
    switch(report_id)
    {
        case HID_INPUT_REPORT_ID:
        {
            uint16 data_length = ATTR_LEN_HID_INPUT_REPORT;

            /* If boot mode is enabled, change the length of the report */
            if(!hid_data.report_mode)
            {
                data_length = ATTR_LEN_HID_BOOT_INPUT_REPORT;
            }
            GattCharValueNotification(ucid,
                              hid_data.input_report_handle,
                              data_length,
                              report);
        }
        break;
    
        /* More cases can be added if the mouse supports more types of
         * reports.
         */
    }
}
예제 #3
0
extern void HeartRateSendMeasValue(uint16 ucid, uint8 hrm_length, 
                                   uint8 *p_hr_meas)
{
int i = 0;
     
    /*if(credits < 8)
        return;
        
    meas_report[1] = test++;

    uint16 testy  =  AioRead((aio_select) 1);
    meas_report[1] = testy;
    uint16* add = &testy;
    add++;
    meas_report[2] = *add;*/    

    
    
    for (i = 0; i < 1; i++) {
       /*DebugWriteString("\n\rTransmit.."); */
       GattCharValueNotification(ucid, 
              HANDLE_EEG_MEASUREMENT, 
              (uint16)16, 
              meas_report);   
       credits--;
    }
    /*credits = 0;*/

}
extern void BatteryUpdateLevel(uint16 ucid)
{
    uint8 old_vbat;
    uint8 cur_bat_level;

    /* Read the battery level and status */
    cur_bat_level = readBatteryLevel();

    old_vbat = (g_batt_data.level);

    /* check if the current and old battery level are same or not. Notify 
     * battery level only if they are different.
     */
    if(old_vbat != cur_bat_level)
    {

        if((ucid != GATT_INVALID_UCID) && AppIsLinkEncrypted() &&
          (g_batt_data.level_client_config == gatt_client_config_notification))
        {

            /* Update battery level characteristic in database */
            g_batt_data.level = cur_bat_level;

            GattCharValueNotification(ucid, 
                                      HANDLE_BATT_LEVEL, 
                                      1, &cur_bat_level);
        }
    }
}
extern void HeartRateSendMeasValue(uint16 ucid, uint8 hrm_length, 
                                   uint8 *p_hr_meas)
{
    /*  Send a notification of the HR Measurement value */
    GattCharValueNotification(ucid, 
                              HANDLE_HEART_RATE_MEASUREMENT, 
                              (uint16)hrm_length, 
                              p_hr_meas);  /* heart rate */
}
extern void ScanParamRefreshNotify(uint16 ucid)
{
    uint8 value = SERVER_REQUIRES_REFRESH;

    if(scan_param_data.refresh_client_config & gatt_client_config_notification)
    {
        GattCharValueNotification(ucid, 
                              HANDLE_SCAN_REFRESH, 
                              1, &value);
    }

}
예제 #7
0
/*-----------------------------------------------------------------------------*
 *  NAME
 *      OtaHandleAccessWrite
 *
 *  DESCRIPTION
 *      Handle write-access requests from the Host where the characteristic
 *      handle falls within the range of the OTAU Application Service.
 *
 *  PARAMETERS
 *      p_ind [in]              Write request data
 *
 *  RETURNS
 *      Nothing
 *----------------------------------------------------------------------------*/
void OtaHandleAccessWrite(GATT_ACCESS_IND_T *p_ind)
{
    sys_status  rc = gatt_status_write_not_permitted;
                                    /* Function status */
        
    switch (p_ind->handle)
    {
        case HANDLE_CSR_OTA_CURRENT_APP:
        {
            /* Set the index of the current application */
            const uint8 app_id = p_ind->value[0];
                                            /* New application index */
#if defined(USE_STATIC_RANDOM_ADDRESS) || defined(USE_RESOLVABLE_RANDOM_ADDRESS)
            BD_ADDR_T   bd_addr;            /* Bluetooth Device address */

            GapGetRandomAddress(&bd_addr);
#endif /* USE_STATIC_RANDOM_ADDRESS || USE_RESOLVABLE_RANDOM_ADDRESS */
            
            rc = OtaWriteCurrentApp(app_id,
                                    IS_BONDED,
                                    &(CONN_HOST_ADDR),
                                    LINK_DIVERSIFIER,
#if defined(USE_STATIC_RANDOM_ADDRESS) || defined(USE_RESOLVABLE_RANDOM_ADDRESS)
                                    &bd_addr,
#else
                                    NULL,
#endif
                                    CONNECTION_IRK,
                                    GattServiceChangedIndActive());
            if (rc != sys_status_success)
            {
                /* Sanitise the result. If OtaWriteCurrentApp fails it will be
                 * because one or more of the supplied parameters was invalid.
                 */
                rc = gatt_status_invalid_param_value;
            }
        }
            break;
            
        case HANDLE_CSR_OTA_READ_CS_BLOCK:
            /* Set the offset and length of a block of CS to read */
            
            /* Validate input (expecting uint16[2]) */
            if (p_ind->size_value == WORDS_TO_BYTES(sizeof(uint16[2])))
            {
                const uint16 offset = BufReadUint16(&p_ind->value);
                
                data_transfer_data_length = (uint8)BufReadUint16(&p_ind->value);
            
                rc = readCsBlock(offset,
                                 data_transfer_data_length,
                                 data_transfer_memory);
            }
            else
            {
                rc = gatt_status_invalid_length;
            }
            break;
            
        case HANDLE_CSR_OTA_DATA_TRANSFER_CLIENT_CONFIG:
        {
            /* Modify the Data Transfer Client Characteristic Configuration
             * Descriptor
             */
            const uint16 client_config = BufReadUint16(&p_ind->value);
                                            /* Requested descriptor value */

            if((client_config == gatt_client_config_notification) ||
               (client_config == gatt_client_config_none))
            {
                data_transfer_configuration[0] = client_config;
                rc = sys_status_success;
            }
            else
            {
                /* INDICATION or RESERVED */

                /* Return error as only notifications are supported */
                rc = gatt_status_desc_improper_config;
            }
        }
            break;
            
        default:
            /* Writing to this characteristic is not permitted */
            break;
    }
 
    GattAccessRsp(p_ind->cid, p_ind->handle, rc, 0, NULL);
    
    /* Perform any follow-up actions */
    if (rc == sys_status_success)
    {
        switch (p_ind->handle)
        {
            case HANDLE_CSR_OTA_READ_CS_BLOCK:
                /* If this write action was to trigger a CS key read and
                 * notifications have been enabled send the result now.
                 */
                if (data_transfer_configuration[0] ==
                                                gatt_client_config_notification)
                {
                    GattCharValueNotification(CONNECTION_CID, 
                                              HANDLE_CSR_OTA_DATA_TRANSFER, 
                                              data_transfer_data_length,
                                              data_transfer_memory);
                }
                break;

            case HANDLE_CSR_OTA_CURRENT_APP:
                /* If a new application index has been requested disconnect from
                 * the Host and reset the device to run the new application.
                 */
                
                /* Record that the GATT database may be different after the
                 * device has reset.
                 */
                GattOnOtaSwitch();
                
                /* When the disconnect confirmation comes in, call OtaReset() */
                g_ota_reset_required = TRUE;

                /* Disconnect from the Host */
                GattDisconnectReq(CONNECTION_CID);
                break;

            default:
                /* No follow up action necessary */
                break;
        }
    }
}