def loadrows(self, coldesc=None, rows=None): self.rows=[] if coldesc is not None and rows is not None: for row in rows: nr = '' oft = 0 for col in coldesc: if type(col) is str: nr += col else: if len(row) > oft: # space pad 'short' rows nr += strops.truncpad(row[oft], col[0], col[1]) else: nr += ' ' * col[0] oft += 1 self.rows.append(nr) # truncation in sender ok self.nrpages = len(self.rows)//self.pagesz + 1 if self.nrpages > 1 and len(self.rows) % self.pagesz == 0: self.nrpages -= 1 # avoid hanging residual by scooting 2nd last entry onto # last page with a 'dummy' row, or scoot single line down by one if len(self.rows) % self.pagesz == 1: self.rows.insert(len(self.rows) - 2, ' ') # if time field set and not a round number of rows, append # time line to last row of last page finalmod = len(self.rows) % self.pagesz if self.timestr is not None and finalmod != 0: padrows = (self.pagesz - 1) - finalmod while padrows > 0: self.rows.append(' ') padrows -= 1 self.rows.append(strops.truncpad(self.timepfx, scbdo.SCB_LINELEN - 13, 'r') + ' ' + self.timestr[0:12])
def delayed_announce(self): """Initialise the announcer's screen after a delay.""" if self.winopen: self.meet.announce.clrall() self.meet.ann_title(' '.join([ 'Event', self.evno, ':', self.meet.edb.getvalue(self.event, eventdb.COL_PREFIX), self.meet.edb.getvalue(self.event, eventdb.COL_INFO) ])) # clear page self.meet.announce.linefill(1, '_') self.meet.announce.linefill(19, '_') # write out riders count = 0 curline = 4 posoft = 0 for r in self.riders: count += 1 if count == 14: curline = 4 posoft = 41 xtra = ' ' if r[COL_INFO] is not None and r[COL_INFO] != '': xtra = strops.truncpad(r[COL_INFO], 4, 'r') clubstr = '' if r[COL_CLUB] != '': clubstr = ' (' + r[COL_CLUB] + ')' namestr = strops.truncpad( strops.fitname(r[COL_FIRSTNAME], r[COL_LASTNAME], 25 - len(clubstr)) + clubstr, 25) placestr = ' ' if r[COL_PLACE] != '': placestr = strops.truncpad(r[COL_PLACE] + '.', 3) elif r[COL_DNF]: placestr = 'dnf' bibstr = strops.truncpad(r[COL_BIB], 3, 'r') self.meet.announce.postxt( curline, posoft, ' '.join([placestr, bibstr, namestr, xtra])) curline += 1 tp = '' if self.start is not None and self.finish is not None: et = self.finish - self.start if self.timetype == '200m': tp = '200m: ' else: tp = 'Time: ' tp += et.timestr(3) + ' ' dist = self.meet.get_distance(self.distance, self.units) if dist: tp += 'Avg: ' + et.speedstr(dist) self.meet.announce.setline(21, tp) return False
def delayed_announce(self): """Initialise the announcer's screen after a delay.""" if self.winopen: self.meet.announce.clrall() self.meet.ann_title(' '.join([ 'Event', self.evno, ':', self.meet.edb.getvalue(self.event, eventdb.COL_PREFIX), self.meet.edb.getvalue(self.event, eventdb.COL_INFO)])) # clear page self.meet.announce.linefill(1, '_') self.meet.announce.linefill(19, '_') # write out riders count = 0 curline = 4 posoft = 0 for r in self.riders: count += 1 if count == 14: curline = 4 posoft = 41 xtra = ' ' if r[COL_INFO] is not None and r[COL_INFO] != '': xtra = strops.truncpad(r[COL_INFO], 4, 'r') clubstr = '' if r[COL_CLUB] != '': clubstr = ' (' + r[COL_CLUB] + ')' namestr = strops.truncpad(strops.fitname(r[COL_FIRSTNAME], r[COL_LASTNAME], 25-len(clubstr))+clubstr, 25) placestr = ' ' if r[COL_PLACE] != '': placestr = strops.truncpad(r[COL_PLACE] + '.', 3) elif r[COL_DNF]: placestr = 'dnf' bibstr = strops.truncpad(r[COL_BIB], 3, 'r') self.meet.announce.postxt(curline, posoft, ' '.join([ placestr, bibstr, namestr, xtra])) curline += 1 tp = '' if self.start is not None and self.finish is not None: et = self.finish - self.start if self.timetype == '200m': tp = '200m: ' else: tp = 'Time: ' tp += et.timestr(3) + ' ' dist = self.meet.get_distance(self.distance, self.units) if dist: tp += 'Avg: ' + et.speedstr(dist) self.meet.announce.setline(21, tp) return False
def fin_trig(self, t): """Register finish trigger.""" if self.timerstat == 'running': if self.fl.getstatus() == 'armfin': bib = self.fl.bibent.get_text() series = self.fl.serent.get_text() i = self.getiter(bib, series) if i is not None: self.settimes(i, tst=self.riders.get_value(i, COL_TODSTART), tft=t) self.fl.tofinish() ft = self.getelapsed(i) if ft is not None: self.fl.set_time(ft.timestr(2)) self.meet.scratch_log(' '.join([ strops.bibser2bibstr(bib, series).ljust(5), strops.truncpad( self.riders.get_value(i, COL_NAMESTR), 20), ft.timestr(2), '(' + str(self.results.rank(bib, series) + 1) + ')' ])) else: self.fl.set_time('[err]') else: self.log.error('Missing rider at finish') self.sl.toidle() elif self.timerstat == 'armstart': self.set_syncstart(t)
def fin_trig(self, t): """Register finish trigger.""" if self.timerstat == 'running': if self.fl.getstatus() == 'armfin': bib = self.fl.bibent.get_text() series = self.fl.serent.get_text() i = self.getiter(bib, series) if i is not None: self.settimes(i, tst=self.riders.get_value(i, COL_TODSTART), tft=t) self.fl.tofinish() ft = self.getelapsed(i) if ft is not None: self.fl.set_time(ft.timestr(2)) self.meet.scratch_log(' '.join([ strops.bibser2bibstr(bib, series).ljust(5), strops.truncpad(self.riders.get_value(i, COL_NAMESTR), 20), ft.timestr(2), '(' + str(self.results.rank(bib, series) + 1) + ')' ])) else: self.fl.set_time('[err]') else: self.log.error('Missing rider at finish') self.sl.toidle() elif self.timerstat == 'armstart': self.set_syncstart(t)
def rfid_trig(self, e): """Register RFID crossing.""" r = self.meet.rdb.getrefid(e.refid) #!!! COPY FROM ROADRACE(old-scbdo) if r is not None: bib = self.meet.rdb.getvalue(r, riderdb.COL_BIB) series = self.meet.rdb.getvalue(r, riderdb.COL_SERIES) lr = self.getrider(bib, series) if lr is not None: #!!! bibstr = strops.bibser2bibstr(lr[COL_BIB], lr[COL_SERIES]) self.meet.scratch_log(' '.join( [bibstr.ljust(5), strops.truncpad(lr[COL_NAMESTR], 30)])) if self.fl.getstatus() in ['idle', 'finish']: if bibstr in self.recent_starts: self.fl.setrider(lr[COL_BIB], lr[COL_SERIES]) self.fl.toload() del self.recent_starts[bibstr] else: self.log.info('Ignoring unseen rider: ' + bibstr + '@' + e.rawtime(1)) else: self.log.info('Non start rider: ' + bib + '.' + series + '@' + e.rawtime(1)) else: self.log.info('Unkown tag: ' + e.refid + '@' + e.rawtime(1))
def rfid_trig(self, e): """Register RFID crossing.""" r = self.meet.rdb.getrefid(e.refid) #!!! COPY FROM ROADRACE(old-scbdo) if r is not None: bib = self.meet.rdb.getvalue(r, riderdb.COL_BIB) series = self.meet.rdb.getvalue(r, riderdb.COL_SERIES) lr = self.getrider(bib, series) if lr is not None: #!!! bibstr = strops.bibser2bibstr(lr[COL_BIB], lr[COL_SERIES]) self.meet.scratch_log(' '.join([ bibstr.ljust(5), strops.truncpad(lr[COL_NAMESTR], 30) ])) if self.fl.getstatus() in ['idle', 'finish']: if bibstr in self.recent_starts: self.fl.setrider(lr[COL_BIB], lr[COL_SERIES]) self.fl.toload() del self.recent_starts[bibstr] else: self.log.info('Ignoring unseen rider: ' + bibstr + '@' + e.rawtime(1)) else: self.log.info('Non start rider: ' + bib + '.' + series + '@' + e.rawtime(1)) else: self.log.info('Unkown tag: ' + e.refid + '@' + e.rawtime(1))
def startlist_report(self): """Return a startlist.""" ret = [] for r in self.riders: ret.append(r[riderdb.COL_BIB].rjust(4) + ' ' + strops.truncpad(r[COL_NAMESTR], 48) + str(r[COL_CAT]).rjust(10)) return ret
def fmt_rider_result(self, r, st): """Return a result string for the provided rider reference.""" ret = r[COL_BIB].rjust(4) + ' ' + strops.truncpad(r[COL_NAMESTR], 32) lt = st for split in r[COL_RFSEEN]: ret += ' ' + (split - lt).rawtime(0).rjust(7) lt = split return (ret)
def fmt_rider_result(self, r, st): """Return a result string for the provided rider reference.""" ret = r[COL_BIB].rjust(4) + ' ' + strops.truncpad(r[COL_NAMESTR], 32) lt = st for split in r[COL_RFSEEN]: ret += ' ' + (split - lt).rawtime(0).rjust(7) lt = split return(ret)
def lanelookup(self, bib=None, series=''): """Prepare name string for timer lane.""" r = self.getrider(bib, series) if r is None: self.addrider(bib, series) rtxt = '[New Rider]' else: rtxt = strops.truncpad(r[COL_NAMESTR], 35) return rtxt
def redraw(self): self.scb.setline(4, self.line1) self.scb.setline(5, self.line2) self.scb.setline(6, strops.truncpad(self.timepfx, scbdo.SCB_LINELEN - 13, 'r')) self.scb.clrline(7) self.curtime = '' self.nexttime = '' self.curavg = '' self.nextavg = '' self.scb.setoverlay(unt4.OVERLAY_R2P2)
def update(self): """If time or avg change, copy new value onto overlay.""" if not self.paused: if self.curtime != self.nexttime: self.scb.postxt(6, scbdo.SCB_LINELEN - 12, self.nexttime) self.curtime = self.nexttime if self.curavg != self.nextavg: self.scb.setline(7, strops.truncpad(self.avgpfx, scbdo.SCB_LINELEN - 13, 'r') + ' ' + self.nextavg) self.curavg = self.nextavg self.count += 1
def update(self): """If any time or ranks change, copy new value onto overlay.""" if not self.paused: if self.curr1 != self.nextr1: self.scb.setline(7, strops.truncpad(self.nextr1, scbdo.SCB_LINELEN - 13, 'r') + ' ' + self.nextt1) self.curr1 = self.nextr1 self.curt1 = self.nextt1 elif self.curt1 != self.nextt1: self.scb.postxt(7, scbdo.SCB_LINELEN - 12, self.nextt1) self.curt1 = self.nextt1 if self.curr2 != self.nextr2: self.scb.setline(9, strops.truncpad(self.nextr2, scbdo.SCB_LINELEN - 13, 'r') + ' ' + self.nextt2) self.curr2 = self.nextr2 self.curt2 = self.nextt2 elif self.curt2 != self.nextt2: self.scb.postxt(9, scbdo.SCB_LINELEN - 12, self.nextt2) self.curt2 = self.nextt2 self.count += 1
def racenamecat(self, event, slen=None): """Concatentate race info for display on scoreboard header line.""" if slen is None: slen = scbdo.SCB_LINELEN evno = '' if self.showevno: evno = 'Ev ' + self.edb.getvalue(event, eventdb.COL_EVNO) info = self.edb.getvalue(event, eventdb.COL_INFO) prefix = self.edb.getvalue(event, eventdb.COL_PREFIX) ret = ' '.join([evno, prefix, info]).strip() if len(ret) > slen + 1: ret = ' '.join([evno, info]).strip() return strops.truncpad(ret, slen)
def delayed_announce(self): """Initialise the announcer's screen after a delay.""" if self.winopen: self.meet.announce.clrall() self.meet.ann_title(' '.join([ 'Event', self.evno, ':', self.meet.edb.getvalue(self.event, eventdb.COL_PREFIX), self.meet.edb.getvalue(self.event, eventdb.COL_INFO), '- Standings' ])) self.meet.announce.linefill(1, '_') ha = [' ', ' #', 'Rider'.ljust(25), ' Pts'] for n in self.nicknames: ha.append(strops.truncpad(n, 4, 'r')) ha.append('Tot Time'.rjust(10)) self.meet.announce.setline(3, ' '.join(ha)) l = 4 for r in self.riders: plstr = '' if r[COL_PLACE] != '': plstr = r[COL_PLACE] if plstr.isdigit(): plstr += '.' plstr = strops.truncpad(plstr, 3, 'l') bibstr = strops.truncpad(r[COL_BIB], 3, 'r') clubstr = '' if r[COL_CLUB] != '': clubstr = ' (' + r[COL_CLUB] + ')' namestr = strops.truncpad( strops.fitname(r[COL_FIRST], r[COL_LAST], 25 - len(clubstr)) + clubstr, 25) ptsstr = ' ' if r[COL_TOTAL] > 0: ptsstr = strops.truncpad(str(r[COL_TOTAL]), 4, 'r') ol = [plstr, bibstr, namestr, ptsstr] for c in range(0, len(self.nicknames)): if len(r[COL_POINTS]) > c: ol.append(strops.truncpad(r[COL_POINTS][c], 4, 'r')) else: ol.append(' ') if r[COL_TIME] != tod.ZERO: ol.append(strops.truncpad(r[COL_TIME].rawtime(3), 10, 'r')) else: ol.append(' ') self.meet.announce.setline(l, ' '.join(ol)) l += 1 return False
def delayed_announce(self): """Initialise the announcer's screen after a delay.""" if self.winopen: self.meet.announce.clrall() self.meet.ann_title(' '.join([ 'Event', self.evno, ':', self.meet.edb.getvalue(self.event, eventdb.COL_PREFIX), self.meet.edb.getvalue(self.event, eventdb.COL_INFO), '- Standings'])) self.meet.announce.linefill(1, '_') ha = [ ' ', ' #', 'Rider'.ljust(25), ' Pts'] for n in self.nicknames: ha.append(strops.truncpad(n, 4, 'r')) ha.append('Tot Time'.rjust(10)) self.meet.announce.setline(3, ' '.join(ha)) l = 4 for r in self.riders: plstr = '' if r[COL_PLACE] != '': plstr = r[COL_PLACE] if plstr.isdigit(): plstr += '.' plstr = strops.truncpad(plstr, 3, 'l') bibstr = strops.truncpad(r[COL_BIB], 3, 'r') clubstr = '' if r[COL_CLUB] != '': clubstr = ' (' + r[COL_CLUB] + ')' namestr = strops.truncpad(strops.fitname(r[COL_FIRST], r[COL_LAST], 25-len(clubstr))+clubstr, 25) ptsstr = ' ' if r[COL_TOTAL] > 0: ptsstr = strops.truncpad(str(r[COL_TOTAL]), 4, 'r') ol = [plstr, bibstr, namestr, ptsstr] for c in range(0, len(self.nicknames)): if len(r[COL_POINTS]) > c: ol.append(strops.truncpad(r[COL_POINTS][c], 4, 'r')) else: ol.append(' ') if r[COL_TIME] != tod.ZERO: ol.append(strops.truncpad(r[COL_TIME].rawtime(3), 10, 'r')) else: ol.append(' ') self.meet.announce.setline(l, ' '.join(ol)) l += 1 return False
def loadrows(self, coldesc=None, rows=None): self.rows=[] if coldesc is not None and rows is not None: for row in rows: nr = '' oft = 0 for col in coldesc: if type(col) is str: nr += col else: if len(row) > oft: # space pad 'short' rows nr += strops.truncpad(row[oft], col[0], col[1]) else: nr += ' ' * col[0] oft += 1 self.rows.append(nr[0:32]) self.nrpages = len(self.rows)//self.pagesz + 1 if self.nrpages > 1 and len(self.rows) % self.pagesz == 0: self.nrpages -= 1 # avoid hanging residual by scooting 2nd last entry onto # last page with a 'dummy' row, or scoot single line down by one if len(self.rows) % self.pagesz == 1: self.rows.insert(len(self.rows) - 2, ' ')
def ann_title(self, titlestr=''): self.announce.setline(0, strops.truncpad(titlestr.strip(), 70, 'c'))
def ann_default(self): self.announce.setline( 0, strops.truncpad( ' '.join([self.line1, self.line2, self.line3]).strip(), 70, 'c'))
def ann_default(self): self.announce.setline(0, strops.truncpad(' '.join([self.line1, self.line2, self.line3]).strip(), 70, 'c'))