示例#1
0
def rcProcess(state, lock, rate_q, change_q):
    """Provide work with rc serial port


       :param state: current system state
       :param lock: lock for global variables
       :param rate_q: queue with video rate value
       :param change_q: queue with video change flag
    """

    state_list = [1, 2, 3, 5]
    rc_ser = SerialConnection(device_name='RC',
                              device_id='1411')  # Create rc serial connection
    flag = True
    prev_rate = 0

    while True:

        if state.value in state_list:

            if state.value == 1:
                # Wait for start command

                flag = True

                if rc_ser.ser.inWaiting() > 0:
                    msg = rc_ser.getData()

                    if b'1000' in msg:

                        lock.acquire()
                        state.value = 2
                        lock.release()

            elif state.value == 2:
                # Check special commands

                if rc_ser.ser.inWaiting() > 0:
                    msg = rc_ser.getData()

                    if b'5000' in msg:
                        # Quest timeout command
                        lock.acquire()
                        state.value = 8
                        lock.release()

                    elif b'6000' in msg:
                        # Quest trouble end
                        lock.acquire()
                        state.value = 4
                        lock.release()

            elif state.value == 3:
                # Check special commands

                if rc_ser.ser.inWaiting() > 0:
                    msg = rc_ser.getData()

                    if b'5000' in msg:

                        lock.acquire()
                        state.value = 8
                        lock.release()

                    elif b'6000' in msg:

                        lock.acquire()
                        state.value = 4
                        lock.release()

                # Send data from Arduino
                if not (rate_q.empty()):
                    # Send new video rate value

                    rate = rate_q.get()
                    if not (prev_rate == rate) and (rate % 0.2 == 0):
                        rc_ser.sendData(msg=rate, flag=True)
                        prev_rate = rate

                if not (change_q.empty()):
                    # Send message about sub video

                    if change_q.get():

                        rc_ser.sendData(msg=b'2000')

            elif state.value == 5:

                if flag:
                    # Send end command
                    rc_ser.sendData(msg=b'4000')
                    flag = False

                # Check special command
                if rc_ser.ser.inWaiting() > 0:
                    msg = rc_ser.getData()

                    if b'5000' in msg:
                        lock.acquire()
                        state.value = 8
                        lock.release()
示例#2
0
def inoProcess(state, lock, rate_q_rc, change_q_rc, rate_q_pi, change_q_pi,
               min_val, max_val):
    """Provide work with arduino serial port


       :param state: current system state
       :param lock: lock for global variables
       :param rate_q_rc: queue with video rate value for rc
       :param change_q_rc: queue with video change flag for rc
       :param rate_q_pi: queue with video rate value for pi
       :param change_q_pi: queue with video change flag for pi
       :param min_val: minimum available video rate value
       :param max_val: maximum available video rate value
    """

    state_list = [2, 3, 4, 8]
    ino_ser = SerialConnection(
        device_name='Arduino',
        device_id='1733')  # Create arduino serial connection
    prev_rate = min_val

    while True:

        if state.value in state_list:

            if state.value == 2:
                # Send start command to Arduino
                ino_ser.sendData(msg=b'S')

                lock.acquire()
                state.value = 3
                lock.release()

            if state.value == 3:
                # Get data from Arduino

                if ino_ser.ser.inWaiting() > 0:
                    msg = ino_ser.getData()

                    if not (b'None' in msg):

                        if b'Change' in msg:

                            change_q_rc.put(True)
                            change_q_pi.put(True)

                        elif b'Up' in msg:
                            rate = setFrameTime(True, min_val, max_val,
                                                prev_rate)

                            if not (prev_rate == rate):
                                rate_q_pi.put(rate)
                                rate_q_rc.put(rate)
                                prev_rate = rate
                        else:
                            rate = setFrameTime(False, min_val, max_val,
                                                prev_rate)

                            if not (prev_rate == rate):
                                rate_q_pi.put(rate)
                                rate_q_rc.put(rate)
                                prev_rate = rate

            if state.value == 4:
                # Send end command to Arduino
                ino_ser.sendData(msg=b'E')

                if ino_ser.getResponse():
                    lock.acquire()
                    state.value = 5
                    lock.release()

            if state.value == 8:
                # Send timeout command to Arduino
                ino_ser.sendData(msg=b'T')
                prev_rate = min_val

                if ino_ser.getResponse():

                    lock.acquire()
                    state.value = 1
                    lock.release()