Data exchange function

Function overview

When you initiate exercise in the App, the bracelet will calculate the heart rate and calories from the exercise data generated by the App and return it to the App for data exchange; When the bracelet initiates exercise, the movement generated by the bracelet The data is sent to the App regularly and sports data is displayed in real time. Exchanging data uses time as the only reference. The exchange process needs to judge the current activity data based on the movement start time. If the time does not correspond, the data cannot be exchanged.

ExchangeDataInterface

Properties

supportV3ActivityExchange

Get whether v3 motion data exchange is supported

status

Exchange data status

Method

appExec(type:)

app executes data exchange

appReplyExec(type:)

ble initiates movement ble executes data exchange app reply

getLastActivityData( )

The last data acquisition of multi-sport data

  • Parameters:

getActivityHrData(completion:)

Get one minute of heart rate data for multiple exercises

  • Parameters:

    • completion: command execution callback
    • code: error code 0 is successful, non-0 is unsuccessful

    • model: Heart rate data entity IDOAppHrDataExchangeModel

IDOExchangeDataDelegate

Method

appListenBleExec (completion:)

ble initiates movement app to monitor ble

  • Parameters:
    • completion: command execution callback
    • type: listen to ble execution data entity IDOBleExecType

appListenAppExec(completion:)

app execution response

  • Parameters: I -COMPLETION: Command execution -Type: Surveillance app executes BLE response entity :
    • CompleTion : Command execution callback
    • type: Monitor v2 data exchange entity IDOExchangeV2Model

exchangeV3Data(completion:)

Exchange v3 data

  • Parameters:
  • completion: Command execution callback
  • type: Listen v3 data exchange entity IDOExchangeV3Model

Example

Swift:

//pause exercise
 let model = IDOAppPauseExchangeModel(baseModel: baseModel)
 sdk.dataExchange.appExec(model: model)

//end exercise
let model = IDOAppBleEndReplyExchangeModel(code: 0, duration: duration, calories: calories, distance: distance, baseModel: baseModel)
sdk.dataExchange.appReplyExec(type: .appBleEndReply(model))

let lastData = sdk.dataExchange.getLastActivityData()

if sdk.dataExchange.supportV3ActivityExchange {
  sdk.dataExchange.getActivityHrData()
}

sdk.dataExchange.addExchange(IDOExchangeDataDelegateImpl())

class IDOExchangeDataDelegateImpl: IDOExchangeDataOCDelegate {
    func appListenBleExec(model: NSObject) {
        if (model is IDOBleStartExchangeModel) {
            let obj = model as? IDOBleStartExchangeModel
            let sendModel = IDOBleStartReplyExchangeModel(baseModel: obj?.baseModel, operate: obj?.operate, retCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOBleIngExchangeModel) {
            let obj = model as? IDOBleIngExchangeModel
            let sendModel = IDOBleIngReplyExchangeModel(baseModel: obj?.baseModel, distance: obj?.distance)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOBleEndExchangeModel) {
            let obj = model as? IDOBleEndExchangeModel
            let sendModel = IDOBleEndReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOBlePauseExchangeModel) {
            let obj = model as? IDOBlePauseExchangeModel
            let sendModel = IDOBlePauseReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOBleRestoreExchangeModel) {
            let obj = model as? IDOBleRestoreExchangeModel
            let sendModel = IDOBleRestoreReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOAppBlePauseExchangeModel) {
            let obj = model as? IDOAppBlePauseExchangeModel
            let sendModel = IDOAppBlePauseReplyExchangeModel(baseModel: obj?.baseModel, errCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOAppBleRestoreExchangeModel) {
            let obj = model as? IDOAppBleRestoreExchangeModel
            let sendModel = IDOBleRestoreReplyExchangeModel(baseModel: obj?.baseModel, retCode: 0)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
        else if (model is IDOAppBleEndExchangeModel) {
            let obj = model as? IDOAppBleEndExchangeModel
            let sendModel = IDOAppBleEndReplyExchangeModel(baseModel: baseModel,
                                                           errCode: 0,
                                                           duration: obj?.duration,
                                                           calories: obj?.calories,
                                                           distance: obj?.distance)
            sdk.dataExchange.appReplyExec(model: sendModel)
        }
    }

    func appListenAppExec(model: NSObject) {
        if (model is IDOAppStartReplyExchangeModel) {
            let obj = model as? IDOAppStartReplyExchangeModel
            print("sport started now : \(String(describing: obj))")
            //* - 0: Success; 1: The device has entered sports mode and failed;
            //* - 2: Failed due to low device power; 3: The bracelet is charging
            //* - 4: Using Alexa 5: Calling
            guard obj?.retCode == 0 else {
                textConsole.text = "sport failed to launch, because of \(String(describing: obj?.retCode))"
                return
            }
            textConsole.text = "sport launched successfully"
            disposeTimer = DisposeBag()
            Observable<Int>.interval(.seconds(Constant.intervalExchangeData), scheduler: MainScheduler.instance)
                .subscribe(onNext: { [weak self] value in
                    self?.exchangeData()
                })
                .disposed(by: disposeTimer)

            Observable<Int>.interval(.seconds(Constant.intervalExchangeCompleteData), scheduler: MainScheduler.instance)
                .subscribe(onNext: { [weak self] value in
                    self?.exchangeCompleteData()
                })
                .disposed(by: disposeTimer)

            Observable<Int>.interval(.seconds(Constant.intervalExchangeHrData), scheduler: MainScheduler.instance)
                .subscribe(onNext: { [weak self] value in
                    self?.exchangeV3HrData()
                })
                .disposed(by: disposeTimer)
        }
        else if (model is IDOAppEndReplyExchangeModel) {
            let obj = model as? IDOAppEndReplyExchangeModel
            print("reply for app's end reply: \(String(describing: obj))")
        }
        else if (model is IDOAppIngReplyExchangeModel) {
            let obj = model as? IDOAppIngReplyExchangeModel
            print("data of sport from device: \(String(describing: obj))")
        }
        else if (model is IDOAppPauseReplyExchangeModel) {
            let obj = model as? IDOAppPauseReplyExchangeModel
            print("reply for app's pause cmd: \(String(describing: obj))")
        }
        else if (model is IDOAppRestoreReplyExchangeModel) {
            let obj = model as? IDOAppRestoreReplyExchangeModel
            print("reply for app's restore cmd: \(String(describing: obj))")
        }
        else if (model is IDOAppIngV3ReplyExchangeModel) {
            let obj = model as? IDOAppIngV3ReplyExchangeModel
            print("v3 data of sport from device: \(String(describing: obj))")
        }
        else if (model is IDOAppOperatePlanReplyExchangeModel) {
            let obj = model as? IDOAppOperatePlanReplyExchangeModel
            print("reply for app's operate plan cmd: \(String(describing: obj))")
        }
        else if (model is IDOAppActivityDataV3ExchangeModel) {
            let obj = model as? IDOAppActivityDataV3ExchangeModel
            print("appActivityDataReply: ${type.model}")
            duration = max(duration, obj?.durations ?? 0)
            calories = max(calories, obj?.calories ?? 0)
            distance = max(distance, obj?.distance ?? 0)
        }
        else if (model is IDOAppHrDataExchangeModel) {
            let obj = model as? IDOAppHrDataExchangeModel
            print("appActivityHrReply: \(String(describing: obj))")
        }
        else if (model is IDOAppGpsDataExchangeModel) {
            let obj = model as? IDOAppGpsDataExchangeModel
            print("appActivityGpsReply: \(String(describing: obj))")
        }
    }

    func exchangeV2Data(model: IDOExchangeV2Model) {

    }

    func exchangeV3Data(model: IDOExchangeV3Model) {

    }
}
//pause exercise
val model = IDOAppPauseExchangeModel(baseModel)
sdk.dataExchange.appExec(IDOAppExecType.appPause(model))

//end exercise
val model = IDOAppBleEndReplyExchangeModel(0, duration, calories, distance, baseModel)
sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleEndReply(model))

sdk.dataExchange.getLastActivityData()

if (sdk.dataExchange.supportV3ActivityExchange) {
   sdk.dataExchange.getActivityHrData()
}

sdk.dataExchange.addExchange(object : IDOExchangeDataDelegate {
   override fun appListenBleExec(type: IDOBleExecType) {
     when (type) {
       is IDOBleExecType.appBleEnd -> {
         //The movement initiated by app is initiated and ended by ble
         log("appBleEnd: ${type.model}")
         mHandler.removeCallbacksAndMessages(null)
         val model = IDOAppBleEndReplyExchangeModel(0, duration, calories, distance, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleEndReply(model))
       }

       is IDOBleExecType.appBlePause -> {
         //App-initiated movement ble initiates pause
         log("appBlePause: ${type.model}")
         val model = IDOAppBlePauseReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.appBlePauseReply(model))
       }

       is IDOBleExecType.appBleRestore -> {
         //App-initiated movement ble initiates recovery
         log("appBleRestore: ${type.model}")
         val model = IDOAppBleRestoreReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.appBleRestoreReply(model))
       }
       //The movement initiated by app is initiated and ended by ble
       is IDOBleExecType.bleEnd -> {
         log("bleEnd: ${type.model}")
         val model = IDOBleEndReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.bleEndReply(model))
       }

       is IDOBleExecType.bleIng -> {
         //motion initiated by ble ble initiated exchange
         log("bleIng: ${type.model}")
         val model = IDOBleIngReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.bleIngReply(model))
       }

       is IDOBleExecType.bleOperatePlan -> {
         //BLE switching action
         log("bleOperatePlan: ${type.model}")
       }

       is IDOBleExecType.blePause -> {
         //motion initiated by ble ble initiates pause
         log("blePause: ${type.model}")
         val model = IDOBlePauseReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.blePauseReply(model))
       }

       is IDOBleExecType.bleRestore -> {
         //motion initiated by ble ble initiates recovery
         log("bleRestore: ${type.model}")
         val model = IDOBleRestoreReplyExchangeModel(0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.bleRestoreReply(model))
       }

       is IDOBleExecType.bleStart -> {
         //The movement initiated by ble starts when initiated by ble
         log("bleStart: ${type.model}")
         val model = IDOBleStartReplyExchangeModel(type.model.operate, 0, baseModel)
         sdk.dataExchange.appReplyExec(IDOAppReplyType.bleStartReply(model))
       }
     }
   }

   override fun appListenAppExec(type: IDOBleReplyType) {
     when (type) {
       is IDOBleReplyType.appEndReply -> {
         //app initiates and ends ble reply
         log("reply for app's end reply: ${type.model}")
         mHandler.removeCallbacksAndMessages(null)
       }
       is IDOBleReplyType.appIngReply -> {
         //app initiates exchange ble reply
         log("data of sport from device: ${type.model}")
       }

       is IDOBleReplyType.appIngV3Reply -> {
         //app initiates exchange v3 reply
         log("v3 data of sport from device: ${type.model}")
       }

       is IDOBleReplyType.appOperatePlanReply -> {
         log("reply for app's operate plan cmd: ${type.model}")
       }

       is IDOBleReplyType.appPauseReply -> {
         // app initiates pause ble reply
         log("reply for app's pause cmd: ${type.model}")
       }

       is IDOBleReplyType.appRestoreReply -> {
         //APP initiates recovery
         log("reply for app's restore cmd: ${type.model}")
       }

       is IDOBleReplyType.appStartReply -> {
         //app initiates start ble reply
         log("sport started now : ${type.model}")
         if (type.model?.retCode != 0) {
           //* - 0: Success; 1: The device has entered sports mode and failed;
           //* - 2: Failed due to low device power; 3: The bracelet is charging
           //* - 4: Using Alexa 5: Calling
           tv_response.text = "sport failed to launch, because of ${type.model?.retCode}"
           return
         }
         tv_response.text = "sport launched successfully"
         mHandler.postDelayed(object : Runnable {
           override fun run() {
             mHandler.postDelayed(this, INTERVAL_EXCHANGE_DATA)
             exchangeData()
           }
         }, INTERVAL_EXCHANGE_DATA)
         mHandler.postDelayed(object : Runnable {
           override fun run() {
             mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
             exchangeCompleteData()
           }

         }, INTERVAL_EXCHANGE_COMPLETE_DATA)
         mHandler.postDelayed(object : Runnable {
           override fun run() {
             mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
             exchangeV3HrData()
           }
         }, INTERVAL_EXCHANGE_HR_DATA)
       }

       is IDOBleReplyType.appActivityDataReply -> {
         //result for exchangeCompleteData
         val model = type.model
         log("appActivityDataReply: ${type.model}")
         duration = max(duration, model?.durations ?: 0)
         calories = max(calories, model?.calories ?: 0)
         distance = max(distance, model?.distance?: 0)
       }

       is IDOBleReplyType.appActivityGpsReply -> {
         log("appActivityGpsReply: ${type.model}")
       }

       is IDOBleReplyType.appActivityHrReply -> {
         log("appActivityHrReply: ${type.model}")
       }
     }
   }

   override fun exchangeV2Data(model: IDOExchangeV2Model) {
// log("exchangeV2Data: ${GsonUtil.toJson(model)}")
   }

   override fun exchangeV3Data(model: IDOExchangeV3Model) {
// log("exchangeV3Data: ${GsonUtil.toJson(model)}")
   }

})


override fun appListenAppExec(type: IDOBleReplyType) {
   when (type) {
     is IDOBleReplyType.appEndReply -> {
       //app initiates and ends ble reply
       log("reply for app's end reply: ${type.model}")
       mHandler.removeCallbacksAndMessages(null)
     }
     is IDOBleReplyType.appIngReply -> {
       //app initiates exchange ble reply
       log("data of sport from device: ${type.model}")
     }

     is IDOBleReplyType.appIngV3Reply -> {
       //app initiates exchange v3 reply
       log("v3 data of sport from device: ${type.model}")
     }

     is IDOBleReplyType.appOperatePlanReply -> {
       log("reply for app's operate plan cmd: ${type.model}")
     }

     is IDOBleReplyType.appPauseReply -> {
       // app initiates pause ble reply
       log("reply for app's pause cmd: ${type.model}")
     }

     is IDOBleReplyType.appRestoreReply -> {
       //APP initiates recovery
       log("reply for app's restore cmd: ${type.model}")
     }

     is IDOBleReplyType.appStartReply -> {
       //app initiates start ble reply
       log("sport started now : ${type.model}")
       if (type.model?.retCode != 0) {
         //* - 0: Success; 1: The device has entered sports mode and failed;
         //* - 2: Failed due to low device power; 3: The bracelet is charging
         //* - 4: Using Alexa 5: Calling
         tv_response.text = "sport failed to launch, because of ${type.model?.retCode}"
         return
       }
       tv_response.text = "sport launched successfully"
       mHandler.postDelayed(object : Runnable {
         override fun run() {
           mHandler.postDelayed(this, INTERVAL_EXCHANGE_DATA)
           exchangeData()
         }
       }, INTERVAL_EXCHANGE_DATA)
       mHandler.postDelayed(object : Runnable {
         override fun run() {
           mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
           exchangeCompleteData()
         }

       }, INTERVAL_EXCHANGE_COMPLETE_DATA)
       mHandler.postDelayed(object : Runnable {
         override fun run() {
           mHandler.postDelayed(this, INTERVAL_EXCHANGE_COMPLETE_DATA)
           exchangeV3HrData()
         }
       }, INTERVAL_EXCHANGE_HR_DATA)
     }

     is IDOBleReplyType.appActivityDataReply -> {
       //result for exchangeCompleteData
       val model = type.model
       log("appActivityDataReply: ${type.model}")
       duration = max(duration, model?.durations ?: 0)
       calories = max(calories, model?.calories ?: 0)
       distance = max(distance, model?.distance?: 0)
     }

     is IDOBleReplyType.appActivityGpsReply -> {
       log("appActivityGpsReply: ${type.model}")
     }

     is IDOBleReplyType.appActivityHrReply -> {
       log("appActivityHrReply: ${type.model}")
     }
   }
}


override fun exchangeV2Data(model: IDOExchangeV2Model) {
            log("exchangeV2Data: ${GsonUtil.toJson(model)}")
}

override fun exchangeV3Data(model: IDOExchangeV3Model) {
            log("exchangeV3Data: ${GsonUtil.toJson(model)}")
}
Copyright © 2023-2024 IDO. All rights reserved. all right reserved,powered by Gitbook修改日期: 2024-04-22 17:20:23

results matching ""

    No results matching ""