| /*  | 
|  * Copyright Cypress Semiconductor Corporation, 2014-2015 All rights reserved.  | 
|  *  | 
|  * This software, associated documentation and materials ("Software") is  | 
|  * owned by Cypress Semiconductor Corporation ("Cypress") and is  | 
|  * protected by and subject to worldwide patent protection (UnitedStates and foreign), United States copyright laws and international  | 
|  * treaty provisions. Therefore, unless otherwise specified in a separate license agreement between you and Cypress, this Software  | 
|  * must be treated like any other copyrighted material. Reproduction,  | 
|  * modification, translation, compilation, or representation of this  | 
|  * Software in any other form (e.g., paper, magnetic, optical, silicon)  | 
|  * is prohibited without Cypress's express written permission.  | 
|  *  | 
|  * Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY  | 
|  * KIND, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,  | 
|  * NONINFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS  | 
|  * FOR A PARTICULAR PURPOSE. Cypress reserves the right to make changes  | 
|  * to the Software without notice. Cypress does not assume any liability  | 
|  * arising out of the application or use of Software or any product or  | 
|  * circuit described in the Software. Cypress does not authorize its  | 
|  * products for use as critical components in any products where a  | 
|  * malfunction or failure may reasonably be expected to result in  | 
|  * significant injury or death ("High Risk Product"). By including  | 
|  * Cypress's product in a High Risk Product, the manufacturer of such  | 
|  * system or application assumes all risk of such use and in doing so  | 
|  * indemnifies Cypress against all liability.  | 
|  *  | 
|  * Use of this Software may be limited by and subject to the applicable  | 
|  * Cypress software license agreement.  | 
|  *  | 
|  *  | 
|  */  | 
|   | 
|   | 
| #import "AccelerometerModel.h"  | 
| #import "Constants.h"  | 
|   | 
| /*!  | 
|  *  @class AccelerometerModel  | 
|  *  | 
|  *  @discussion Class to handle the accelerometer service related operations  | 
|  *  | 
|  */  | 
|   | 
| @interface AccelerometerModel ()  | 
| {  | 
|     NSMutableArray *XYZCharacteristicsArray;  | 
|     CBCharacteristic *scanIntervalCharacteristic, *sensorTypecharacteristic, *dataAccumulationCharacteristic;  | 
| }  | 
|   | 
| @end  | 
|   | 
|   | 
| @implementation AccelerometerModel  | 
|   | 
| - (instancetype)init  | 
| {  | 
|     self = [super init];  | 
|     if (self) {  | 
|           | 
|         XYZCharacteristicsArray = [[NSMutableArray alloc] init];  | 
|     }  | 
|     return self;  | 
| }  | 
|   | 
| /*!  | 
|  *  @method writeValueForAccelerometerSensorScanInterval:  | 
|  *  | 
|  *  @discussion Method to write value for accelerometer SensorScanInterval  | 
|  *  | 
|  */  | 
| -(void) writeValueForAccelerometerSensorScanInterval:(int) newScanInterval  | 
| {  | 
|     uint8_t val = (uint8_t)newScanInterval; // The value which you want to write.  | 
|     NSData  *valData = [NSData dataWithBytes:(void*)&val length:sizeof(val)];  | 
|     [[[CBMoralManager sharedManager] myPeripheral] writeValue:valData forCharacteristic:scanIntervalCharacteristic type:CBCharacteristicWriteWithoutResponse];  | 
|       | 
|     [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:scanIntervalCharacteristic.UUID] descriptor:nil operation:[NSString stringWithFormat:@"%@%@ %@",WRITE_REQUEST,DATA_SEPERATOR,[Utilities convertDataToLoggerFormat:valData]]];  | 
| }  | 
|   | 
| /*!  | 
|  *  @method writeValueForAccelerometerFilterconfiguration:  | 
|  *  | 
|  *  @discussion Method to write value for accelerometer filter configuration  | 
|  *  | 
|  */  | 
|   | 
| -(void) writeValueForAccelerometerFilterConfiguration:(int) filterconfiguration  | 
| {  | 
|     uint8_t val = (uint8_t)filterconfiguration; // The value which you want to write.  | 
|     NSData  *valData = [NSData dataWithBytes:(void*)&val length:sizeof(val)];  | 
|     [[[CBMoralManager sharedManager] myPeripheral] writeValue:valData forCharacteristic:dataAccumulationCharacteristic type:CBCharacteristicWriteWithoutResponse];  | 
|       | 
|     [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:dataAccumulationCharacteristic.UUID] descriptor:nil operation:[NSString stringWithFormat:@"%@%@ %@",WRITE_REQUEST,DATA_SEPERATOR,[Utilities convertDataToLoggerFormat:valData]]];  | 
| }  | 
|   | 
| /*!  | 
|  *  @method stopUpdate  | 
|  *  | 
|  *  @discussion Method to stop update  | 
|  *  | 
|  */  | 
|   | 
| -(void)stopUpdate  | 
| {  | 
|     [self updateCharacteristicsNotificationStatus:NO];  | 
| }  | 
|   | 
| /*!  | 
|  *  @method getCharacteristicsForAccelerometerService  | 
|  *  | 
|  *  @discussion Method to get the characteristics for accelerometer service  | 
|  *  | 
|  */  | 
|   | 
| -(void) getCharacteristicsForAccelerometerService:(CBService *) service  | 
| {  | 
|     for (CBCharacteristic *characteristic in service.characteristics)  | 
|     {  | 
|         if ([characteristic.UUID isEqual:ACCELEROMETER_READING_X_CHARACTERISTIC_UUID])  | 
|         {  | 
|             [XYZCharacteristicsArray addObject:characteristic];  | 
|         }  | 
|         else if ([characteristic.UUID isEqual:ACCELEROMETER_READING_Y_CHARACTERISTIC_UUID])  | 
|         {  | 
|             [XYZCharacteristicsArray addObject:characteristic];  | 
|         }  | 
|         else if ([characteristic.UUID isEqual:ACCELEROMETER_READING_Z_CHARACTERISTIC_UUID])  | 
|         {  | 
|             [XYZCharacteristicsArray addObject:characteristic];  | 
|         }  | 
|         else if ([characteristic.UUID isEqual:ACCELEROMETER_SENSOR_SCAN_INTERVAL_CHARACTERISTIC_UUID])  | 
|         {  | 
|             scanIntervalCharacteristic = characteristic;  | 
|         }  | 
|         else if ([characteristic.UUID isEqual:ACCELEROMETER_DATA_ACCUMULATION_CHARACTERISTIC_UUID])  | 
|         {  | 
|             dataAccumulationCharacteristic = characteristic;  | 
|         }  | 
|         else if ([characteristic.UUID isEqual:ACCELEROMETER_ANALOG_SENSOR_CHARACTERISTIC_UUID])  | 
|         {  | 
|             sensorTypecharacteristic = characteristic;  | 
|         }  | 
|     }  | 
|       | 
| }  | 
|   | 
| /*!  | 
|  *  @method updateXYZCharacteristics  | 
|  *  | 
|  *  @discussion Method to set notify for accelerometer X,Y and Z values  | 
|  *  | 
|  */  | 
|   | 
| -(void) updateXYZCharacteristics  | 
| {  | 
|     [self updateCharacteristicsNotificationStatus:YES];  | 
| }  | 
|   | 
| /*!  | 
|  *  @method updateCharacteristicsNotificationStatus:  | 
|  *  | 
|  *  @discussion Method to update the notification status of x,y and z characteristics  | 
|  *  | 
|  */  | 
| -(void) updateCharacteristicsNotificationStatus:(BOOL)status  | 
| {  | 
|     if ([XYZCharacteristicsArray count] > 0)  | 
|     {  | 
|         for (CBCharacteristic *characteristic in XYZCharacteristicsArray)  | 
|         {  | 
|             [[[CBMoralManager sharedManager] myPeripheral] setNotifyValue:status forCharacteristic:characteristic];  | 
|               | 
|             if (status)  | 
|             {  | 
|                 [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:characteristic.UUID] descriptor:nil operation:START_NOTIFY];  | 
|             }  | 
|             else  | 
|             {  | 
|                  [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:characteristic.UUID] descriptor:nil operation:STOP_NOTIFY];  | 
|             }  | 
|         }  | 
|     }  | 
| }  | 
|   | 
|   | 
|   | 
| /*!  | 
|  *  @method readAccelerometerCharacteristics  | 
|  *  | 
|  *  @discussion Method to read values for different accelerometer characteristics  | 
|  *  | 
|  */  | 
|   | 
| -(void) readAccelerometerCharacteristics  | 
| {  | 
|       | 
|     if (scanIntervalCharacteristic != nil)  | 
|     {  | 
|         [[[CBMoralManager sharedManager] myPeripheral] readValueForCharacteristic:scanIntervalCharacteristic];  | 
|           | 
|         [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:scanIntervalCharacteristic.UUID] descriptor:nil operation:READ_REQUEST];  | 
|     }  | 
|       | 
|     if (dataAccumulationCharacteristic != nil)  | 
|     {  | 
|         [[[CBMoralManager sharedManager] myPeripheral] readValueForCharacteristic:dataAccumulationCharacteristic];  | 
|           | 
|         [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:dataAccumulationCharacteristic.UUID] descriptor:nil operation:READ_REQUEST];  | 
|     }  | 
|       | 
|     if (sensorTypecharacteristic != nil)  | 
|     {  | 
|         [[[CBMoralManager sharedManager] myPeripheral] readValueForCharacteristic:sensorTypecharacteristic];  | 
|           | 
|         [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:ACCELEROMETER_SERVICE_UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:sensorTypecharacteristic.UUID] descriptor:nil operation:READ_REQUEST];  | 
|     }  | 
| }  | 
|   | 
|   | 
| /*!  | 
|  *  @method getXYZValuesWithCharacteristic:  | 
|  *  | 
|  *  @discussion Method to get the accelerometer X,Y and Z values  | 
|  *  | 
|  */  | 
|   | 
|   | 
| -(void) getXYZValuesWithCharacteristic:(CBCharacteristic *)characteristic  | 
| {  | 
|     NSData *data = [characteristic value];  | 
|     const uint8_t *reportData = (uint8_t *)[data bytes];  | 
|       | 
|     if ([characteristic.UUID isEqual:ACCELEROMETER_READING_X_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _xValue = CFSwapInt16LittleToHost(*(uint16_t *) &reportData[0]);  | 
|     }  | 
|     else if ([characteristic.UUID isEqual:ACCELEROMETER_READING_Y_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _yValue = CFSwapInt16LittleToHost(*(uint16_t *) &reportData[0]);  | 
|     }  | 
|     else if ([characteristic.UUID isEqual:ACCELEROMETER_READING_Z_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _zValue = CFSwapInt16LittleToHost(*(uint16_t *) &reportData[0]);  | 
|     }  | 
|   | 
|     [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:characteristic.service.UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:characteristic.UUID] descriptor:nil operation:[NSString stringWithFormat:@"%@%@ %@",NOTIFY_RESPONSE,DATA_SEPERATOR,[Utilities convertDataToLoggerFormat:data]]];  | 
| }  | 
|   | 
| /*!  | 
|  *  @method getValuesForAcclerometerCharacteristics:  | 
|  *  | 
|  *  @discussion Method to parse values for different accelerometer characteristics  | 
|  *  | 
|  */  | 
| -(void) getValuesForAcclerometerCharacteristics:(CBCharacteristic *)characteristic  | 
| {  | 
|     NSData *data = [characteristic value];  | 
|     const uint8_t *reportData = (uint8_t *)[data bytes];  | 
|   | 
|     if ([characteristic.UUID isEqual:ACCELEROMETER_SENSOR_SCAN_INTERVAL_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _scanIntervalString = [NSString stringWithFormat:@"%d",reportData[0]];  | 
|     }  | 
|     else if ([characteristic.UUID isEqual:ACCELEROMETER_DATA_ACCUMULATION_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _filterTypeConfigurationString = [NSString stringWithFormat:@"%d",reportData[0]];  | 
|     }  | 
|     else if ([characteristic.UUID isEqual:ACCELEROMETER_ANALOG_SENSOR_CHARACTERISTIC_UUID])  | 
|     {  | 
|         _sensorTypeString = [NSString stringWithFormat:@"%d",reportData[0]];  | 
|     }  | 
|       | 
|     [Utilities logDataWithService:[ResourceHandler getServiceNameForUUID:characteristic.service.UUID] characteristic:[ResourceHandler getCharacteristicNameForUUID:characteristic.UUID] descriptor:nil operation:[NSString stringWithFormat:@"%@%@ %@",READ_RESPONSE,DATA_SEPERATOR,[Utilities convertDataToLoggerFormat:data]]];  | 
|   | 
| }  | 
|   | 
|   | 
|   | 
|   | 
| @end  |