Skip to content

Commit 9180a54

Browse files
authored
fix a crash (#56)
* fix a crash * fix hue shift issue due to precision loss.
1 parent 47655b9 commit 9180a54

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

NeewerLite/NeewerLite/Model/NeewerLight.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,10 +431,10 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
431431
}
432432

433433
// Set RBG light in HSV Mode
434-
public func setRGBLightValues(brr: CGFloat, hue: CGFloat, sat: CGFloat) {
434+
public func setRGBLightValues(brr: CGFloat, hue: CGFloat, hue360: CGFloat, sat: CGFloat) {
435435
var cmd: Data = Data()
436436
// Logger.debug("hue: \(hue) sat: \(sat)")
437-
cmd = getRGBLightValue(brightness: brr, hue: hue, satruation: sat)
437+
cmd = getRGBLightValue(brightness: brr, hue: hue, hue360: hue360, satruation: sat)
438438

439439
lightMode = .HSIMode
440440

@@ -483,7 +483,11 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
483483
if data.prefix(upTo: BleUpdate.channelUpdatePrefix.count) == BleUpdate.channelUpdatePrefix
484484
&& data.count == BleUpdate.channelUpdatePrefix.count + 2 {
485485
// data[3] range in [0,1,2,3,4,5,6,7,8]
486-
channel.value = UInt8(data[3]+1).clamped(to: 1...maxChannel) // only 1-maxChannel channel a allowed.
486+
if maxChannel >= 1 {
487+
channel.value = UInt8(data[3]+1).clamped(to: 1...maxChannel) // only 1-maxChannel channel a allowed.
488+
} else {
489+
channel.value = UInt8(data[3]+1).clamped(to: 1...30)
490+
}
487491
} else {
488492
Logger.info("handleNotifyValueUpdate \(data.hexEncodedString())")
489493
}
@@ -661,7 +665,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
661665
cmd = getCCTOnlyLightValue(brightness: brr, correlatedColorTemperature: CGFloat(cctValue.value))
662666
}
663667
} else if lightMode == .HSIMode {
664-
cmd = getRGBLightValue(brightness: brr, hue: CGFloat(hueValue.value) / 360.0, satruation: CGFloat(satValue.value) / 100.0)
668+
cmd = getRGBLightValue(brightness: brr, hue: CGFloat(hueValue.value) / 360.0, hue360: CGFloat(hueValue.value), satruation: CGFloat(satValue.value) / 100.0)
665669
} else {
666670
cmd = getSceneValue(channel.value, brightness: CGFloat(brr))
667671
}
@@ -671,7 +675,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
671675
write(data: cmd as Data, to: characteristic)
672676
}
673677

674-
private func getRGBLightValue(brightness brr: CGFloat, hue theHue: CGFloat, satruation sat: CGFloat ) -> Data {
678+
private func getRGBLightValue(brightness brr: CGFloat, hue theHue: CGFloat, hue360 theHue360: CGFloat, satruation sat: CGFloat ) -> Data {
675679
var ratio = 100.0
676680
if brr > 1.0 {
677681
ratio = 1.0
@@ -680,6 +684,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
680684
let newBrrValue: Int = Int(brr * ratio).clamped(to: 0...100)
681685
let newSatValue: Int = Int(sat * 100.0).clamped(to: 0...100)
682686
let newHueValue = Int(theHue * 360.0).clamped(to: 0...360)
687+
let newHue360Value = Int(theHue360).clamped(to: 0...360)
683688

684689
// Red 7886 0400 0064 643F
685690
// Blue 7886 04E7 0064 64B0
@@ -701,7 +706,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol {
701706
bArr[6] = newBrrValue // brightness
702707

703708
brrValue.value = newBrrValue
704-
hueValue.value = newHueValue
709+
hueValue.value = newHue360Value
705710
satValue.value = newSatValue
706711

707712
let bArr1: [UInt8] = appendCheckSum(bArr)

NeewerLite/NeewerLite/Views/CollectionViewItem.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ class CollectionViewItem: NSCollectionViewItem, NSTextFieldDelegate, NSTabViewDe
386386
guard let safeSelf = self else { return }
387387
if let safeDev = safeSelf.device {
388388
if safeDev.supportRGB {
389-
safeDev.setRGBLightValues(brr: CGFloat(safeDev.brrValue.value) / 100.0, hue: hue, sat: sat)
389+
safeDev.setRGBLightValues(brr: CGFloat(safeDev.brrValue.value) / 100.0, hue: hue, hue360: hue * 360.0, sat: sat)
390390
}
391391
}
392392
}
@@ -1434,7 +1434,7 @@ class CollectionViewItem: NSCollectionViewItem, NSTextFieldDelegate, NSTabViewDe
14341434
Logger.debug("brr: \(brr) hue: \(hue) sat: \(sat)")
14351435
let val = getHSIValuesFromView()
14361436
let brrValue = brr != nil ? brr! : val.brr
1437-
let hueVal = CGFloat(hue) / 360.0
1437+
let hueVal = Double(hue) / 360.0
14381438
if let wheel = getHSIWheelFromView() {
14391439
let color = NSColor(calibratedHue: hueVal, saturation: sat, brightness: brrValue, alpha: 1)
14401440
wheel.setViewColor(color)
@@ -1444,7 +1444,7 @@ class CollectionViewItem: NSCollectionViewItem, NSTextFieldDelegate, NSTabViewDe
14441444
brrSlide.currentValue = brrValue * brrSlide.maxValue
14451445
brrSlide.pauseNotify = false
14461446
}
1447-
dev.setRGBLightValues(brr: brrValue, hue: hueVal, sat: sat)
1447+
dev.setRGBLightValues(brr: brrValue, hue: hueVal, hue360: hue, sat: sat)
14481448
}
14491449
}
14501450
}
@@ -1487,7 +1487,7 @@ class CollectionViewItem: NSCollectionViewItem, NSTextFieldDelegate, NSTabViewDe
14871487
// HSI mode
14881488
if dev.supportRGB {
14891489
let val = getHSIValuesFromView()
1490-
dev.setRGBLightValues(brr: CGFloat(val.brr) / 100.0, hue: val.hue, sat: val.sat)
1490+
dev.setRGBLightValues(brr: CGFloat(val.brr) / 100.0, hue: val.hue, hue360: val.hue * 360.0, sat: val.sat)
14911491
}
14921492
} else if idf == TabId.scene.rawValue || tabViewItem?.label == "FX" {
14931493
// scene mode

NeewerLite/NeewerLiteTests/NeewerLiteTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ class NeewerLiteTests: XCTestCase {
110110
XCTAssertEqual(name.projectName, "RGB176 A1")
111111
XCTAssertEqual(NeewerLightConstant.getLightType(nickName: name.nickName, str: "", projectName: name.projectName), 20, "")
112112

113+
name = NeewerLightConstant.getLightNames(rawName: "NEEWER-RGB176", identifier: "DEE0BA8C-D9B4-B7DB-0FD2-F0CC23BACB1C")
114+
XCTAssertEqual(name.nickName, "RGB176-BACB1C")
115+
XCTAssertEqual(name.projectName, "RGB176")
116+
XCTAssertEqual(NeewerLightConstant.getLightType(nickName: name.nickName, str: "", projectName: name.projectName), 5, "")
117+
113118
name = NeewerLightConstant.getLightNames(rawName: "NEEWER-RGB530", identifier: "DEE0BA8C-D9B4-B7DB-0FD2-2531C7E4B053")
114119
XCTAssertEqual(name.nickName, "RGB530-E4B053")
115120
XCTAssertEqual(name.projectName, "RGB530")

0 commit comments

Comments
 (0)