2016-05-23 21:13:12 +02:00
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble ;
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
import java.nio.ByteBuffer ;
2016-08-08 19:16:53 +02:00
import java.util.ArrayList ;
import java.util.List ;
2016-05-23 21:13:12 +02:00
import java.util.UUID ;
import nodomain.freeyourgadget.gadgetbridge.GBApplication ;
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler ;
2016-08-08 19:16:53 +02:00
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper ;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession ;
import nodomain.freeyourgadget.gadgetbridge.entities.PebbleHealthActivityOverlay ;
import nodomain.freeyourgadget.gadgetbridge.entities.PebbleHealthActivityOverlayDao ;
2016-06-27 20:41:20 +02:00
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice ;
2016-05-23 21:13:12 +02:00
import nodomain.freeyourgadget.gadgetbridge.util.GB ;
2016-06-04 18:21:49 +02:00
class DatalogSessionHealthOverlayData extends DatalogSessionPebbleHealth {
2016-05-23 21:13:12 +02:00
private static final Logger LOG = LoggerFactory . getLogger ( DatalogSessionHealthOverlayData . class ) ;
2016-06-27 20:41:20 +02:00
public DatalogSessionHealthOverlayData ( byte id , UUID uuid , int tag , byte item_type , short item_size , GBDevice device ) {
super ( id , uuid , tag , item_type , item_size , device ) ;
2016-05-23 21:13:12 +02:00
taginfo = "(health - overlay data " + tag + " )" ;
}
@Override
public boolean handleMessage ( ByteBuffer datalogMessage , int length ) {
LOG . info ( "DATALOG " + taginfo + GB . hexdump ( datalogMessage . array ( ) , datalogMessage . position ( ) , length ) ) ;
2016-06-04 18:21:49 +02:00
if ( ! isPebbleHealthEnabled ( ) ) {
return false ;
}
2016-05-23 21:13:12 +02:00
int initialPosition = datalogMessage . position ( ) ;
int beginOfRecordPosition ;
short recordVersion ; //probably
short recordType ; //probably: 1=sleep, 2=deep sleep, 5=??run??ignored for now
if ( 0 ! = ( length % itemSize ) )
return false ; //malformed message?
int recordCount = length / itemSize ;
OverlayRecord [ ] overlayRecords = new OverlayRecord [ recordCount ] ;
for ( int recordIdx = 0 ; recordIdx < recordCount ; recordIdx + + ) {
beginOfRecordPosition = initialPosition + recordIdx * itemSize ;
datalogMessage . position ( beginOfRecordPosition ) ; //we may not consume all the bytes of a record
recordVersion = datalogMessage . getShort ( ) ;
if ( ( recordVersion ! = 1 ) & & ( recordVersion ! = 3 ) )
return false ; //we don't know how to deal with the data TODO: this is not ideal because we will get the same message again and again since we NACK it
datalogMessage . getShort ( ) ; //throwaway, unknown
recordType = datalogMessage . getShort ( ) ;
overlayRecords [ recordIdx ] = new OverlayRecord ( recordType , datalogMessage . getInt ( ) , datalogMessage . getInt ( ) , datalogMessage . getInt ( ) ) ;
}
2016-08-09 18:05:24 +02:00
store ( overlayRecords ) ;
return true ;
2016-05-23 21:13:12 +02:00
}
2016-08-09 18:05:24 +02:00
private void store ( OverlayRecord [ ] overlayRecords ) {
2016-06-06 23:18:46 +02:00
try ( DBHandler dbHandler = GBApplication . acquireDB ( ) ) {
2016-08-08 19:16:53 +02:00
DaoSession session = dbHandler . getDaoSession ( ) ;
Long userId = DBHelper . getUser ( session ) . getId ( ) ;
Long deviceId = DBHelper . getDevice ( getDevice ( ) , session ) . getId ( ) ;
PebbleHealthActivityOverlayDao overlayDao = session . getPebbleHealthActivityOverlayDao ( ) ;
List < PebbleHealthActivityOverlay > overlayList = new ArrayList < > ( ) ;
2016-05-23 21:13:12 +02:00
for ( OverlayRecord overlayRecord : overlayRecords ) {
2016-08-14 22:33:41 +02:00
overlayList . add ( new PebbleHealthActivityOverlay ( overlayRecord . timestampStart , overlayRecord . timestampStart + overlayRecord . durationSeconds - 1 , deviceId , userId , overlayRecord . type ) ) ; //TODO: consider if "-1" is what we really want
2016-05-23 21:13:12 +02:00
}
2016-08-08 19:16:53 +02:00
overlayDao . insertOrReplaceInTx ( overlayList ) ;
2016-05-23 21:13:12 +02:00
} catch ( Exception ex ) {
LOG . debug ( ex . getMessage ( ) ) ;
}
}
private class OverlayRecord {
int type ; //1=sleep, 2=deep sleep
int offsetUTC ; //probably
int timestampStart ;
int durationSeconds ;
public OverlayRecord ( int type , int offsetUTC , int timestampStart , int durationSeconds ) {
this . type = type ;
this . offsetUTC = offsetUTC ;
this . timestampStart = timestampStart ;
this . durationSeconds = durationSeconds ;
}
}
}