我需要运行一个循环,直到再次按下切换按钮而没有暂停

时间:2019-02-07 20:25:34

标签: python kivy raspberry-pi3

我正在使用Raspberry Pi 3b通过SPI从时间数字转换器(TDC-GPX2)收集数据。 TDC实质上标记何时看到事件(比如说电脉冲的上升沿),并将其定时信息发送给我的Pi。我的目标是尽可能快地收集数据而不会暂停(因为丢失的脉冲会增加数据中的错误机会),直到触发器被关闭为止。

注意:我们正在FPGA上开发LVDS通讯驱动程序,以便从TDC更快地获取数据,但这将有助于快速测试和其他项目。我们将spidev用于SPI 另外:我知道要求所有4个站点的信息都没有效率,但我可以稍后进行调整

我将Kivy用作该软件的GUI解决方案,下面将显示重要的代码片段。我正在使用带有gui的主代码和带有TDC的TDC库。我以前从未在这里发布过,所以我不确定代码中要包含什么内容,如果需要更多内容,我将其发布!我确实尝试了“线程”库,但它似乎反应迟钝,大大降低了gui的速度。

def press_callback(obj):
    global tdcinit, f
    print("Button pressed,",obj.text)

    if obj.text == 'Read TDC':
        if obj.state=="down":
            f.write("New Trial \r\n")
            TDC.ReadTDC(f,obj.state)
        else:
            TDC.ReadTDC(f,obj.state)
            TDC.Reset()
            print('Done Recording, plz save before close')

下方的按钮定义是:

Class MyApp(App):
    def build(self):
        layout=GridLayout(cols=5)
        Window.clearcolor(0.2,0.2,0.2,1)
        TDCRead = ToggleButton(text='Read TDC')
        TDCRead.bind(on_press=press_callback)
        layout.add_widget(TDCRead)

        return layout

我的TDC库中被调用的函数是:

def ReadTDC(self,f,state):
    while state=='down':
        GPIO.output(29,0) #this is just for SPI
        i=8
        j=1
        self.__transfer(0x68)
        while i<32:
            byteback = self.__transfer(0x00)
            if j<4:
                f.write("Ref: %02X\r\n" % (byteback))
                j=j+1
            elif j>=4 and j<6:
                f.write("Res: %02X\r\n" % (byteback))
            else:
                f.write("Res: %02X\r\n" % (byteback))
                j=1
            i=i+1
        GPIO.output(29,1)
    return f

__ transfer函数实际上只是使用xfer2并打印结果以进行调试。

我曾希望这可以像“按一下名为Read TDC的ToggleButton,并且循环一直运行到再次按下切换开关一样”,但是它只是集中循环,直到我按ctrl + C退出。

2 个答案:

答案 0 :(得分:0)

我最终弄清楚了这一点,这就是我如何使它工作的(再次可能不是最佳代码,但是已经过测试)。同样,这是在我的Raspberry pi上使用Kivy和Python 3。我将此添加到了初始化中:

import multiprocessing
from multiprocessing import Process, Queue

q = Queue()

我必须添加此定义才能使用多处理库(我写入文件,如果不需要,可以选择忽略此文件):

def readprocess(qstate):
    f = open("TDCData.txt","a+")
    f.write("New Trial \r\n")
    print('reading process began')
    run = True
    while run:
        while not qstate.empty():
            if qstate.get() == "stop":
                run = False
        TDC.ReadTDC(f)
    f.close()

然后我定义一个p变量,以便可以全局使用它(不确定是否需要,为了安全起见,我只是这样做了),下面是Kivy实现部分:

p=0
def press_callback(obj)
    global tdcinit, q, p
    print("Button pressed,", obj.text)
    if obj.text == 'ReadTDC':
        if obj.state =="down":
            p = Process(target = readprocess, args=(q,))
            p.start()
        else:
            q.put("stop")
            p.join()
            TDC.Reset()
            print("Done Recording")

我的TDC.Reset()函数只是调用其文档中列出的上电复位命令(停止测量并重新初始化)。 TDC库中ReadTDC的更新功能为:

def ReadTDC(self,f):
    GPIO.output(29,0)
    i=8
    j=1
    self.__transfer(0x68)
    while i<32:
        byteback=self.__transfer(0x00)
        if j<4:
            f.write("Ref: %02X\r\n" % (byteback))
            j=j+1
        elif j>=4 and j<6:
            f.write("Res: %02X\r\n" % (byteback))
            j=j+1
        else:
            f.write("Res: %02X\r\n" % (byteback))
            j=1
        i=i+1
    f.write("\r\n")
    GPIO.output(29,1)
    return f

希望这可以帮助任何对此进行搜索的人,我确实计划在使我们的TDC-GPX2,AD5592R(DAC / ADC组合)和LMH6401(可编程增益放大器)库公开后,以某种方式将它们公开(也许是Git?)。和工作。

答案 1 :(得分:-1)

我正在做类似的事情,但是使用线程,并且我希望摆脱它。因此,虽然我无法直接为您提供帮助,但也许我可以引导您阅读一些文档,我也将很快对其进行研究.....

https://docs.python.org/release/3.1.3/library/multiprocessing.html