# -*- coding: UTF-8 -*- ''' rtx - RetroText rtxMask: Klasse zur Verarbeitung einer Eingabemaske by Anna Christina Naß released under GPL ''' import glob import logging import config import cept class rtxMask: """ Klasse zur Verarbeitung einer Eingabemaske """ lines = [] answers = [] def __init__(self): def addLine(x, y, length): """ adds a new line for the mask to the object """ newLine['x'] = x newLine['y'] = y newLine['length'] = length self.lines.append(newLine) def get_answer(self, nr): """ returns the answer for a specific line """ if nr >= 0 and nr <= len(self.answers): return self.answers[nr] else return False def get_answers(self): """ returns the array of all answers """ return self.answers def _pos_cur_to_line(self, line): """ positions the cursor to the beginning of a line """ zeile=self.lines[line] self._pos_cur_to_xy(zeile['x'], zeile['y']) def _pos_cur_to_xy(self, x, y): """ positions the cursor to a (x,y) position on screen """ toX=0x41 + x toY=0x41 + y gotoString = "\x1f" + chr(toX) + chr(toY) glob.ser.write(bytes(gotoString, "latin-1")) def _set_str_at_pos(self, char, pos, line): """ changes the 'char' at a position 'pos' of a specific answer 'line' """ zeile = self.answers[line] # if the line is shorter than the position, add spaces while len(zeile) < pos: zeile += " " zeile = zeile[:pos-1] + char + zeile[pos:] answers[line] = zeile def process_input(self): """ reads the input from the client, fills the mask and gets the input """ if len(lines) == 0: logging.debug("Keine Zeilen in der Maske definiert!") return False # position the cursor into the first field self._pos_cur_to_line(lines[1]) posx = 1 # cursor position inside the line posy = 0 # the current line weiter = True # read input and interpret it while weiter==True: #if config.MODE == "modem" and glob.ser.getCD() == False: # weiter=False in_byte = glob.ser.read(1) instr = str(in_byte, encoding="latin-1") echostr = instr if instr == cept.TER or instr == cept.CR: # TODO: weiter in nächster Zeile elif instr.isalnum(): self._set_str_at_pos(instr, posx, posy) posx += 1 elif instr == cept.BSP: answers[posy] = answers[posy][:-1] posx -= 1 else: echostr = "" # lineinput == Zeilenende beachten # dafür aber die Konstruktion von lines nochmal umbauen, um auf "length" zugreifen zu können... glob.ser.write(bytes(echostr, "latin-1"))