Compare commits

...

14 Commits

Author SHA1 Message Date
Roberto Viola
f859473eb3 Merge branch 'master' into ios17 2023-09-01 11:05:31 +02:00
Roberto Viola
db0251d78e Merge branch 'master' into ios17 2023-08-31 14:43:43 +02:00
Roberto Viola
c1a613d8f4 WATCHOS_DEPLOYMENT_TARGET restored 2023-08-30 13:59:34 +02:00
Roberto Viola
ca8fa34d85 Merge branch 'master' of https://github.com/cagnulein/qdomyos-zwift into ios17 2023-08-08 13:35:13 +00:00
Roberto Viola
de92737b87 Merge branch 'master' into ios17 2023-08-07 15:27:14 +02:00
Roberto Viola
61621bd4f3 Update project.pbxproj 2023-07-26 21:00:44 +02:00
Roberto Viola
b354c48998 fixing cpu usage on apple watch 2023-07-26 20:56:08 +02:00
Roberto Viola
d7c499a009 Update AppDelegate.swift 2023-07-06 09:26:14 +02:00
Roberto Viola
5d9e28715f distance added to ipad 2023-07-06 09:25:38 +02:00
Roberto Viola
6f3c386915 try to accomodate the xcode 15 beta 1 request for watchos depoyment target must be 6 or above 2023-06-21 09:54:35 +02:00
Roberto Viola
f80550dbb8 Merge branch 'master' into ios17 2023-06-21 09:32:56 +02:00
Roberto Viola
c5ca080dd8 let's send to test flight 2023-06-09 13:33:53 +02:00
Roberto Viola
b6bd3bdb2c tested! 2023-06-09 12:11:50 +02:00
Roberto Viola
26325aa62e Update WatchWorkoutTracking.swift 2023-06-08 22:20:47 +02:00
12 changed files with 193 additions and 13 deletions

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objectVersion = 54;
objects = {
/* Begin PBXAggregateTarget section */

View File

@@ -104,6 +104,9 @@ extension MainController: WorkoutTrackingDelegate {
"\(heartRate)" as AnyObject])
WorkoutTracking.distance = WatchKitConnection.distance
WorkoutTracking.kcal = WatchKitConnection.kcal
WorkoutTracking.speed = WatchKitConnection.speed
WorkoutTracking.power = WatchKitConnection.power
WorkoutTracking.cadence = WatchKitConnection.cadence
if Locale.current.measurementSystem != "Metric" {
self.distanceLabel.setText("Distance \(String(format:"%.2f", WorkoutTracking.distance))")

View File

@@ -24,6 +24,9 @@ class WatchKitConnection: NSObject {
public static var distance = 0.0
public static var kcal = 0.0
public static var stepCadence = 0
public static var speed = 0.0
public static var cadence = 0.0
public static var power = 0.0
weak var delegate: WatchKitConnectionDelegate?
private override init() {
@@ -66,6 +69,13 @@ extension WatchKitConnection: WatchKitConnectionProtocol {
WatchKitConnection.distance = dDistance
let dKcal = Double(result["kcal"] as! Double)
WatchKitConnection.kcal = dKcal
let dSpeed = Double(result["speed"] as! Double)
WatchKitConnection.speed = dSpeed
let dPower = Double(result["power"] as! Double)
WatchKitConnection.power = dPower
let dCadence = Double(result["cadence"] as! Double)
WatchKitConnection.cadence = dCadence
}, errorHandler: { (error) in
print(error)
})

View File

@@ -31,6 +31,10 @@ class WorkoutTracking: NSObject {
public static var cadenceTimeStamp = NSDate().timeIntervalSince1970
public static var cadenceLastSteps = Double()
public static var cadenceSteps = 0
public static var speed = Double()
public static var power = Double()
public static var cadence = Double()
public static var lastDateMetric = Date()
var sport: Int = 0
let healthStore = HKHealthStore()
let configuration = HKWorkoutConfiguration()
@@ -146,14 +150,31 @@ extension WorkoutTracking: WorkoutTrackingProtocol {
HKSampleType.workoutType()
])
let infoToShare = Set([
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.workoutType()
])
var infoToShare: Set<HKSampleType> = []
if #available(watchOSApplicationExtension 10.0, *) {
infoToShare = Set([
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.quantityType(forIdentifier: .cyclingPower)!,
HKSampleType.quantityType(forIdentifier: .cyclingSpeed)!,
HKSampleType.quantityType(forIdentifier: .cyclingCadence)!,
HKSampleType.workoutType()
])
} else {
// Fallback on earlier versions
infoToShare = Set([
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.workoutType()
])
}
HKHealthStore().requestAuthorization(toShare: infoToShare, read: infoToRead) { (success, error) in
if success {
@@ -168,6 +189,7 @@ extension WorkoutTracking: WorkoutTrackingProtocol {
}
func startWorkOut() {
WorkoutTracking.lastDateMetric = Date()
print("Start workout")
configWorkout()
workoutSession.startActivity(with: Date())
@@ -312,6 +334,68 @@ extension WorkoutTracking: HKLiveWorkoutBuilderDelegate {
handleSendStatisticsData(statistics)
}
}
if #available(watchOSApplicationExtension 10.0, *) {
let wattPerInterval = HKQuantity(unit: HKUnit.watt(),
doubleValue: WorkoutTracking.power)
if(WorkoutTracking.lastDateMetric.distance(to: Date()) < 1) {
return
}
guard let powerType = HKQuantityType.quantityType(
forIdentifier: .cyclingPower) else {
return
}
let wattPerIntervalSample = HKQuantitySample(type: powerType,
quantity: wattPerInterval,
start: WorkoutTracking.lastDateMetric,
end: Date())
workoutBuilder.add([wattPerIntervalSample]) {(success, error) in
if let error = error {
print(error)
}
}
let cadencePerInterval = HKQuantity(unit: HKUnit.count().unitDivided(by: HKUnit.minute()),
doubleValue: WorkoutTracking.cadence)
guard let cadenceType = HKQuantityType.quantityType(
forIdentifier: .cyclingCadence) else {
return
}
let cadencePerIntervalSample = HKQuantitySample(type: cadenceType,
quantity: cadencePerInterval,
start: WorkoutTracking.lastDateMetric,
end: Date())
workoutBuilder.add([cadencePerIntervalSample]) {(success, error) in
if let error = error {
print(error)
}
}
let speedPerInterval = HKQuantity(unit: HKUnit.meter().unitDivided(by: HKUnit.second()),
doubleValue: WorkoutTracking.speed * 0.277778)
guard let speedType = HKQuantityType.quantityType(
forIdentifier: .cyclingSpeed) else {
return
}
let speedPerIntervalSample = HKQuantitySample(type: speedType,
quantity: speedPerInterval,
start: WorkoutTracking.lastDateMetric,
end: Date())
workoutBuilder.add([speedPerIntervalSample]) {(success, error) in
if let error = error {
print(error)
}
}
} else {
// Fallback on earlier versions
}
WorkoutTracking.lastDateMetric = Date()
}
func workoutBuilderDidCollectEvent(_ workoutBuilder: HKLiveWorkoutBuilder) {

View File

@@ -247,6 +247,9 @@ void bluetoothdevice::update_hr_from_external() {
long appleWatchHeartRate = h.heartRate();
h.setKcal(KCal.value());
h.setDistance(Distance.value());
h.setSpeed(Speed.value());
h.setPower(m_watt.value());
h.setCadence(Cadence.value());
Heart = appleWatchHeartRate;
qDebug() << "Current Heart from Apple Watch: " << QString::number(appleWatchHeartRate);
#endif

View File

@@ -504,6 +504,9 @@ void fitshowtreadmill::characteristicChanged(const QLowEnergyCharacteristic &cha
long appleWatchHeartRate = h->heartRate();
h->setKcal(KCal.value());
h->setDistance(Distance.value());
h->setSpeed(Speed.value());
h->setPower(m_watt.value());
h->setCadence(Cadence.value());
Heart = appleWatchHeartRate;
debug("Current Heart from Apple Watch: " + QString::number(appleWatchHeartRate));
#else

View File

@@ -62,8 +62,8 @@ var pedometer = CMPedometer()
} else {
sender = "PHONE"
}
Server.server?.send("SENDER=\(sender)#HR=\(WatchKitConnection.currentHeartRate)#ODO=\(distance)#")
WatchKitConnection.distance = distance;
Server.server?.send(createString(sender: sender))
}
@objc public func setKcal(kcal: Double) -> Void
@@ -74,8 +74,48 @@ var pedometer = CMPedometer()
} else {
sender = "PHONE"
}
Server.server?.send("SENDER=\(sender)#HR=\(WatchKitConnection.currentHeartRate)#KCAL=\(kcal)#")
WatchKitConnection.kcal = kcal;
Server.server?.send(createString(sender: sender))
}
@objc public func setCadence(cadence: Double) -> Void
{
var sender: String
if UIDevice.current.userInterfaceIdiom == .pad {
sender = "PAD"
} else {
sender = "PHONE"
}
WatchKitConnection.cadence = cadence;
Server.server?.send(createString(sender: sender))
}
@objc public func setSpeed(speed: Double) -> Void
{
var sender: String
if UIDevice.current.userInterfaceIdiom == .pad {
sender = "PAD"
} else {
sender = "PHONE"
}
WatchKitConnection.speed = speed;
Server.server?.send(createString(sender: sender))
}
@objc public func setPower(power: Double) -> Void
{
var sender: String
if UIDevice.current.userInterfaceIdiom == .pad {
sender = "PAD"
} else {
sender = "PHONE"
}
WatchKitConnection.power = power;
Server.server?.send(createString(sender: sender))
}
func createString(sender: String) -> String {
return "SENDER=\(sender)#HR=\(WatchKitConnection.currentHeartRate)#KCAL=\(WatchKitConnection.kcal)#BCAD=\(WatchKitConnection.cadence)#SPD=\(WatchKitConnection.speed)#PWR=\(WatchKitConnection.power)#CAD=\(WatchKitConnection.stepCadence)#ODO=\(WatchKitConnection.distance)#";
}
@objc func updateHeartRate() {
@@ -85,8 +125,7 @@ var pedometer = CMPedometer()
} else {
sender = "PHONE"
}
Server.server?.send("SENDER=\(sender)#HR=\(WatchKitConnection.currentHeartRate)#CAD=\(WatchKitConnection.stepCadence)#")
Server.server?.send(createString(sender: sender))
}
}
/*

View File

@@ -97,6 +97,18 @@ class Connection {
if sender?.contains("PAD") ?? false && message.contains("ODO=") {
let odo : String = message.slice(from: "ODO=", to: "#") ?? ""
WatchKitConnection.distance = (Double(odo) ?? 0)
}
if sender?.contains("PAD") ?? false && message.contains("BCAD=") {
let cad : String = message.slice(from: "BCAD=", to: "#") ?? ""
WatchKitConnection.cadence = (Double(cad) ?? 0)
}
if sender?.contains("PAD") ?? false && message.contains("SPD=") {
let spd : String = message.slice(from: "SPD=", to: "#") ?? ""
WatchKitConnection.speed = (Double(spd) ?? 0)
}
if sender?.contains("PAD") ?? false && message.contains("PWR=") {
let pwr : String = message.slice(from: "PWR=", to: "#") ?? ""
WatchKitConnection.power = (Double(pwr) ?? 0)
}
}
}

View File

@@ -25,6 +25,9 @@ class WatchKitConnection: NSObject {
static var distance = 0.0
static var stepCadence = 0
static var kcal = 0.0
static var speed = 0.0
static var power = 0.0
static var cadence = 0.0
private override init() {
super.init()
@@ -130,6 +133,9 @@ extension WatchKitConnection: WCSessionDelegate {
replyValues["distance"] = WatchKitConnection.distance
replyValues["kcal"] = WatchKitConnection.kcal
replyValues["cadence"] = WatchKitConnection.cadence
replyValues["power"] = WatchKitConnection.power
replyValues["speed"] = WatchKitConnection.speed
replyHandler(replyValues)

View File

@@ -9,6 +9,9 @@ class lockscreen {
long stepCadence();
void setKcal(double kcal);
void setDistance(double distance);
void setSpeed(double speed);
void setPower(double power);
void setCadence(double cadence);
// virtualbike
void virtualbike_ios();

View File

@@ -56,6 +56,20 @@ void lockscreen::setDistance(double distance)
[h setDistanceWithDistance:distance * 0.621371];
}
void lockscreen::setPower(double power)
{
[h setPowerWithPower:power];
}
void lockscreen::setCadence(double cadence)
{
[h setCadenceWithCadence:cadence];
}
void lockscreen::setSpeed(double speed)
{
[h setSpeedWithSpeed:speed];
}
void lockscreen::virtualbike_ios()
{
_virtualbike = [[virtualbike_ios_swift alloc] init];

View File

@@ -723,6 +723,9 @@ void m3ibike::processAdvertising(const QByteArray &data) {
long appleWatchHeartRate = h->heartRate();
h->setKcal(KCal.value());
h->setDistance(Distance.value());
h->setSpeed(Speed.value());
h->setPower(m_watt.value());
h->setCadence(Cadence.value());
if (appleWatchHeartRate == 0)
Heart = k3.pulse;
else