Example #1
0
class StatusFile(object):
    @staticmethod
    def filename():
        return "STATUS"

    def __init__(self, tipi_io):
        self.tipi_io = tipi_io
        self.tipiStatus = []
        self.recordNo = 0

    def getRecNo(self, pab):
        readRec = recordNumber(pab)
        if readRec != 0:
            self.recordNo = readRec
        return self.recordNo

    def handle(self, pab, devname):
        op = opcode(pab)
        if op == OPEN:
            self.open(pab, devname)
        elif op == CLOSE:
            self.close(pab, devname)
        elif op == READ:
            self.read(pab, devname)
        elif op == STATUS:
            self.status(pab, devname)
        else:
            logger.warn("Unhandled opcode %d for %s", op, devname)
            self.tipi_io.send([EOPATTR])

    def close(self, pab, devname):
        logger.info("close %s", devname)
        self.tipi_io.send([SUCCESS])

    def open(self, pab, devname):
        logger.info("open %s", devname)
        if mode(pab) == INPUT:
            if dataType(pab) == DISPLAY:
                if recordLength(pab) == 0 or recordLength(pab) == 80:
                    self.tipi_io.send([SUCCESS])
                    self.tipi_io.send([80])
                    self.tipiStatus = Status()
                    self.recordNo = 0
                    return
        self.tipi_io.send([EOPATTR])

    def read(self, pab, devname):
        logger.info("read %s", devname)
        if mode(pab) == INPUT:
            if dataType(pab) == DISPLAY:
                readRec = self.getRecNo(pab)

                if readRec >= self.tipiStatus.len():
                    self.tipi_io.send([EEOF])
                    return
                else:
                    fdata = bytearray(self.tipiStatus.record(readRec), 'ascii')
                    self.tipi_io.send([SUCCESS])
                    self.tipi_io.send(fdata)
                    self.recordNo += 1
                    return
        self.tipi_io.send([EOPATTR])

    def status(self, pab, devname):
        logger.info("status %s", devname)
        if mode(pab) == INPUT:
            if dataType(pab) == DISPLAY:
                self.tipi_io.send([SUCCESS])
                statbyte = STVARIABLE
                readRec = self.getRecNo(pab)
                if readRec >= self.tipiStatus.len():
                    statbyte |= STLEOF
                self.tipi_io.send([statbyte])
                return
        self.tipi_io.send([EOPATTR])