#!/usr/bin/python
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Wrapper for an RF switch built on an Elexol EtherIO24.

The EtherIO is documented at
        http://www.elexol.com/IO_Modules/Ether_IO_24_Dip_R.php

This file is both a python module and a command line utility to speak
to the module
"""

import collections
import logging
import socket
import struct
import sys


class Error(Exception):
    pass


class EtherIo24(object):
    """Encapsulates an EtherIO24 UDP-GPIO bridge."""

    def __init__(self, hostname, port=2424):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.bind(('', 0))
        self.destination = (hostname, port)
        self.socket.settimeout(3)   # In seconds

    def SendPayload(self, payload):
        self.socket.sendto(payload, self.destination)

    def SendOperation(self, opcode, list_bytes):
        """Sends the specified opcode with [list_bytes] as an argument."""
        payload = opcode + struct.pack(('=%dB' % len(list_bytes)), *list_bytes)
        self.SendPayload(payload)
        return payload

    def SendCommandVerify(self, write_opcode, list_bytes, read_opcode=None):
        """Sends opcode and bytes, then reads to make sure command was
        executed.
        """
        if read_opcode is None:
            read_opcode = write_opcode.lower()
        for _ in xrange(3):
            write_sent = self.SendOperation(write_opcode, list_bytes)
            self.SendOperation(read_opcode, list_bytes)
            try:
                response = self.AwaitResponse()
                if response == write_sent:
                    return
                else:
                    logging.warning('Unexpected reply:  sent %s, got %s',
                                    write_sent.encode('hex_codec'),
                                    response.encode('hex_codec'))
            except socket.timeout:
                logging.warning('Timed out awaiting reply for %s',
                                write_opcode)
                continue
        raise Error('Failed to execute %s' % write_sent.encode('hex_codec'))

    def AwaitResponse(self):
        (response, address) = self.socket.recvfrom(65536)
        if (socket.gethostbyname(address[0]) !=
            socket.gethostbyname(self.destination[0])):
            logging.warning('Unexpected reply source: %s (expected %s)',
                            address, self.destination)
        return response


class RfSwitch(object):
    """An RF switch hooked to an Elexol EtherIO24."""

    def __init__(self, ip):
        self.io = EtherIo24(ip)
        # Must run on pythons without 0bxxx notation.  These are 1110,
        # 1101, 1011, 0111
        decode = [0xe, 0xd, 0xb, 0x7]

        self.port_mapping = []
        for upper in xrange(3):
            for lower in xrange(4):
                self.port_mapping.append(decode[upper] << 4 | decode[lower])

    def SelectPort(self, n):
        """Connects port n to the RF generator."""
        # Set all pins to output

        # !A0:  all pins output
        self.io.SendCommandVerify('!A', [0])
        self.io.SendCommandVerify('A', [self.port_mapping[n]])

    def Query(self):
        """Returns (binary port status, selected port, port direction)."""
        self.io.SendOperation('!a', [])
        raw_direction = self.io.AwaitResponse()
        direction = ord(raw_direction[2])

        self.io.SendOperation('a', [])
        status = ord(self.io.AwaitResponse()[1])
        try:
            port = self.port_mapping.index(status)
        except ValueError:
            port = None

        return (status, port, direction)


def CommandLineUtility(arguments):
    """Command line utility to control a switch."""

    def Select(switch, remaining_args):
        switch.SelectPort(int(remaining_args.popleft()))

    def Query(switch, unused_remaining_args):
        (raw_status, port, direction) = switch.Query()
        if direction != 0x00:
            print 'Warning:  Direction register is %x, should be 0x00' % \
                direction
        if port is None:
            port_str = 'Invalid'
        else:
            port_str = str(port)
        print 'Port %s  (0x%x)' % (port_str, raw_status)

    def Usage():
        print 'usage:  %s hostname {query|select portnumber}' % sys.argv[0]
        exit(1)

    try:
        hostname = arguments.popleft()
        operation = arguments.popleft()

        switch = RfSwitch(hostname)

        if operation == 'query':
            Query(switch, arguments)
        elif operation == 'select':
            Select(switch, arguments)
        else:
            Usage()
    except IndexError:
        Usage()

if __name__ == '__main__':
    CommandLineUtility(collections.deque(sys.argv[1:]))
