/********************************************************************* * @fn Data_Service_ReadAttrCB * * @brief Read an attribute. * * @param connHandle - connection message was received on * @param pAttr - pointer to attribute * @param pValue - pointer to data to be read * @param pLen - length of data to be read * @param offset - offset of the first octet to be read * @param maxLen - maximum length of data to be read * @param method - type of read message * * @return SUCCESS, blePending or Failure */ static bStatus_t Data_Service_ReadAttrCB( uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method ) { bStatus_t status = SUCCESS; uint16_t valueLen; uint8_t paramID = 0xFF; // Find settings for the characteristic to be read. paramID = Data_Service_findCharParamId( pAttr ); switch ( paramID ) { case DS_STRING_ID: valueLen = ds_StringValLen; Log_info4("ReadAttrCB : %s connHandle: %d offset: %d method: 0x%02x", (IArg)"String", (IArg)connHandle, (IArg)offset, (IArg)method); /* Other considerations for String can be inserted here */ break; case DS_STREAM_ID: valueLen = ds_StreamValLen; Log_info4("ReadAttrCB : %s connHandle: %d offset: %d method: 0x%02x", (IArg)"Stream", (IArg)connHandle, (IArg)offset, (IArg)method); /* Other considerations for Stream can be inserted here */ break; default: Log_error0("Attribute was not found."); return ATT_ERR_ATTR_NOT_FOUND; } // Check bounds and return the value if ( offset > valueLen ) // Prevent malicious ATT ReadBlob offsets. { Log_error0("An invalid offset was requested."); status = ATT_ERR_INVALID_OFFSET; } else { *pLen = MIN(maxLen, valueLen - offset); // Transmit as much as possible memcpy(pValue, pAttr->pValue + offset, *pLen); } return status; }
void Clock::tick() { ticks++; if ((getId() == 1) || (getId() == 2)) { Log_info4("id %d : %d:%d:%d", getId(), hour, minute, second); Log_info5("id %d : %s %d, %d%d", getId(), (IArg)months[month-1], day, century, year); } /* * Change selected function to alter clock rate */ // setMicrosecond(); // setMillisecond(); setSecond(); // setMinute(); // setDay(); return; }