2022-04-03 17:53:41 +02:00
|
|
|
from typing import List
|
|
|
|
from threading import Thread
|
2022-02-13 22:47:24 +02:00
|
|
|
import RPi.GPIO as GPIO
|
|
|
|
import spidev
|
|
|
|
|
|
|
|
from .MerlinMessage import MerlinMessage
|
2022-04-03 17:53:41 +02:00
|
|
|
from .lib_nrf24 import NRF24
|
2022-02-13 22:47:24 +02:00
|
|
|
|
2022-04-14 22:57:55 +02:00
|
|
|
|
2022-02-13 22:47:24 +02:00
|
|
|
GPIO.setmode(GPIO.BCM)
|
|
|
|
|
|
|
|
class Merlin():
|
|
|
|
radio: NRF24
|
|
|
|
send_queue: List[MerlinMessage] = []
|
2022-04-03 17:53:41 +02:00
|
|
|
my_urdi = [0xf0, 0xf0, 0xf0, 0xf0, 0xe1]
|
2022-02-13 22:47:24 +02:00
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
radio = NRF24(GPIO, spidev.SpiDev())
|
|
|
|
radio.begin(0, 17)
|
|
|
|
radio.setPALevel(NRF24.PA_HIGH)
|
|
|
|
radio.setDataRate(NRF24.BR_2MBPS)
|
|
|
|
radio.setChannel(0x60)
|
2022-02-16 10:44:22 +02:00
|
|
|
radio.setPayloadSize(2)
|
|
|
|
radio.setAutoAck(True)
|
2022-04-03 17:53:41 +02:00
|
|
|
#radio.setAddressWidth(4)
|
2022-02-16 10:44:22 +02:00
|
|
|
radio.enableAckPayload()
|
|
|
|
radio.openReadingPipe(1, self.my_urdi)
|
2022-02-13 22:47:24 +02:00
|
|
|
|
|
|
|
radio.startListening()
|
|
|
|
radio.stopListening()
|
|
|
|
|
|
|
|
radio.startListening()
|
|
|
|
|
|
|
|
self.radio = radio
|
|
|
|
|
2022-04-14 22:57:55 +02:00
|
|
|
def send(self, message: MerlinMessage):
|
|
|
|
self.send_queue.append(message)
|
2022-02-13 22:47:24 +02:00
|
|
|
|
|
|
|
def _send(self, message: MerlinMessage):
|
|
|
|
self.radio.stopListening()
|
2022-02-16 10:44:22 +02:00
|
|
|
self.radio.openWritingPipe(message.urdi)
|
|
|
|
self.radio.write(message.data)
|
2022-02-13 22:47:24 +02:00
|
|
|
self.radio.startListening()
|
|
|
|
|
|
|
|
def receiveAndTransmit(self):
|
|
|
|
while True:
|
|
|
|
# send messages from queue
|
|
|
|
while self.send_queue and (message := self.send_queue.pop()):
|
|
|
|
self._send(message)
|
|
|
|
|
|
|
|
# receiving messages
|
|
|
|
if not self.radio.available():
|
|
|
|
continue
|
|
|
|
|
|
|
|
rawData = []
|
|
|
|
self.radio.read(rawData, self.radio.getPayloadSize())
|
2022-04-03 17:53:41 +02:00
|
|
|
func, arg = rawData
|
2022-02-16 10:44:22 +02:00
|
|
|
print(f'{func=} {arg=}')
|
2022-02-13 22:47:24 +02:00
|
|
|
|
|
|
|
receiveAndTransmitThread = Thread(target=Merlin().receiveAndTransmit)
|
|
|
|
receiveAndTransmitThread.start()
|