Priorisierung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Hallo,

hier noch eine Frage zur Priorisierung. So wie der Skript jetzt ist, kann VideoDetect_2 oder VideoDetect_3 nicht kommen solange VideoDetect_1 aktiv ,
genauso wie VideoDetect_3 nicht über VideoDetect_2 kommt.
Mache ich alles als if geht es zwar, flackert sich aber hin und her...

Gibt es eine Möglichkeit , das der, der zuletzt kommt über geht ???

#Loop
while True:

VideoDetect_1 = GPIO.input(GPIO_VideoDetect_1)
VideoDetect_2 = GPIO.input(GPIO_VideoDetect_2)
VideoDetect_3 = GPIO.input(GPIO_VideoDetect_3)


if VideoDetect_1 == True:
print ("VideoDetect_1")
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x81) #Input 1 to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x81) #Input 1 to Output 2
i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x87) #Input 4 to Output 3
i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x87) #Input 4 to Output 4
i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x81) #Input 1 to OSD In
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
max7456.printStr(14,1, "CQ 10.420GHz ", enable = True)
flashleds (1)

elif VideoDetect_2 == True:
print ("VideoDetect_2")
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x83) #Input 2 to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x83) #Input 2 to Output 2
i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x89) #Input 5 to Output 3
i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x89) #Input 5 to Output 4
i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x83) #Input 2 to OSD In
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
max7456.printStr(14,1, "CQ 1.251GHz ", enable = True)
flashleds (2)

elif VideoDetect_3 == True:
print ("VideoDetect_3")
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x85) #Input 3 to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x85) #Input 3 to Output 2
i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x8b) #Input 6 to Output 3
i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x8b) #Input 6 to Output 4
i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x85) #Input 3 to OSD In
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
max7456.printStr(14,1, "Test ", enable = True)
flashleds (3)

else:
print ("Pi")
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x8c) #Input Pi-V to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x8c) #Input Pi-V to Output 2
i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x89) #Input 5 to Output 3
i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x8b) #Input 6 to Output 4
i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x8c) #Input Pi-V to OSD In
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
max7456.printStr(14,1, datetime.datetime.now().strftime(dateString), enable = True)
max7456.printStr(14,9, ", Pi Temp C", enable = True)
file = open("/home/pi/1.txt","r")
max7456.printStr(14,19, file.readline(4), enable = True)
file.close()
flashleds (0)
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nochmal: bitte Code-Tags benutzen. Das ist so nicht lesbar.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit „kann nicht kommen”? Dauert das Schreiben auf den i2c-Bus zu lange?
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

__deets__ hat geschrieben: Mittwoch 29. August 2018, 17:03 Nochmal: bitte Code-Tags benutzen. Das ist so nicht lesbar.
Hallo,

wie genau geht das ?

GLG Marco
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Sirius3 hat geschrieben: Mittwoch 29. August 2018, 18:14 Was meinst Du mit „kann nicht kommen”? Dauert das Schreiben auf den i2c-Bus zu lange?
Hallo,

nein, mein Problem liegt in der Priorisierung der 3 VideoDetect, welche mit "if" und "elif" stehen.
Hiermit wird eine Videomatrix geschaltet - d.H. wenn VideoDetect_1 aktiv ist, dann sieht man ein Bild.
Sobald nun dazu noch VideoDetect_2 oder _3 kommt bleibt _1, wird nicht weggeschaltet...
d.H. VideoDetect_1 hat die höchste Prio, gefolgt von _2 und dann _3.

Schöner wäre es, wenn VideoDetect_1 aktiv, trotzdem VideoDetect_2 oder _3, was zuletzt kommt je
überall drüber kommt...

Mache ich anstelle elif überall if, dann kommt zwar jeder , aber da aktiv wird immer wegen der while schleife
hin und her geschaltet...

lg Marco
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit „drüber kommt“? Wie willst Du mehrere Bilder gleichzeitig haben?
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also grundsätzlich wird der Code sequentiell durchlaufen, d.h. eine Zeile nach der anderen. Wenn die Bedingung für einen if / elif Block zutrifft wird der komplette Code, der zu diesem Bedingungsblock gehört, durchlaufen. Und in dieser Zeit können keine anderen if / elif evaluiert werden.

Wenn du das echt parallesieren willst, dann müsstest du das via Multiprocessing parallesieren. Wobei das auch nichts bringt, wenn das Schreiben auf den I2C Bus zu lange dauert.

Es würde aber erst mal helfen, wenn du in verständlichen und für aussenstehende wie uns nachvollziehbaren Worten beschreibst, was du genau vor hast. "kommt nicht" und "drüber kommen" ist jetzt so keine wirklich holfreiche Beschreibung deines Problems.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kurze Nebenfrage: Warum wird bei `readline()` die 4 als Argument übergeben? Das sieht mir etwas komisch aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

__blackjack__ hat geschrieben: Donnerstag 30. August 2018, 10:43 Kurze Nebenfrage: Warum wird bei `readline()` die 4 als Argument übergeben? Das sieht mir etwas komisch aus.
__blackjack__ hat geschrieben: Donnerstag 30. August 2018, 10:43 Kurze Nebenfrage: Warum wird bei `readline()` die 4 als Argument übergeben? Das sieht mir etwas komisch aus.
Hallo,

das mit der 4 habe ich auch nicht verstanden,
mache ich dort aber nur () liest er nur das erste Zeichen aus...

in der 1.txt hole ich mir die CPU Temp im Wert
z.b. 44.4
lasse ich die 4 weg kopiert er nur 4 in das OSD...
erst die 4 gibt die 44.4 aus, bei 3 44. usw...

LG






Hallo,

diese Schaltung ist eine Video Syncron Auswertung und schaltet bei erkannten Syncron das Bild mit Ton über eine Video matrix per I2C auf zwei Ausgänge durch.
Diese Schaltung möchte ich für ein Amateurfunk Television Relais als Userauswertung für die "Eingaben" benutzen.

d.H. sendet keiner ein Bild mit Syncron soll der Pi ein Testbild darstellen, das ist "else".

An den Eingängen von VideoDetect_1...3 sind Analoge SAT Empfänger angeschlossen , welche quasi kein Empfang haben und dadurch nur ein Rauschen ohne Sync ausgeben. Erst wenn ein User auf dessen Frequenz sendet und einer der SAT Empfänger dann ein Bild mit Sync hat schaltet die Video Matrix das auf seine Ausgänge.

zzt ist das so, das wenn ein User über VideoDetect_1 erkannt wird und nun ein weiterer User über VideoDetect_2 oder VideoDetect_3 sendet im Skript in einer Art Warteposition bleibt, bis VideoDetect_1 kein Bild/Sync mehr hat.
erst dann wird VideoDetect_2 aktiv, wenn VideoDetect_2 kein sync mehr hat VideoDetect_3...

mein Wunsch wäre es so zu priorisieren, das egal welches VideoDetect gerade aktiv ist, die anderen beiden auch gehört und aktiv werden,
so mit dem Gedanken , wer zuletzt kommt wird aktiv und umgekehrt... also egal ob VideoDetect_1 gerade aktiv, höre trotzdem ob ein VideoDetect_2 oder _3 aktiv wird und schalte das dann...

zzt.

solange ein User über 10.420GHz sendet auf VideoDetect_1

wird

1.251GHz als VideoDetect_2 oder Test als VideoDetect_3 nicht berücksichtigt...

liegt am VideoDetect_2 z.b. ein Signal an und VideoDetect_1 auch, jetzt schaltet VideoDetect_1 weg (User schaltet seine Aussendung ab) wird VideoDetect_2 aktiv...

so läuft es zzt in der Priorisierung...
1...2...3

schön wäre es

1...3...2
2...1...3
3...2...1
1...2...3
3...1...2
usw

so das egal welcher VideoDetect gerade aktiv ist der nächste aktiv wird und die matrix entsprechend umschaltet...

Deshalb : der zuletzt erkannt wird, wird durchgeschaltet und umgekehrt...

geht das irgendwie und wenn ja wie ???

glg Marco
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DL9AM: Das kann nicht sein. `readline()` liest eine ganze Zeile und nicht nur ein Zeichen wenn man kein Argument angibt. Ich vermute eher das `max7456.printStr()` das Zeilenendezeichen nicht mag. Dann sollte man aber nicht readline() nicht die ganze Zeile lesen lassen, sondern eher das Zeichen mit `rstrip()` entfernen. Denn das mit dem Argument bei `readline()` ist wirklich sehr ungewöhnlich, und auch fragil, denn wenn mehr oder weniger Zeichen in der Zeile stehen, hat man entweder doch das Zeilenendezeichen wieder in den eingelesenen Daten, oder man liest nicht alles aus.

Was das Durchschalten angeht: Klar geht das. Du musst es halt programmieren. Du darfst die Eingänge nicht einzeln betrachten, sondern erst alle abprüfen, und Dir merken welche im letzten Durchgang aktiv/inaktiv waren, damit Du erkennen kannst welche dazu gekommen und welche weg gefallen sind. Wenn sie dazu kommen musst Du sie Dir merken, und wenn sie wegfallen aus der verwendeten Datenstruktur entfernen. Zum Beispiel eine Liste. Und nach dem Du alle abgeprüft hast in einem Durchgang, musst Du entscheiden welcher von den aktiven durchgeschaltet werden soll. Du müsstest Dir überlegen wie Du da am sinnvollsten neu hinzugekommene in die Liste einträgst, so das zum Beispiel der der angezeigt werden soll, immer der erste oder der letzte Eintrag ist. Wenn die Liste leer ist, dann ist das Testbild dran.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Hallo,

wie genau kann das aussehen mit dem rstrip() ?
Und wie muss das Python dann aussehen, bezgl. der Prioritäten ?
Ich bin leider nicht der große Python programmierer und bin auf eure Hilfe angewiesen...

glg Marco
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Habe es:

max7456.printStr(14,19, file.readline().rstrip('\n'), enable = True)

Und wie muss das Python dann aussehen, bezgl. der Prioritäten ?
Ich bin leider nicht der große Python programmierer und bin auf eure Hilfe angewiesen...

glg Marco
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Hallo,

hier nun noch mal mein aktueller Code.

Was noch falsch ist:

- Prio VideoDetect_1...3
- DTMF Auswertung -> Interrupt und mehr stellig auswerten als Interrupt
- Bei Prio Detect nur einmalig solange aktiv einen 1 Sekunden I²C senden um eine Relaisplatine ein Relais 1 Sekunde betätigen lassen
wenn Prio Detect inaktiv sollte erneut ein 1 Sekunden I²C Befehl ein anderes Relais steuern um zurück zu schalten
- Button für Reset als Interrupt um sofort zu reagieren

Code: Alles auswählen

# coding: utf-8
# HAMKit VMAC PiHat 2.4 - VideoDetect Video and Audio Matrix with OSD
# Video A/V In 1 and Audio A/V In 4 to Video A/V Out 1 and Audio A/V Out 3
# with OSD
# Video A/V In 1 and Audio A/V In 4 to Video A/V Out 2 and Audio A/V Out 4
# with OSD
# Video A/V In 2 and Audio A/V In 5 to Video A/V Out 1 and Audio A/V Out 3
# with OSD
# Video A/V In 2 and Audio A/V In 5 to Video A/V Out 2 and Audio A/V Out 4
# with OSD
# Video A/V In 3 and Audio A/V In 6 to Video A/V Out 1 and Audio A/V Out 3
# with OSD
# Video A/V In 3 and Audio A/V In 6 to Video A/V Out 2 and Audio A/V Out 4
# with OSD
# No VideoDetect Video Signal Inputs 1, 2 and 3: Video A/V In Pi with Audio
# A/V In Pi to Video A/V Out 1 and Audio A/V Out 3 with OSD
# No VideoDetect Video Signal Inputs 1, 2 and 3: Video A/V In Pi with Audio
# A/V In Pi to Video A/V Out 2 and Audio A/V Out 4 with OSD
# Marco Dittmann DL9AM, August 2018
#!/usr/bin/python

import RPi.GPIO as GPIO
import smbus
import spidev

import time
import datetime
import os
from ctypes import *

#====== GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.cleanup()

#Define GPIO Outputs
LEDStatus = 22
PTT = 27
OSD_RST = 25

#Setup Outputs
GPIO.setup(LEDStatus,GPIO.OUT)
GPIO.setup(PTT,GPIO.OUT)
GPIO.setup(OSD_RST,GPIO.OUT)

#Define GPIO Inputs
GPIO_Button = 4
GPIO_VideoDetect_1 = 18
GPIO_VideoDetect_2 = 23
GPIO_VideoDetect_3 = 24
GPIO_D0 = 26
GPIO_D1 = 19
GPIO_D2 = 13
GPIO_D3 = 6
GPIO_DINT = 5

#Setup Inputs with pull-ups enabled
GPIO.setup(GPIO_Button, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_VideoDetect_1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_VideoDetect_2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_VideoDetect_3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_D0, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_D1, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_D2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_D3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(GPIO_DINT, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Initiate LEDs
GPIO.output(LEDStatus,GPIO.HIGH)
GPIO.output(PTT,GPIO.HIGH)
time.sleep(.2)
GPIO.output(LEDStatus,GPIO.LOW)
GPIO.output(PTT,GPIO.LOW)
time.sleep(1)

#Define Variables
VideoDetect_1 = False
VideoDetect_2 = False
VideoDetect_3 = False
DValueStore = 0
dateString = '%H %M %S'

#Good old fashion subroutines
def flashleds (flashes):
    for x in range(flashes):
        GPIO.output(LEDStatus,GPIO.HIGH)
        GPIO.output(PTT,GPIO.HIGH)
        time.sleep(.2)
        GPIO.output(LEDStatus,GPIO.LOW)
        GPIO.output(PTT,GPIO.LOW)
        time.sleep(1)

print ("VideoDetect Inputs 1, 2 and 3")

#====== FMS6501 Matrix

#define values
DEVICE_BUS = 1
DEVICE_ADDR = 0x43 #0x43 or 0x03

#setup i2c bus
i2cbus = smbus.SMBus(DEVICE_BUS)

#OSD REset High
GPIO.output(OSD_RST,GPIO.HIGH)

#Set all outputs to mute.
i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x0) #Mute
time.sleep(.01)
i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x0) #Mute
time.sleep(.01)
i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x0) #Mute
time.sleep(.01)
i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x0) #Mute
time.sleep(.01)

#OSD MAX7456
class max7456():
    # Create a SPI
    spi = spidev.SpiDev()

    # MAX7456 opcodes
    VM0_reg  = 0x00
    VM1_reg  = 0x01
    HOS_reg  = 0x02
    VOS_reg  = 0x03
    DMM_reg  = 0x04
    DMAH     = 0x05
    DMAL     = 0x06
    DMDI     = 0x07
    OSDM     = 0x0C
    RB0      = 0x10
    HOS_reg  = 0x02
    STATUS   = 0xA0

    # PAL - VM0_reg commands
    ENABLE_display      = 0x48
    ENABLE_display_vert = 0x4c
    MAX7456_reset       = 0x42
    DISABLE_display     = 0x40

    # Read command
    READ = 0x80
    MAX_screen_rows = 16

    # White levels
    WHITE_level_80  = 0x03
    WHITE_level_90  = 0x02
    WHITE_level_100 = 0x01
    WHITE_level_120 = 0x00

    chars = {' ':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9,
        '0':10, 'A':11, 'B':12, 'C':13, 'D':14, 'E':15, 'F':16, 'G':17, 'H':18, 'I':19,
        'J':20, 'K':21, 'L':22, 'M':23, 'N':24, 'O':25, 'P':26, 'Q':27, 'R':28, 'S':29,
        'T':30, 'U':31, 'V':32, 'W':33, 'X':34, 'Y':35, 'Z':36, 'a':37, 'b':38, 'c':39,
        'd':40, 'e':41, 'f':42, 'g':43, 'h':44, 'i':45, 'j':46, 'k':47, 'l':48, 'm':49,
        'n':50, 'o':51, 'p':52, 'q':53, 'r':54, 's':55, 't':56, 'u':57, 'v':58, 'w':59,
        'x':60, 'y':61, 'z':62, '(':63, ')':64, '.':65, '?':66, ';':67, ':':68, ',':69,
        '´':70, '/':71, '"':72, '-':73, '<':74, '>':75, '@':76

    }

    def __init__(self):
        # Open a SPI port - max7456 connected on SPI0
        self.spi.open(0, 0)
        self.spi.max_speed_hz = 1000000
        self.spi.bits_per_word = 8
        self.spi.cshigh = False
        self.spi.lsbfirst = False
        self.spi.mode = 0

        # On init, reset max7456
        self.reset()

        # Set all rows at the same white level
        for x in range (0, self.MAX_screen_rows):
          self.spi.xfer2([(self.RB0 + x), self.WHITE_level_90])

        # Enable max7456
        self.spi.xfer2([self.VM0_reg, self.ENABLE_display]);

    def printStr(self, X, Y, string, enable = True):
        disp = []
        for char in string:
                 disp.append(self.chars[char])

        print (string)

        if enable == False:
            self.spi.xfer([self.VM0_reg, self.Disable_display])

        # Enable 8 bit mode:
        dmm = self.spi.xfer2([self.DMM_reg + self.READ, 0x00])
        dmm = self.setBit(dmm[1], 6)
        self.spi.xfer2([self.DMM_reg, dmm])

        start = X * 30 + Y

        # Clear position
        self.spi.xfer2([self.DMAH, 0x00])
        self.spi.xfer2([self.DMAL, 0x00])

        for char in disp:
            # Write char
            dmah = self.spi.xfer2([self.DMAH + self.READ, 0x00])
            dmah = self.clearBit(dmah[1], 1)
            self.spi.xfer2([self.DMAH, dmah])

            dmah_pos = ((start >> 8) & 0x01)
            dmal = (start & 0xff)
            dmah = dmah | dmah_pos
            start = start + 1

            # Select MSB
            self.spi.xfer2([self.DMAH, dmah])
            self.spi.xfer2([self.DMAL, dmal])

            self.spi.xfer2([self.DMDI, (char)])

    def reset(self):
        self.spi.xfer2([self.VM0_reg, self.MAX7456_reset])
        time.sleep(0.1)
        while True:
            r = self.spi.xfer([self.STATUS, 0x00])
            stable = self.testBit(r[1], 1)
            if stable == 0:
                print ("Reset MAX7456 Ok...")
                break
            break

    def testBit(self, value, offset):
        mask = 1 << value
        return(value & mask)

    def setBit(self, value, offset):
        mask = 1 << offset
        return(value + mask)

    def clearBit(self, int_type, offset):
        mask = ~(1 << offset)
        return(int_type & mask)

try:
    max7456 = max7456()

except KeyboardInterrupt:
    spi.close()

#Loop
while True:

    VideoDetect_1 = GPIO.input(GPIO_VideoDetect_1)
    VideoDetect_2 = GPIO.input(GPIO_VideoDetect_2)
    VideoDetect_3 = GPIO.input(GPIO_VideoDetect_3)


    Button = GPIO.input(GPIO_Button)
    if Button == False:
        max7456.printStr(1,1, "HAMKit VMAC PiHat", enable = True)
        max7456.printStr(2,1, "Reboot by Sysop", enable = True)
        flashleds (10)
        os.system("sudo reboot")

    DINT = GPIO.input(GPIO_DINT)
    if DINT == True:
        D0 = GPIO.input(GPIO_D0)
        D1 = GPIO.input(GPIO_D1)
        D2 = GPIO.input(GPIO_D2)
        D3 = GPIO.input(GPIO_D3)
        DValue = D0+(D1*2)+(D2*4)+(D3*8)
        if DValue == 1:
            max7456.printStr(1,1, "CQ de 10.420GHz", enable = True)
            time.sleep(10)
            max7456.printStr(1,1, "               ", enable = True)
        elif DValue == 2:
              max7456.printStr(1,1, "CQ de 1.251GHz ", enable = True)
              time.sleep(10)
              max7456.printStr(1,1, "               ", enable = True)
        elif DValue == 3:
              max7456.printStr(1,1, "CQ de Test     ", enable = True)
              time.sleep(10)
              max7456.printStr(1,1, "               ", enable = True)

    if VideoDetect_1 == True:
        print ("VideoDetect_1")
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x81) #Input 1 to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x81) #Input 1 to Output 2
        i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x87) #Input 4 to Output 3
        i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x87) #Input 4 to Output 4
        i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x81) #Input 1 to OSD In
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
        max7456.printStr(14,1, "CQ 10.420GHz           ", enable = True)
        flashleds (1)

    elif VideoDetect_2 == True:
        print ("VideoDetect_2")
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x83) #Input 2 to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x83) #Input 2 to Output 2
        i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x88) #Input 5 to Output 3
        i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x88) #Input 5 to Output 4
        i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x83) #Input 2 to OSD In
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
        max7456.printStr(14,1, "CQ 1.251GHz            ", enable = True)
        flashleds (2)

    elif VideoDetect_3 == True:
        print ("VideoDetect_3")
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x85) #Input 3 to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x85) #Input 3 to Output 2
        i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x89) #Input 6 to Output 3
        i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x89) #Input 6 to Output 4
        i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x85) #Input 3 to OSD In
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
        max7456.printStr(14,1, "Test                   ", enable = True)
        flashleds (3)

    else:
        print ("Pi")
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x8c) #Input Pi-V to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x8c) #Input Pi-V to Output 2
        i2cbus.write_byte_data(DEVICE_ADDR, 0x06, 0x8b) #Input Pi-A to Output 3
        i2cbus.write_byte_data(DEVICE_ADDR, 0x09, 0x8b) #Input Pi-A to Output 4
        i2cbus.write_byte_data(DEVICE_ADDR, 0x07, 0x8c) #Input Pi-V to OSD In
        i2cbus.write_byte_data(DEVICE_ADDR, 0x01, 0x86) #Input OSD to Output 1
        i2cbus.write_byte_data(DEVICE_ADDR, 0x03, 0x86) #Input OSD to Output 2
        max7456.printStr(14,1, datetime.datetime.now().strftime(dateString), enable = True)
        max7456.printStr(14,9, ", Pi Temp     C", enable = True)
        file = open("/home/pi/1.txt","r")
        max7456.printStr(14,19, file.readline().rstrip('\n'), enable = True)
        file.close()
        flashleds (0)

    #Heatbeat PTT LED as test
    GPIO.output(PTT,GPIO.HIGH)
    time.sleep(.2)
    GPIO.output(PTT,GPIO.LOW)
    time.sleep(1)
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer deine Priorisierung kannst du zB das hier verwenden:

Code: Alles auswählen

class SourceStack(object):


    def __init__(self):
        self._stack = []


    def on(self, value):
        if value not in self._stack:
            self._stack.append(value)


    def off(self, value):
        if value in self._stack:
            self._stack.remove(value)


    @property
    def current(self):
        return self._stack[-1] if self._stack else None


VIDEO1, VIDEO2, VIDEO3 = "video1", "video2", "video3"

ss = SourceStack()

ss.on(VIDEO1)
print(ss.current)
ss.on(VIDEO1)
print(ss.current)
ss.off(VIDEO2)
print(ss.current)
ss.on(VIDEO2)
print(ss.current)
ss.off(VIDEO1)
print(ss.current)
ss.off(VIDEO2)
print(ss.current)
Einfach einbauen in dein Skript, und die entsprechende on/off Aufrufe veranlassen je nach Zustand der Pins. Besser waere es allerdings, auch diese Pins per add_event_detect zu ueberwachen, statt immer muehselig zu pollen. Dann muss man aber die Zugriffe auf on/off/current noch per Lock absicher:

Code: Alles auswählen

import threading
class SourceStack(object):

    def __init__(self):
        self._stack = []
        self._lock = threading.Lock()

    def on(self, value):
        with self._lock:
            if value not in self._stack:
                self._stack.append(value)


    def off(self, value):
        with self._lock:
            if value in self._stack:
                self._stack.remove(value)


    @property
    def current(self):
        with self._lock:
            return self._stack[-1] if self._stack else None
Ganz allgemein wirst du um mehr Programmiererfahrung sammeln um dein Problem zu loesen nicht herumkommen. Mit dem notwendigen testen und hin und her sind das durchaus einige Stunden Arbeit fuer zB jemanden wie mich. Die mal so eben rauszuhauen fuer jeden, der hier ein Problem hat (gerade parallel gibt's ja eine gleiche Anfrage fuer ein Azubi-Projekt...) kann ich mir nicht leisten.
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

Hallo,

ja das ist schon sehr komplex für mich...
der Einbau im Skript ist das eine, aber wie die PIN's zuordnen ?

glg Marco
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zeige ich doch. Die Klasse erwartet einfach nur drei unterschiedliche Werte, ich habe mir dafuer Konstanten definiert. Du hast doch auch schon welche.
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

__deets__ hat geschrieben: Donnerstag 30. August 2018, 16:45 Zeige ich doch. Die Klasse erwartet einfach nur drei unterschiedliche Werte, ich habe mir dafuer Konstanten definiert. Du hast doch auch schon welche.
Hallo,

ja aber es geht so nicht, habe es so probiert und aus "video1"... "VideoDetect_1"... probiert, aber egal wie ich stecke, es ist immer noch die
prio ;-(

glg Marco
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiss jetzt nicht, was du damit meinst. Dazu musst du schon zeigen, wie konkret du das eingebaut hast. Und du musst auch ein bisschen Logik drumrum haben, denn du musst ja nur was machen, wenn sich was geaendert hat. Das nimmt dir die Komponente nicht ab, die trifft nur die Entscheidung, was jetzt gerade aktiv ist.
DL9AM
User
Beiträge: 27
Registriert: Mittwoch 29. August 2018, 14:28

__deets__ hat geschrieben: Donnerstag 30. August 2018, 17:01 Ich weiss jetzt nicht, was du damit meinst. Dazu musst du schon zeigen, wie konkret du das eingebaut hast. Und du musst auch ein bisschen Logik drumrum haben, denn du musst ja nur was machen, wenn sich was geaendert hat. Das nimmt dir die Komponente nicht ab, die trifft nur die Entscheidung, was jetzt gerade aktiv ist.
Hallo,

ich hatte das direkt über die def des MAX7456 gepackt...
wenn ich den Skript starte zeigt er mir kurz video1...4 an und dann den max reset und dann läuft die while...

glg Marco
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit einer solchen Aussage kann man nix anfangen. Einfach nur einkopiert bewirkt der Code gar nix. Und wie genau du den verwendest wird aus einer solchen Beschreibung nicht ersichtlich. Also bitte poste deinem Code.
Antworten