首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >核心蓝牙-与LED灯通信

核心蓝牙-与LED灯通信
EN

Stack Overflow用户
提问于 2021-12-01 11:27:44
回答 1查看 104关注 0票数 2

我的工作是核心蓝牙通信与LED灯。当外围设备将值写入通信时,需要一些时间从硬件(.As)中获得响应,我们使用UISLider来写入我们面临的硬件延迟值。我认为每当我们快速移动滑块时,队列就会出现。我怎样才能弥补这个延误?

代码语言:javascript
复制
    let slider0:UInt8 = UInt8(sliderBrightness.value) // Brightness
    let slider1:UInt8 = UInt8(mode) // Mode
    let slider2:UInt8 = UInt8(sliderDirection.value) // Direction
    let slider3:UInt8 = UInt8(sliderStrength.value) // Strength
    let slider4:UInt8 = UInt8(sliderWhite.value) // Neutral LED Dimming
    let slider5:UInt8 = UInt8(sliderOrange.value) // Warm LED Dimming
    let slider6:UInt8 = UInt8(mode == 3 ? sliderOrbit.value : sliderOnTime.value)  // According to Mode
    let slider7:UInt8 = UInt8(sliderOffTime.value) // According to Mode
    let slider8:UInt8 = UInt8(255)
    let buff: [UInt8] = [slider0,slider1,slider2,slider3,slider4,slider5,slider6,slider7,slider8]
    
    let data = Data(bytes: buff, count: buff.count)
    let sliderVal = Int(sender?.value ?? 0.0)
    guard let char  = ledChar else {return}
    if sender == nil || sliderVal % 1 == 0 {
        print(sliderVal)
        
        if sender != nil, previousValue == sliderVal {
            return
        }
        previousValue = sliderVal
        pendingRequestWorkItem?.cancel()

        let requestWorkItem = DispatchWorkItem { [weak self] in
            self?.writeLEDValueToChar( withCharacteristic: char, withValue: data)
        }

        pendingRequestWorkItem = requestWorkItem
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(12),
                                      execute: requestWorkItem)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-03 05:44:51

您可以尝试的一件事是将所有的分派队列一起删除并直接写入值。当然,有些值将不会被写入,因为手机仍将处理最后的值传输。您可以简单地忽略此错误。像这样的东西可以起作用:

代码语言:javascript
复制
if sender == nil || sliderVal % 1 == 0 {
    print(sliderVal)
        
    if sender != nil, previousValue == sliderVal {
        return
    }
    previousValue = sliderVal
    writeLEDValueToChar( withCharacteristic: char, withValue: data)
}

另一种方法可以是通过设置滑块的步距宽度而不使用滑块中的所有可能值:

代码语言:javascript
复制
Slider(
    value: $speed,
    in: 0...100,
    step: 5
)

这样你就只能得到0,5,10,15,.而不是0.0000,0.0001,0.0002,,这将在移动滑块时减少DispatchQueue中的条目数量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70183375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档