def read_obd(self): self.parameters.rpm = self.connection.query(obd.commands.RPM) self.parameters.fuel_level = self.connection.query(obd.commands.FUEL_LEVEL) self.parameters.ethanol = self.connection.query(obd.commands.ETHANOL_PERCENT) self.parameters.fuel_rate = self.connection.query(obd.commands.FUEL_RATE) if self.parameters.fuel_rate.value is not None: self.parameters.fuel_rate.unit = 'L/h' self.parameters.speed = self.connection.query(obd.commands.SPEED) if self.parameters.speed.value is not None: self.parameters.speed.unit = 'Km/h' self.parameters.maf = self.connection.query(obd.commands.MAF) if self.parameters.maf.value is not None: self.parameters.maf.unit = 'g/s' if util.is_float(self.parameters.speed.value) and util.is_float(self.parameters.maf.value): self.parameters.autonomy.value = 3.103 * self.parameters.speed.value / self.parameters.maf.value self.parameters.autonomy.unit = 'Km/L' else: self.parameters.autonomy.value = None self.parameters.autonomy.unit = '' if util.is_float(self.parameters.maf.value): self.parameters.consumption.value = 0.322 * self.parameters.maf.value self.parameters.consumption.unit = 'L/h' else: self.parameters.consumption.value = None self.parameters.consumption.unit = ''
def draw_interface(self): data_list = [('Velocidade:', self.parameters.speed), ('RPM:', self.parameters.rpm), ('MAF:', self.parameters.maf), ('Autonomia:', self.parameters.autonomy), ('Consumo:', self.parameters.consumption), ('Pressure:', self.parameters.pressure)] self.screen.fill(black) self.xpos = 0 count = 0 for data in data_list: if count % 2: self.ypos += (rec_height + space) else: self.ypos = space self.xpos += space self.add_rec(self.xpos, self.ypos) if util.is_float(data[1].value): data[1].value = round(data[1].value, 2) self.add_text(str(data[0]), self.xpos + 10, self.ypos + 10, self.LABEL) self.add_text(data[1].__str__(), self.xpos + 10, self.ypos + (rec_height / 2 - 10), self.PARAMETER) if count % 2: self.xpos += rec_width count += 1
def test_is_float(self): self.assertTrue(util.is_float(0)) self.assertTrue(util.is_float(1)) self.assertTrue(util.is_float(1.0)) self.assertTrue(util.is_float('0')) self.assertTrue(util.is_float('1')) self.assertTrue(util.is_float('+3464.1145')) self.assertTrue(util.is_float('-97302.14122')) self.assertTrue(util.is_float('-1.634E-2'))
def parse_duration(duration): if duration is None: return None if util.is_int(duration): return max(int(duration) * 60, 1) find_duration = re.search('PT(\d+)M([\w.,]+)S', duration) if find_duration is not None: if util.is_float(find_duration.group(2)): return max(int(find_duration.group(1)) * 60 + float(find_duration.group(2)) * 1, 1) find_duration = re.search('PT(\d+)M', duration) if find_duration is not None: return max(int(find_duration.group(1)) * 60, 1) find_duration = re.search('PT(\d+)H(\d+)M', duration) if find_duration is not None: return max(int(find_duration.group(1)) * 3600 + int(find_duration.group(2)) * 60, 1) find_duration = re.search('PT([\w.,]+)S', duration) if find_duration is not None: if util.is_float(find_duration.group(1)): return max(float(find_duration.group(1)) * 1, 1) find_duration = re.search('(\d+):(\d+):(\d+)', duration) if find_duration is not None: return max(int(find_duration.group(1)) * 86400 + int(find_duration.group(2)) * 3600 + int(find_duration.group(3)) * 60, 1) find_duration = re.search('(\d+):(\d+)', duration) if find_duration is not None: return max(int(find_duration.group(1)) * 3600 + int(find_duration.group(2)) * 60, 1) return None
def get(self): """URL parameters: start_time: float, seconds since the epoch key: string that should appear in the first app log """ start_time = util.get_required_param(self, 'start_time') if not util.is_float(start_time): self.abort(400, "Couldn't convert start_time to float: %r" % start_time) start_time = float(start_time) key = util.get_required_param(self, 'key') if not util.is_base64(key): self.abort(400, 'key is not base64: %r' % key) key = urllib.unquote(key) # the propagate task logs the poll task's URL, which includes the source # entity key as a query param. exclude that with this heuristic. key_re = re.compile('[^=]' + key) self.response.headers['Content-Type'] = 'text/html; charset=utf-8' offset = None for log in logservice.fetch(start_time=start_time, end_time=start_time + 120, offset=offset, include_app_logs=True, version_ids=['2', '3', '4', '5', '6', '7']): first_lines = '\n'.join([ line.message.decode('utf-8') for line in log.app_logs[:min(10, len(log.app_logs))] ]) if log.app_logs and key_re.search(first_lines): # found it! render and return self.response.out.write("""\ <html> <body style="font-family: monospace; white-space: pre"> """) self.response.out.write(sanitize(log.combined)) self.response.out.write('<br /><br />') for a in log.app_logs: msg = a.message.decode('utf-8') # don't sanitize poll task URLs since they have a key= query param msg = linkify_datastore_keys( util.linkify( cgi.escape(msg if msg.startswith( 'Created by this poll:') else sanitize(msg)))) self.response.out.write( '%s %s %s<br />' % (datetime.datetime.utcfromtimestamp(a.time), LEVELS[a.level], msg.replace('\n', '<br />'))) self.response.out.write('</body>\n</html>') return offset = log.offset self.response.out.write('No log found!')
def from_array(cls, name, array): texture = cls(name) if len(array.shape) == 2: arr = np.uint8((array * 255) if util.is_float(array) else array) color = np.zeros((*arr.shape, 3), dtype = np.uint8) color[:,:,0] = color[:,:,1] = color[:,:,2] = arr elif len(array.shape) == 3: arr = np.uint8((array * 255) if util.is_float(array) else array) color = arr else: raise Exception('Array is wrong shape', array.shape) filler = np.ones((*color.shape[:2], 1), dtype = np.uint8) * 255 while color.shape[2] < 4: color = np.concatenate((color, filler), axis = -1) texture.data = color return texture
def read_pressure(self): x = self.ser.readline().strip() if util.is_float(x): x = float(x) * 10 / 1023 x = round(x, 2) self.parameters.pressure.value = x self.parameters.pressure.unit = 'kPa' else: self.parameters.pressure.value = None self.parameters.pressure.unit = '' print self.parameters.pressure.__str__()
def get(self): """URL parameters: start_time: float, seconds since the epoch key: string that should appear in the first app log """ start_time = util.get_required_param(self, 'start_time') if not util.is_float(start_time): self.abort(400, "Couldn't convert start_time to float: %r" % start_time) start_time = float(start_time) key = util.get_required_param(self, 'key') if not util.is_base64(key): self.abort(400, 'key is not base64: %r' % key) key = urllib.unquote(key) # the propagate task logs the poll task's URL, which includes the source # entity key as a query param. exclude that with this heuristic. key_re = re.compile('[^=]' + key) self.response.headers['Content-Type'] = 'text/html; charset=utf-8' offset = None for log in logservice.fetch(start_time=start_time, end_time=start_time + 120, offset=offset, include_app_logs=True, version_ids=['2', '3', '4', '5', '6', '7']): first_lines = '\n'.join([line.message.decode('utf-8') for line in log.app_logs[:min(10, len(log.app_logs))]]) if log.app_logs and key_re.search(first_lines): # found it! render and return self.response.out.write("""\ <html> <body style="font-family: monospace; white-space: pre"> """) self.response.out.write(sanitize(log.combined)) self.response.out.write('<br /><br />') for a in log.app_logs: msg = a.message.decode('utf-8') # don't sanitize poll task URLs since they have a key= query param msg = linkify_datastore_keys(util.linkify(cgi.escape( msg if msg.startswith('Created by this poll:') else sanitize(msg)))) self.response.out.write('%s %s %s<br />' % (datetime.datetime.utcfromtimestamp(a.time), LEVELS[a.level], msg.replace('\n', '<br />'))) self.response.out.write('</body>\n</html>') return offset = log.offset self.response.out.write('No log found!')
def make_table(race_no, race_info, table_results, table_awards, table_racecard, bet_info): table = table_results # ----------------- # combine race info # ----------------- for i, row in enumerate(table): if i == 0: table[i].insert(0, "賽道") table[i].insert(0, "場地") table[i].insert(0, "分數範圍") table[i].insert(0, "長度") table[i].insert(0, "班次") table[i].insert(0, "場次") table[i].insert(0, "日期") else: tags = race_info["tag"].split(" - ") y, m, d = util.convert_date(bet_info["date"]) # 賽道 combined = "" if bet_info["place"] == "ST": combined += "田" else: combined += "谷" track = race_info["track"][5:] if track[0] == "草": combined += "草" combined += track.split("\"")[1] else: combined += "泥" table[i].insert(0, combined) # 場地 condition = race_info["cond"][7:] if condition == "好地": table[i].insert(0, "好") elif condition == "好地至快地": table[i].insert(0, "好至快") elif condition == "好地至黏地": table[i].insert(0, "好至黏") elif condition == "濕慢地": table[i].insert(0, "濕慢") else: table[i].insert(0, condition) # 分數範圍 if len(tags) > 2: table[i].insert(0, tags[2]) else: table[i].insert(0, '') # 長度 table[i].insert(0, tags[1]) # 班次 if tags[0][0] == "第": if len(tags[0]) == 3: table[i].insert(0, tags[0][1:2]) else: table[i].insert(0, tags[0][1:2] + "*") elif tags[0][0] == "國": table[i].insert(0, tags[0][2:]) elif tags[0][0] == "條": table[i].insert(0, "*") else: table[i].insert(0, tags[0]) # 場次 table[i].insert(0, race_no) # 日期 table[i].insert(0, "{}/{}/{}".format(y, m, d)) # ---------------- # combine hot info # ---------------- sort_arr = [] for row in table: if util.is_float(row[-1]): sort_arr.append(float(row[-1])) list.sort(sort_arr) hot_flag = False for i, row in enumerate(table): if i == 0: table[i].append("熱門") else: if util.is_float(row[-1]): if math.isclose(float(row[-1]), sort_arr[0], rel_tol=1e-9) and not hot_flag: # 1st hot table[i].append("1st Hot") hot_flag = True elif math.isclose(float(row[-1]), sort_arr[1], rel_tol=1e-9): # 2nd hot table[i].append("2nd Hot") else: table[i].append("-") else: table[i].append("-") # ---------------- # combine bet info # ---------------- have_bet = False thead = table[0] for i, bet in enumerate(bet_info["bet"]): if bet["id"] == race_no: have_bet = True for j, row in enumerate(table): # append bet for this row horse_number = row[thead.index("馬號")] if j == 0: table[j].append("投注") elif not util.is_int(horse_number): table[j].append("-") elif int(horse_number) == bet["WP"]: table[j].append("W P") # see which WP according to number of Bigs if len(bet["Big"]) > 1: for k in range(len(bet["Big"])): table[j][-1] += " Big{}(PQ)".format(k + 1) elif len(bet["Big"]) != 0: table[j][-1] += " Big(PQ)" elif int(horse_number) in bet["Big"]: # see which Big it is if len(bet["Big"]) != 1: for k in range(len(bet["Big"])): if int(horse_number) == bet["Big"][k]: table[j].append("Big{}(PQ)".format(k + 1)) else: table[j].append("Big(PQ)") else: table[j].append("-") if not have_bet: for j, row in enumerate(table): if j == 0: table[j].append("投注") else: table[j].append("-") # --------------------- # combine racecard info # --------------------- thead = table[0] col_horse_no = thead.index("馬號") for i, row in enumerate(table): if i == 0: table[i].append("皇牌") table[i].append("配備") table[i].append("馬齡") table[i].append("評分") table[i].append("評分+/-") else: # print(table_racecard[horse_number]) if row[1] != '' and util.is_int(row[col_horse_no]): horse_number = int(row[col_horse_no]) table[i].append(table_racecard[horse_number][-6]) # 優先參賽次序 table[i].append(table_racecard[horse_number][-5]) # 配備 else: table[i].append('-') table[i].append('-') horse_id = table[i][9].split('(')[1][:-1] table[i].append(get_age(link_horseinfo, horse_id)) # 馬齡 if row[1] != '' and util.is_int(row[col_horse_no]): horse_number = int(row[col_horse_no]) table[i].append(table_racecard[horse_number][10]) # 優先參賽次序 table[i].append(table_racecard[horse_number][11]) # 配備 else: table[i].append('-') table[i].append('-') # ------------------- # combine place & ddy # ------------------- for i, row in enumerate(table): if i == 0: table[i].append("地點") table[i].append("度地儀") else: if bet_info["place"] == "ST": table[i].append("沙田") else: table[i].append("跑馬地") table[i].append(bet_info["ddy"]) # ------------ # combine odds # ------------ for i, row in enumerate(table): if i == 0: table[i].append("P賠率") table[i].append("P賠率2") table[i].append("P賠率3") table[i].append("Queue賠率") table[i].append("PQ賠率") table[i].append("PQ賠率2") table[i].append("PQ賠率3") else: p_awards = table_awards[2][1] q_awards = table_awards[3][1] pq_awards = table_awards[4][1] # P1/2/3 for j in range(len(p_awards)): if p_awards[j][0] == table[i][col_horse_no]: table[i].append(util.str_to_float(p_awards[j][1])) else: table[i].append('') # Queue for j in range(len(q_awards)): horse_number = q_awards[j][0].split(',') if horse_number[0] == table[i][col_horse_no] or horse_number[ 1] == table[i][col_horse_no]: table[i].append(util.str_to_float(q_awards[j][1])) else: table[i].append('') # Pos-Queue for j in range(len(pq_awards)): horse_number = pq_awards[j][0].split(',') if horse_number[0] == table[i][col_horse_no] or horse_number[ 1] == table[i][col_horse_no]: table[i].append(util.str_to_float(pq_awards[j][1])) else: table[i].append('') return table
def test_is_float(self): self.assertTrue( util.is_float(self.fone))
def test_is_float(self): for arg in 0, 1, -1, '0', '11', 1.0, 12345, 0.1, 3.14, '3.0': self.assertTrue(util.is_float(arg), `arg`) for arg in '3xyz', None, self: self.assertFalse(util.is_float(arg), `arg`)
def make_table(race_no, race_info, table_results, table_awards, table_racecard, bet_info): table = table_results # ----------------- # combine race info # ----------------- for i, row in enumerate(table): if i == 0: table[i].insert(0, "賽道") table[i].insert(0, "場地") table[i].insert(0, "分數範圍") table[i].insert(0, "長度") table[i].insert(0, "班次") table[i].insert(0, "場次") table[i].insert(0, "日期") else: tags = race_info["tag"].split(" - ") y, m, d = util.convert_date(bet_info["date"]) table[i].insert(0, race_info["track"][5:]) table[i].insert(0, race_info["cond"][7:]) # 分數範圍 sometimes does not exist if len(tags) > 2: table[i].insert(0, tags[2]) else: table[i].insert(0, '') table[i].insert(0, tags[1]) table[i].insert(0, tags[0]) table[i].insert(0, race_no) table[i].insert(0, "{}/{}/{}".format(y, m, d)) # ---------------- # combine hot info # ---------------- sort_arr = [] for row in table: if util.is_float(row[-1]): sort_arr.append(float(row[-1])) list.sort(sort_arr) hot_flag = False for i, row in enumerate(table): if i == 0: table[i].append("熱門") else: if util.is_float(row[-1]): if math.isclose(float(row[-1]), sort_arr[0], rel_tol=1e-9) and not hot_flag: # 1st hot table[i].append("1st Hot") hot_flag = True elif math.isclose(float(row[-1]), sort_arr[1], rel_tol=1e-9): # 2nd hot table[i].append("2nd Hot") else: table[i].append("-") else: table[i].append("-") # ---------------- # combine bet info # ---------------- have_bet = False thead = table[0] for i, bet in enumerate(bet_info["bet"]): if bet["id"] == race_no: have_bet = True for j, row in enumerate(table): # append bet for this row horse_number = row[thead.index("馬號")] if j == 0: table[j].append("投注") elif not util.is_int(horse_number): table[j].append("-") elif int(horse_number) == bet["WP"]: table[j].append("W P") # see which WP according to number of Bigs if len(bet["Big"]) > 1: for k in range(len(bet["Big"])): table[j][-1] += " Big{}(PQ)".format(k+1) elif len(bet["Big"]) != 0: table[j][-1] += " Big(PQ)" elif int(horse_number) in bet["Big"]: # see which Big it is if len(bet["Big"]) != 1: for k in range(len(bet["Big"])): if int(horse_number) == bet["Big"][k]: table[j].append("Big{}(PQ)".format(k+1)) else: table[j].append("Big(PQ)") else: table[j].append("-") if not have_bet: for j, row in enumerate(table): if j == 0: table[j].append("投注") else: table[j].append("-") # --------------------- # combine racecard info # --------------------- thead = table[0] col_horse_no = thead.index("馬號") for i, row in enumerate(table): if i == 0: table[i].append("皇牌") table[i].append("配備") table[i].append("操練") else: if row[1] != '' and util.is_int(row[col_horse_no]): horse_number = int(row[col_horse_no]) table[i].append(table_racecard[horse_number][-6]) # 優先參賽次序 table[i].append(table_racecard[horse_number][-5]) # 配備 else: table[i].append('-') table[i].append('-') # TODO TODO TODO table[i].append('') # 操練 # ------------------- # combine place & ddy # ------------------- for i, row in enumerate(table): if i == 0: table[i].append("地點") table[i].append("度地儀") else: if bet_info["place"] == "ST": table[i].append("沙田") else: table[i].append("跑馬地") table[i].append(bet_info["ddy"]) # ------------ # combine odds # ------------ for i, row in enumerate(table): if i == 0: table[i].append("P賠率") table[i].append("P賠率2") table[i].append("P賠率3") table[i].append("Queue賠率") table[i].append("PQ賠率") table[i].append("PQ賠率2") table[i].append("PQ賠率3") else: p_awards = table_awards[2][1] q_awards = table_awards[3][1] pq_awards = table_awards[4][1] # P1/2/3 for j in range(len(p_awards)): if p_awards[j][0] == table[i][col_horse_no]: table[i].append(util.str_to_float(p_awards[j][1])) else: table[i].append('') # Queue for j in range(len(q_awards)): horse_number = q_awards[j][0].split(',') if horse_number[0] == table[i][col_horse_no] or horse_number[1] == table[i][col_horse_no]: table[i].append(util.str_to_float(q_awards[j][1])) else: table[i].append('') # Pos-Queue for j in range(len(pq_awards)): horse_number = pq_awards[j][0].split(',') if horse_number[0] == table[i][col_horse_no] or horse_number[1] == table[i][col_horse_no]: table[i].append(util.str_to_float(pq_awards[j][1])) else: table[i].append('') return table