Newer
Older
pyenergenie / src / energenie / radio2.py
# radio2.py  15/04/2015  D.J.Whale
#
# New version of the radio driver, with most of the fast stuff pushed into C.
#
# NOTE 1: This is partially tested, and only used for OOK transmit at the moment.
# FSK transmit and receive is inside radio.py, as the underlying radio.c code
# does not yet support FSK mode.

# NOTE 2: Also there is an idea to do a python wrapper, build the C code
# for an Arduino and wrap it with a simple serial message handler.
# This would then make it possible to use the Energenie Radio on a Mac/PC/Linux
# machine but by still using the same higher level Python code.
# All you would need is a different radio.py that marshalled data to and from
# the Arduino via pyserial.

#TODO: Should really add parameter validation here, so that C code doesn't have to.
#although it will be faster in C (C could be made optional, like an assert?)

#LIBNAME = "radio_rpi.so"
LIBNAME = "drv/radio_mac.so" # testing

import ctypes
from os import path
mydir = path.dirname(path.abspath(__file__))

libradio                   = ctypes.cdll.LoadLibrary(mydir + "/" + LIBNAME)
radio_init_fn              = libradio["radio_init"]
radio_reset_fn             = libradio["radio_reset"]
radio_get_ver_fn           = libradio["radio_get_ver"]
radio_modulation_fn        = libradio["radio_modulation"]
radio_transmitter_fn       = libradio["radio_transmitter"]
radio_transmit_fn          = libradio["radio_transmit"]
radio_send_payload_fn      = libradio["radio_send_payload"]
#radio_receiver_fn          = libradio["radio_receiver"]
#radio_isReceiveWaiting_fn  = libradio["radio_isReceiveWaiting"]
#radio_receive_fn           = libradio["radio_receive"]
#radio_receive_payload_fn   = libradio["radio_receive_payload"]
radio_standby_fn           = libradio["radio_standby"]
radio_finished_fn          = libradio["radio_finished"]

RADIO_MODULATION_OOK = 0
RADIO_MODULATION_FSK = 1


def init():
    """Initialise the module ready for use"""
    #extern void radio_init(void);
    radio_init_fn()


def reset():
    """Reset the radio device"""
    #extern void radio_reset(void);
    radio_reset_fn()


def get_ver():
    """Read out the version number of the radio"""
    return radio_get_ver_fn()


def modulation(fsk=None, ook=None):
    """Switch modulation, if needed"""
    #extern void radio_modulation(RADIO_MODULATION mod);
    if ook:
        m = ctypes.c_int(RADIO_MODULATION_OOK)
    elif fsk:
        m = ctypes.c_int(RADIO_MODULATION_FSK)
    radio_modulation_fn(m)


def transmitter(fsk=None, ook=None):
    """Change into transmitter mode"""
    #extern void radio_transmitter(RADIO_MODULATION mod);
    if ook:
        m = ctypes.c_int(RADIO_MODULATION_OOK)
    elif fsk:
        m = ctypes.c_int(RADIO_MODULATION_FSK)
    radio_transmitter_fn(m)


def transmit(payload, times=1):
    """Transmit a single payload using the present modulation scheme"""
    #Note, this optionally does a mode change before and after
    #extern void radio_transmit(uint8_t* payload, uint8_t len, uint8_t repeats);
    framelen = len(payload)
    Frame    = ctypes.c_ubyte * framelen
    txframe  = Frame(*payload)
    times  = ctypes.c_ubyte(times)
    radio_transmit_fn(txframe, framelen, times)


def send_payload(payload, times=1):
    """Transmit a payload in present modulation scheme, repeated"""
    #Note, this does not do a mode change before or after,
    #and assumes the mode is already transmit
    #extern void radio_send_payload(uint8_t* payload, uint8_t len, uint8_t times);

    #TODO: Should really validate parameters here, so that C code doesn't have to.
    #see note at top of this file.
    framelen = len(payload)
    Frame    = ctypes.c_ubyte * framelen
    txframe  = Frame(*payload)
    times    = ctypes.c_ubyte(times)
    radio_send_payload_fn(txframe, framelen, times)


#def receiver(fsk=None, ook=None):
#    """Change into receiver mode"""
#    #extern void radio_receiver(RADIO_MODULATION mod);
#    if ook:
#        m = ctypes.c_int(RADIO_MODULATION_OOK)
#    elif fsk:
#        m = ctypes.c_int(RADIO_MODULATION_FSK)
#
#    radio_receiver_fn(m)


#def isReceiveWaiting():
#    """Check to see if a payload is waiting in the receive buffer"""
#    #extern RADIO_RESULT radio_isReceiveWaiting(void);
#    pass # TODO
#    # returns bool
#    ##res = radio_isReceiveWaitingFn()


#def receive():
#    """Put radio into receive mode and receive"""
#    #extern RADIO_RESULT radio_receive(uint8_t* buf, uint8_t len)
#    pass # TODO
#    ##radio_receive_fn(buf, len)
#    # returns list of bytes


#def radio_receive_payload():
#    """Receive a single payload"""
#    #extern RADIO_RESULT radio_receive_payload(uint8_t* buf, uint8_t len);
#    pass # TODO
#    ##radio_receive_payload_fn(buf, len)
#    # returns list of bytes


def standby():
    """Put radio into standby mode"""
    #extern void radio_standby(void);
    radio_standby_fn()


def finished():
    """Close the library down cleanly when finished"""
    #extern void radio_finished(void);
    radio_finished_fn()


# END