diff --git a/rtxMask.py b/rtxMask.py index 545cdd7..7a41b94 100644 --- a/rtxMask.py +++ b/rtxMask.py @@ -12,104 +12,141 @@ import config import cept class rtxMask: - """ Klasse zur Verarbeitung einer Eingabemaske - """ + """ Klasse zur Verarbeitung einer Eingabemaske + """ - lines = [] - answers = [] + lines = [] + answers = [] - def __init__(self): + 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 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_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 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_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 _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] + 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 += " " + # 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 + zeile = zeile[:pos-1] + char + zeile[pos:] + answers[line] = zeile +""" + def _cut_off_rest_of_line(self, line, pos): + """ erases the rest of the line from the 'lines' variable and from the screen """ + zeile = self.answers[line] + self.answers[line] = zeile[:pos] - def _cut_off_rest_of_line(self, line, pos): - """ erases the rest of the line from the 'lines' variable and from the screen """ - zeile = self.answers[line] - self.answers[line] = zeile[:pos] + if zeile[pos:] != "": + numOfSpaces = len(zeile[pos:]) + spaces = " " * numOfSpaces + backSpaces = cept.BSP * numOfSpaces + glob.ser.write(bytes(spaces + backSpaces, "latin-1")) +""" + def process_input(self): + """ reads the input from the client, fills the mask and gets the input """ - if zeile[pos:] != "": - numOfSpaces = len(zeile[pos:]) - spaces = " " * numOfSpaces - backSpaces = "\x08" * numOfSpaces - glob.ser.write(bytes(spaces + backSpaces, "latin-1")) + # if there have no input lines been defined, no input can be processed - so exit the function + if len(lines) == 0: + logging.debug("Keine Zeilen in der Maske definiert!") + return False - def process_input(self): - """ reads the input from the client, fills the mask and gets the input """ + # position the cursor into the first field + self._pos_cur_to_line(lines[0]) - if len(lines) == 0: - logging.debug("Keine Zeilen in der Maske definiert!") - return False + posx = 0 # cursor position inside the line - max. position is length-1 + posy = 0 # the current line - max. number is len(lines)-1 - # position the cursor into the first field - self._pos_cur_to_line(lines[1]) - posx = 0 # cursor position inside the line - max. position is length-1 - posy = 0 # the current line - max. number is len(lines)-1 + weiter = True + # read input and interpret it + while weiter==True: + # if the modem hangs up, exit the function: + #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 - weiter = True - # read input and interpret it - while weiter==True: - # if the modem hangs up, exit the function: - #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: + # go to the beginning of the next line + # or finish the mask + if posy == len(lines)-1: + # this was the last line, now send the data + # TODO: weitermachen + else: + # go to the beginning of the next line + posy += 1 + posx = 0 + self._pos_cur_to_line(lines[posy]) + elif instr == cept.BSP: + answers[posy] = answers[posy][:-1] + posx -= 1 + elif instr == cept.UP: + # if the cursor is in the first line, we can't go higher... + # so we ignore the keypress + echostr = "" # no echo needed, we position the curser ourselves + if posy > 0: + posy -= 1 + posx = 0 + self._pos_cur_to_line(lines[posy]) + elif instr == cept.DOWN: + # same here: last line => it can't go lower => ignore + echostr = "" # no echo needed, we position the curser ourselves + if posy < len(self.lines): + posy += 1 + posx = 0 + self._pos_cur_to_line(lines[posy]) + elif instr == cept.LEFT: + if posx > 0: + posx -= 1 + else: + echostr = "" + elif instr == cept.RIGHT: + if posx < len(answers[posy]): + posx += 1 + else: + echostr = "" + elif instr == cept.SEND: # ist das DCT?? + # TODO: send data + elif instr.isalnum(): + # "normal" input + # TODO: lineinput == Zeilenende beachten + self._set_str_at_pos(instr, posx, posy) + posx += 1 + else: + # ignore the rest and do not echo it :) + echostr = "" - if instr == cept.TER or instr == cept.CR: - if posy == len(lines)-1: - # this was the last line, now send the data - # TODO - weiter = False - 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 - - glob.ser.write(bytes(echostr, "latin-1")) + # now send the echo + glob.ser.write(bytes(echostr, "latin-1"))