diff --git a/NeewerLite/NeewerLite/ContentManager.swift b/NeewerLite/NeewerLite/ContentManager.swift index 183cc9a..d0469dc 100644 --- a/NeewerLite/NeewerLite/ContentManager.swift +++ b/NeewerLite/NeewerLite/ContentManager.swift @@ -62,7 +62,7 @@ class ContentManager { // Image Cache Directory private lazy var cacheDirectory: URL = { let appSupportURL = fileManager.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! - let cacheURL = appSupportURL.appendingPathComponent("LightImageCache") + let cacheURL = appSupportURL.appendingPathComponent("NeewerLite/LightImageCache") if !fileManager.fileExists(atPath: cacheURL.path) { try? fileManager.createDirectory(at: cacheURL, withIntermediateDirectories: true, attributes: nil) } diff --git a/NeewerLite/NeewerLite/Model/NeewerLight.swift b/NeewerLite/NeewerLite/Model/NeewerLight.swift index 1684ec5..3ea58bb 100644 --- a/NeewerLite/NeewerLite/Model/NeewerLight.swift +++ b/NeewerLite/NeewerLite/Model/NeewerLight.swift @@ -124,21 +124,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { } func CCTRange() -> (minCCT: Int, maxCCT: Int) { - // Default CCT range from 3200k–5600k - // some lights support extended CCT range from 3200K–8500K such as - // https://neewer.com/products/neewer-sl80-10w-rgb-led-video-light-10097903?_pos=1&_sid=dfa97e049&_ss=r&variant=37586440683713 - if ligthType == 6 { - if projectName.contains("SL140") { - // https://neewer.com/products/neewer-sl-140-rgb-led-light-full-color-rechargeable-pocket-size-10097200?_pos=2&_sid=3ff26da17&_ss=r - return (minCCT: 25, maxCCT: 90) - } else { - return (minCCT: 25, maxCCT: 85) - } - } - if ligthType == 22 { - return (minCCT: 27, maxCCT: 65) - } - return (minCCT: 32, maxCCT: 56) + return NeewerLightConstant.CCTRange(ligthType: _lightType, projectName: projectName) } var deviceName: String { @@ -203,7 +189,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { private lazy var ligthType: UInt8 = { if _lightType <= 0 { - _lightType = NeewerLightConstant.getLightType(nickName: nickName, str: "", projectName: projectName) + _lightType = NeewerLightConstant.getLightType(nickName: nickName, rawname: _rawName ?? "", projectName: projectName) } return _lightType }() @@ -287,7 +273,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { } if let safeMac = _macAddress { - if (safeMac.lengthOfBytes(using: .utf8)) > 8 && self.ligthType == 22 { + if (safeMac.lengthOfBytes(using: .utf8)) > 8 && NeewerLightConstant.getCCTGMLightTypes().contains(self.ligthType) { supportGMRange.value = true } } @@ -370,6 +356,14 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { guard let characteristic = deviceCtlCharacteristic else { return } + + if NeewerLightConstant.getNewPowerLightTypes().contains(_lightType) { + Logger.debug("send new powerOn command") + write(data: getNewPowerCommand(true) as Data, to: characteristic) + return + } + + Logger.debug("send old powerOn command") self.write(data: NeewerLightConstant.BleCommand.powerOn as Data, to: characteristic) } @@ -379,6 +373,14 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { guard let characteristic = deviceCtlCharacteristic else { return } + + if NeewerLightConstant.getNewPowerLightTypes().contains(_lightType) { + Logger.debug("send new powerOff command") + write(data: getNewPowerCommand(false) as Data, to: characteristic) + return + } + + Logger.debug("send old powerOff command") self.write(data: NeewerLightConstant.BleCommand.powerOff as Data, to: characteristic) } @@ -417,11 +419,11 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { Logger.debug("setCCTLightValues") if supportGMRange.value { - cmd = getCCTDATALightValue(brightness: brr, correlatedColorTemperature: cct, gmm: gmm) + cmd = getCCTDATALightCommand(brightness: brr, correlatedColorTemperature: cct, gmm: gmm) } else if supportRGB { - cmd = getCCTLightValue(brightness: brr, correlatedColorTemperature: cct) + cmd = getCCTLightCommand(brightness: brr, correlatedColorTemperature: cct) } else { - cmd = getCCTOnlyLightValue(brightness: brr, correlatedColorTemperature: cct) + cmd = getCCTOnlyLightCommand(brightness: brr, correlatedColorTemperature: cct) } lightMode = .CCTMode guard let characteristic = deviceCtlCharacteristic else { @@ -434,7 +436,12 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { public func setRGBLightValues(brr: CGFloat, hue: CGFloat, hue360: CGFloat, sat: CGFloat) { var cmd: Data = Data() // Logger.debug("hue: \(hue) sat: \(sat)") - cmd = getRGBLightValue(brightness: brr, hue: hue, hue360: hue360, satruation: sat) + + if NeewerLightConstant.getNewRGBLightTypes().contains(_lightType) { + cmd = getNewRGBLightCommand(mac: _macAddress ?? "", brightness: brr, hue: hue, hue360: hue360, satruation: sat) + } else { + cmd = getRGBLightCommand(brightness: brr, hue: hue, hue360: hue360, satruation: sat) + } lightMode = .HSIMode @@ -543,16 +550,16 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { bArr[0] = NeewerLightConstant.BleCommand.prefixTag bArr[1] = tag bArr[2] = byteCount + 7 - var intArray = mac.split(separator: ":").compactMap { Int($0, radix: 16) } - while intArray.count < 6 { - intArray.append(0) - } - bArr[3] = intArray[0] - bArr[4] = intArray[1] - bArr[5] = intArray[2] - bArr[6] = intArray[3] - bArr[7] = intArray[4] - bArr[8] = intArray[5] + var macArray = mac.split(separator: ":").compactMap { Int($0, radix: 16) } + while macArray.count < 6 { + macArray.append(0) + } + bArr[3] = macArray[0] + bArr[4] = macArray[1] + bArr[5] = macArray[2] + bArr[6] = macArray[3] + bArr[7] = macArray[4] + bArr[8] = macArray[5] bArr[9] = subtag var idx = 10 for val in vals { @@ -562,7 +569,23 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { return appendCheckSum(bArr) } - private func getCCTDATALightValue(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat, gmm: CGFloat) -> Data { + func getNewPowerCommand(_ turnOn: Bool) -> Data { + /* + Apr 28 12:12:17.298 ATT Send Write Request - Handle:0x000E - Value: 788D 08F7 AC16 F158 9681 0127 SEND + Apr 28 12:11:57.197 ATT Send Write Request - Handle:0x000E - Value: 788D 08F7 AC16 F158 9681 0228 SEND + CMD TAG SIZE MAC SUB_TAG PowerOn (checksum) + 78 8D 08 (F7 AC 16 F1 58 96) 81 01 27 + CMD TAG SIZE MAC SUB_TAG PowerOff (checksum) + 78 8D 08 (F7 AC 16 F1 58 96) 81 02 28 + */ + let bArr1: [UInt8] = composeSingleCommandWithMac(NeewerLightConstant.BleCommand.powerNewTag, _macAddress!, + NeewerLightConstant.BleCommand.powerNewSubTag, + turnOn ? NeewerLightConstant.BleCommand.powerNewOnSubTag : NeewerLightConstant.BleCommand.powerNewOffSubTag) + let data = NSData(bytes: bArr1, length: bArr1.count) as Data + return data + } + + private func getCCTDATALightCommand(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat, gmm: CGFloat) -> Data { var ratio = 100.0 if brr > 1.0 { ratio = 1.0 @@ -591,7 +614,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { return data } - private func getCCTLightValue(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat) -> Data { + private func getCCTLightCommand(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat) -> Data { var ratio = 100.0 if brr >= 1.0 { ratio = 1.0 @@ -625,7 +648,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { } // Not sure what is is L stand for. - private func getCCTOnlyLightValue(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat) -> Data { + private func getCCTOnlyLightCommand(brightness brr: CGFloat, correlatedColorTemperature cct: CGFloat) -> Data { // cct range from 0x20(32) - 0x38(56) 32 stands for 3200K 65 stands for 5600K let cctrange = CCTRange() let newCctValue: Int = Int(cct).clamped(to: cctrange.minCCT...cctrange.maxCCT) @@ -660,12 +683,20 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { var cmd: Data = Data() if lightMode == .CCTMode { if supportRGB { - cmd = getCCTLightValue(brightness: brr, correlatedColorTemperature: CGFloat(cctValue.value)) + cmd = getCCTLightCommand(brightness: brr, correlatedColorTemperature: CGFloat(cctValue.value)) } else { - cmd = getCCTOnlyLightValue(brightness: brr, correlatedColorTemperature: CGFloat(cctValue.value)) + cmd = getCCTOnlyLightCommand(brightness: brr, correlatedColorTemperature: CGFloat(cctValue.value)) } } else if lightMode == .HSIMode { - cmd = getRGBLightValue(brightness: brr, hue: CGFloat(hueValue.value) / 360.0, hue360: CGFloat(hueValue.value), satruation: CGFloat(satValue.value) / 100.0) + if NeewerLightConstant.getNewRGBLightTypes().contains(_lightType) { + cmd = getNewRGBLightCommand(mac: _macAddress ?? "", + brightness: brr, + hue: CGFloat(hueValue.value) / 360.0, + hue360: CGFloat(hueValue.value), + satruation: CGFloat(satValue.value) / 100.0) + } else { + cmd = getRGBLightCommand(brightness: brr, hue: CGFloat(hueValue.value) / 360.0, hue360: CGFloat(hueValue.value), satruation: CGFloat(satValue.value) / 100.0) + } } else { cmd = getSceneValue(channel.value, brightness: CGFloat(brr)) } @@ -675,7 +706,7 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { write(data: cmd as Data, to: characteristic) } - private func getRGBLightValue(brightness brr: CGFloat, hue theHue: CGFloat, hue360 theHue360: CGFloat, satruation sat: CGFloat ) -> Data { + private func getRGBLightCommand(brightness brr: CGFloat, hue theHue: CGFloat, hue360 theHue360: CGFloat, satruation sat: CGFloat ) -> Data { var ratio = 100.0 if brr > 1.0 { ratio = 1.0 @@ -714,6 +745,70 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { return NSData(bytes: bArr1, length: bArr1.count) as Data } + private func getNewRGBLightCommand(mac: String, brightness brr: CGFloat, hue theHue: CGFloat, hue360 theHue360: CGFloat, satruation sat: CGFloat ) -> Data { + /* + Apr 28 12:12:27.429 ATT Send 0x005B 00:00:00:00:00:00 Write Command - Handle:0x000E - Value: 788F 0CF7 AC16 F158 9686 4500 5C32 0004 SEND + + CMD TAG SIZE MAC SUB_TAG (HUE 0~360) (SAT 00~64) (BRR 00~64) (??) (checksum) + 78 8F 0C (F7 AC 16 F1 58 96) 86 45 00 5C 32 00 04 + + 78,8f,0b,f7,ac,16,f1,58,96,53,01,43,49,00,8a + */ + + var ratio = 100.0 + if brr > 1.0 { + ratio = 1.0 + } + // brr range from 0x00 - 0x64 + let newBrrValue: Int = Int(brr * ratio).clamped(to: 0...100) + let newSatValue: Int = Int(sat * 100.0).clamped(to: 0...100) + let newHueValue = Int(theHue * 360.0).clamped(to: 0...360) + let newHue360Value = Int(theHue360).clamped(to: 0...360) + + // Red 7886 0400 0064 643F + // Blue 7886 04E7 0064 64B0 + // Yell 7886 043E 0064 64B0 + // Gree 7886 0476 0064 643F + // Red 7886 0468 0164 643F + // Logger.debug("hue \(newHueValue) sat \(newSatValue)") + + let byteCount = 4 + 6 + 1 + 1 + var bArr: [Int] = [Int](repeating: 0, count: byteCount + 4) + + bArr[0] = NeewerLightConstant.BleCommand.prefixTag + bArr[1] = NeewerLightConstant.BleCommand.setNewRGBLightTag + bArr[2] = byteCount + // mac address + var macArray = mac.split(separator: ":").compactMap { Int($0, radix: 16) } + while macArray.count < 6 { + macArray.append(0) + } + bArr[3] = macArray[0] + bArr[4] = macArray[1] + bArr[5] = macArray[2] + bArr[6] = macArray[3] + bArr[7] = macArray[4] + bArr[8] = macArray[5] + + // sub-tag + bArr[9] = NeewerLightConstant.BleCommand.setNewRGBLightSubTag + + // 4 eletements + bArr[10] = Int(newHueValue & 0xFF) + bArr[11] = Int((newHueValue & 0xFF00) >> 8) // callcuated from rgb + bArr[12] = newSatValue // satruation 0x00 ~ 0x64 + bArr[13] = newBrrValue // brightness + bArr[14] = 0 // ?? + + brrValue.value = newBrrValue + hueValue.value = newHue360Value + satValue.value = newSatValue + + let bArr1: [UInt8] = appendCheckSum(bArr) + + return NSData(bytes: bArr1, length: bArr1.count) as Data + } + private func getSceneValue(_ scene: UInt8, brightness brr: CGFloat) -> Data { // 78 88 02 (br) 01 - sets the brightness to (br), and shows "emergency mode A" (the "police sirens") @@ -818,16 +913,16 @@ class NeewerLight: NSObject, ObservableNeewerLightProtocol { bArr[0] = NeewerLightConstant.BleCommand.prefixTag // 78 bArr[1] = NeewerLightConstant.BleCommand.setSCEDataTag // 91 bArr[2] = byteCount - var intArray = mac.split(separator: ":").compactMap { Int($0, radix: 16) } - while intArray.count < 6 { - intArray.append(0) - } - bArr[3] = intArray[0] - bArr[4] = intArray[1] - bArr[5] = intArray[2] - bArr[6] = intArray[3] - bArr[7] = intArray[4] - bArr[8] = intArray[5] + var macArray = mac.split(separator: ":").compactMap { Int($0, radix: 16) } + while macArray.count < 6 { + macArray.append(0) + } + bArr[3] = macArray[0] + bArr[4] = macArray[1] + bArr[5] = macArray[2] + bArr[6] = macArray[3] + bArr[7] = macArray[4] + bArr[8] = macArray[5] bArr[9] = NeewerLightConstant.BleCommand.setSCESubTag bArr[10] = Int(channel.value) var idx = 11 diff --git a/NeewerLite/NeewerLite/Model/NeewerLightConstant.swift b/NeewerLite/NeewerLite/Model/NeewerLightConstant.swift index 4122099..f198619 100644 --- a/NeewerLite/NeewerLite/Model/NeewerLightConstant.swift +++ b/NeewerLite/NeewerLite/Model/NeewerLightConstant.swift @@ -24,6 +24,8 @@ class NeewerLightConstant { static let setRGBLightTag = 0x86 // 134 Set RGB Light Mode. static let setCCTLightTag = 0x87 // 135 Set CCT Light Mode. + static let setNewRGBLightTag = 0x8f // Set New RGB Light Mode. + static let setNewRGBLightSubTag = 0x86 static let setSceneTag = 0x88 // 136 Set Scene Light Mode. static let setSCESubTag = 0x8B // @@ -32,21 +34,39 @@ class NeewerLightConstant { static let setCCTDataTag = 0x90 // 144 Set Continuity RGB Light Mode. static let setSCEDataTag = 0x91 // - static let powerOn = Data([0x78, 0x81, 0x01, 0x01, 0xFB]) - static let powerOff = Data([0x78, 0x81, 0x01, 0x02, 0xFC]) - static let readRequest = Data([0x78, 0x84, 0x00, 0xFC]) + static let powerOn = Data([UInt8(prefixTag), 0x81, 0x01, 0x01, 0xFB]) + static let powerOff = Data([UInt8(prefixTag), 0x81, 0x01, 0x02, 0xFC]) + + static let powerNewTag = 0x8D + static let powerNewSubTag = 0x81 + static let powerNewOnSubTag = [0x1] + static let powerNewOffSubTag = [0x2] + + static let readRequest = Data([UInt8(prefixTag), 0x84, 0x00, 0xFC]) + } + + class func getNewPowerLightTypes() -> [UInt8] { + return [42] + } + + class func getNewRGBLightTypes() -> [UInt8] { + return [42] } class func getRGBLightTypes() -> [UInt8] { return [3, 5, 8, 9, 11, 12, 15, 16, 18, 19, 20, 21, 22, 26, 29, 32, 34, 39, 40, 42, 43, 56, 57, 59] } + class func getCCTGMLightTypes() -> [UInt8] { + return [22, 26, 42] + } + class func getMusicSupportLightTypes() -> [UInt8] { return [8, 18, 43, 20, 21, 40, 14, 34, 25, 30, 38, 28, 19, 26, 42, 16, 27, 32, 37, 31, 22, 44, 46, 45, 47, 49, 50, 51, 52, 53, 54, 55, 39, 58, 56, 57, 59, 60, 61, 62, 63] } class func getRGBLightTypesThatSupport17FX() -> [UInt8] { - return [8, 16, 20, 22, 34, 40] + return [8, 16, 20, 22, 34, 40, 42] } class func getRGBLightTypesThatSupport9FX() -> [UInt8] { @@ -67,6 +87,29 @@ class NeewerLightConstant { return false } + class func CCTRange(ligthType: UInt8, projectName: String) -> (minCCT: Int, maxCCT: Int) { + // Default CCT range from 3200k–5600k + if ligthType == 6 { + if projectName.contains("SL140") { + // https://neewer.com/products/neewer-sl-140-rgb-led-light-full-color-rechargeable-pocket-size-10097200?_pos=2&_sid=3ff26da17&_ss=r + return (minCCT: 25, maxCCT: 90) + } else { + // some lights support extended CCT range from 3200K–8500K such as + // https://neewer.com/products/neewer-sl80-10w-rgb-led-video-light-10097903?_pos=1&_sid=dfa97e049&_ss=r&variant=37586440683713 + return (minCCT: 25, maxCCT: 85) + } + } + if ligthType == 22 { + return (minCCT: 27, maxCCT: 65) + } + if ligthType == 42 { + // some lights support extended CCT range from 2500K–10000K such as + // https://ca.neewer.com/products/neewer-bh30s-rgb-led-tube-light-wand-66602411 + return (minCCT: 25, maxCCT: 100) + } + return (minCCT: 32, maxCCT: 56) + } + class func getProjectName(_ idx: Int) -> String { switch idx { case 8: @@ -121,6 +164,34 @@ class NeewerLightConstant { return "PL60C" case 63: return "RP19C" + case 64: + return "TL97C" + case 65: + return "VL67C" + case 66: + return "HS60B" + case 67: + return "TL40" + case 68: + return "Q200" + case 69: + return "TL21C" + case 73: + return "MS150C" + case 74: + return "CB200C" + case 75: + return "FS150C" + case 78: + return "MS60" + case 79: + return "MS150" + case 82: + return "CB300C" + case 84: + return "CB120B" + case 83: + return "AP150C-2" default: return "" } @@ -284,7 +355,7 @@ class NeewerLightConstant { } // classes4/sources/neewer/clj/fastble/data/BleDevice.java - class func getLightType(nickName: String, str: String, projectName: String) -> UInt8 { + class func getLightType(nickName: String, rawname: String, projectName: String) -> UInt8 { // decoded from Android app, // what does these light types means? // Not sure. @@ -392,6 +463,10 @@ class NeewerLightConstant { lightType = 46 return lightType } + if nickName.contains("CB300") && (rawname.contains("20230111") || rawname == "NW-CB300") { + lightType = 81 + return lightType + } if nickName.contains("CB300B") { lightType = 47 return lightType @@ -444,6 +519,69 @@ class NeewerLightConstant { lightType = 63 return lightType } + if nickName.contains("VL67C") { + lightType = 65 + return lightType + } + if nickName.contains("TL97C") { + lightType = 64 + return lightType + } + if nickName.contains("HS60B") { + lightType = 66 + return lightType + } + if nickName.contains("TL40") { + lightType = 67 + return lightType + } + if nickName.contains("Q200") { + lightType = 68 + return lightType + } + if nickName.contains("TL21C") { + lightType = 69 + return lightType + } + if nickName.contains("MS150C") { + lightType = 73 + return lightType + } + if nickName.contains("CB200C") { + lightType = 74 + return lightType + } + if nickName.contains("FS150C") { + lightType = 75 + return lightType + } + if nickName.contains("MS60") { + lightType = 78; + return lightType + } + if nickName.contains("MS150") { + lightType = 79 + return lightType + } + if nickName.contains("CB300C") { + lightType = 82 + return lightType + } + if nickName.contains("CB120B") { + lightType = 84 + return lightType + } + if nickName.contains("AP150C-2") { + lightType = 83 + return lightType + } + if !nickName.contains("T100C-2") { + if nickName.contains("TL40-2") { + lightType = 86 + } + lightType = 0 + } + lightType = 0 return lightType } @@ -482,9 +620,9 @@ class NeewerLightConstant { lightType = 29 } if nickName.contains("BH-30S RGB") { - lightType = str.contains("20230021") ? 42 : 26 + lightType = rawname.contains("20230021") ? 42 : 26 } else if nickName.contains("TL60 RGB") { - lightType = str.contains("20230064") ? 59 : 32 + lightType = rawname.contains("20230064") ? 59 : 32 } else if nickName.contains("RGB62") { lightType = 40 } else { diff --git a/NeewerLite/NeewerLite/Model/NeewerLightFX.swift b/NeewerLite/NeewerLite/Model/NeewerLightFX.swift index 3d7e221..7077b8d 100644 --- a/NeewerLite/NeewerLite/Model/NeewerLightFX.swift +++ b/NeewerLite/NeewerLite/Model/NeewerLightFX.swift @@ -20,6 +20,7 @@ struct ColorItem: Codable { class NeewerLightFX: NSObject, Codable { var id: UInt16 var name: String + var iconName: String var needBRR: Bool = false var needBRRUpperBound: Bool = false @@ -41,6 +42,7 @@ class NeewerLightFX: NSObject, Codable { init(id: UInt16, name: String) { self.id = id self.name = name + self.iconName = "" super.init() } @@ -48,6 +50,7 @@ class NeewerLightFX: NSObject, Codable { self.id = id self.name = name self.needBRR = brr + self.iconName = "" super.init() } @@ -113,6 +116,7 @@ extension NeewerLightFX { // Class method to create a "Lighting" scene class func lightingScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x01, name: "Lighting") + scene.iconName = "bolt.fill" scene.needBRR = true scene.needCCT = true scene.needSpeed = true @@ -123,6 +127,7 @@ extension NeewerLightFX { // Class method to create a "Paparazzi" scene class func paparazziScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x02, name: "Paparazzi") + scene.iconName = "camera.shutter.button" scene.needBRR = true scene.needCCT = true scene.needGM = true @@ -134,6 +139,7 @@ extension NeewerLightFX { // Class method to create a "Defective bulb" scene class func defectiveBulbScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x03, name: "Defective bulb") + scene.iconName = "lightbulb.min.badge.exclamationmark.fill" scene.needBRR = true scene.needCCT = true scene.needGM = true @@ -145,6 +151,7 @@ extension NeewerLightFX { // Class method to create an "Explosion" scene class func explosionScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x04, name: "Explosion") + scene.iconName = "timelapse" scene.needBRR = true scene.needCCT = true scene.needGM = true @@ -276,6 +283,7 @@ extension NeewerLightFX { // Class method to create a "TV Screen" scene class func tvScreenScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x0F, name: "TV Screen") + scene.iconName = "tv" scene.needBRR = true scene.needCCT = true scene.needGM = true @@ -287,6 +295,7 @@ extension NeewerLightFX { // Class method to create a "Firework" scene class func fireworkScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x10, name: "Firework") + scene.iconName = "fireworks" scene.needBRR = true scene.needSpeed = true scene.speedLevel = 10 @@ -302,6 +311,7 @@ extension NeewerLightFX { // Class method to create a "Party" scene class func partyScene() -> NeewerLightFX { let scene = NeewerLightFX(id: 0x11, name: "Party") + scene.iconName = "party.popper.fill" scene.needBRR = true scene.needSpeed = true scene.speedLevel = 10 diff --git a/NeewerLite/NeewerLite/Resources/Base.lproj/MainMenu.xib b/NeewerLite/NeewerLite/Resources/Base.lproj/MainMenu.xib index 00c27af..a824125 100644 --- a/NeewerLite/NeewerLite/Resources/Base.lproj/MainMenu.xib +++ b/NeewerLite/NeewerLite/Resources/Base.lproj/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -821,7 +821,7 @@ - + @@ -860,7 +860,7 @@ - + @@ -874,7 +874,7 @@ - + @@ -965,7 +965,7 @@ - + @@ -979,7 +979,7 @@ - + @@ -1025,7 +1025,7 @@ - + @@ -1070,7 +1070,7 @@ - + @@ -1093,7 +1093,7 @@ -