import csv import warnings from .event_report_template import * def set_bit_in_vector(enable, data, bit_no): bits_in_word = 32 total_words = len(data) selected_word = int(bit_no / bits_in_word) bit_offset = bits_in_word - (((selected_word + 1) * bits_in_word) - bit_no) if selected_word >= total_words: warnings.warn(f"Bit {bit_no} is out of provided vector's range {total_words} words") return if enable: data[selected_word] |= (1 << bit_offset) else: data[selected_word] &= ~(1 << bit_offset) def search_in_list(_type, _list): for item in enumerate(_list): if isinstance(item[1], _type): return item[0] return None def byterarray_to_hex_str(data: bytearray) -> str: return ' '.join(format(x, '02x') for x in data) def content_to_str(data: str) -> str: data = data.replace("\r\n", "
") data = data.replace("\n\r", "
") data = data.replace("\r", "
") data = data.replace("\n", "
") data = data.replace("'", "\\'") data = data.replace(" ", "  ") return data def timestamp_to_str(value) -> str: nsec = value % 1000 value -= nsec value /= 1000 mcsec = value % 1000 value -= mcsec value /= 1000 msec = value % 1000 value -= msec value /= 1000 sec = value % 60 value -= sec value /= 60 min_v = value % 60 value -= min_v hour = value / 60 return "{:02d}:{:02d}:{:02d}.{:03d}.{:03d}.{:03d}".format(int(hour), int(min_v), int(sec), int(msec), int(mcsec), int(nsec)) def save_to_txt_file(path: str, events: list, index=None): file = open(path, 'w') if index is not None: if len(events[index]) == 6: file.write(f"{events[index].get('content')}\n{events[index].get('brief')}\n" f"{byterarray_to_hex_str(events[index].get('data'))}\n" f"{events[index].get('source')}\n") else: warnings.warn("Empty event") else: for data in events: if len(data) == 6: file.write(f"{data.get('content')}\n{data.get('brief')}\n" f"{byterarray_to_hex_str(data.get('data'))}\n" f"{data.get('source')}\n") else: warnings.warn("Empty event") file.close() def save_to_bin_file(path: str, events: list, index=None): file = open(path, 'wb') if index is not None: data = events[index].data if len(data) > 14: sync = 0x0B41550B file.write(sync.to_bytes(length=4, byteorder='little')) file.write(0x0.to_bytes(length=4, byteorder='little')) file.write(int(data[13] & 0xF).to_bytes(length=4, byteorder='little')) file.write(int((len(data) - 12) / 4).to_bytes(length=4, byteorder='little')) file.write(data[12:]) else: for data in events: if len(data.data) > 14: sync = 0x0B41550B file.write(sync.to_bytes(length=4, byteorder='little')) file.write(0x0.to_bytes(length=4, byteorder='little')) file.write(int(data.data[13] & 0xF).to_bytes(length=4, byteorder='little')) file.write(int((len(data.data) - 12) / 4).to_bytes(length=4, byteorder='little')) file.write(data.data[12:]) file.close() def save_to_csv_file(path: str, events: list): with (open(path, 'w', newline='') as file): writer = csv.writer(file, delimiter=';') writer.writerow(["Source", "Type", "Start", "Brief info", "Full info"]) for data in events: if len(data) == 6: processed_info = data.get('content')[:-1] + '.' processed_info = processed_info.replace("\n", "; ") writer.writerow([ data.get('source'), data.get('type'), timestamp_to_str(data.get('timestamp')), data.get('brief'), f'"{processed_info}"' ]) else: warnings.warn("Empty event") def save_to_html_file(path: str, events: list, fw_info: dict, long_type_string: bool): file = open(path, 'w') new_events_template = events_template.replace("{$report_name}", "Unigraf UCD Console event monitoring report").\ replace("{$bundle_version}", fw_info.get('bundle_version')).\ replace("{$app_version}", fw_info.get('app_version')).\ replace("{$frontend_version}", fw_info.get('frontend_version')).\ replace("{$memory_size}", fw_info.get('memory_size')).\ replace("{$ucd_device}", fw_info.get('ucd_device')).\ replace("{$ucd_fw_version}", fw_info.get('ucd_fw_version')).\ replace("{$remarks}", '').\ replace("{$tested}", "") events_data = [] entries_list = [] entries_rows = [] for index, item in enumerate(events): new_entry_value = event_entry_template.replace("{$event_name}", item.get('brief')).\ replace("{$time}", f'{timestamp_to_str(item.get("timestamp"))}').\ replace("{$entry_type}", "").\ replace("{$send_from}", item.get('type')).\ replace("{$num}", f'{index}').\ replace("{$hex}", byterarray_to_hex_str(item.get('data'))).\ replace("{$hex_just}", byterarray_to_hex_str(item.get('data'))).\ replace("{$event_data}", content_to_str(item.get('content'))).\ replace("{$num_just}", f"{index}".ljust(6, " ").replace(" ", " ")).\ replace("{$send_from_just}", f"{item.get('source')}".ljust(10, " ").replace(" ", " ")).\ replace("{$type_just}", f"{item.get('type')}".ljust(16 if long_type_string else 8, " ").replace(" ", " ")).\ replace("{$text_color}", "#000000").\ replace("{$back_color}", '#ffffff').\ replace("{$font_bold}", "").\ replace("{$font_italic}", "").\ replace("{$font_family}", "") new_event_table_row = event_table_row.replace("{$text_color}", "#000000").\ replace("{$back_color}", '#ffffff').\ replace("{$font_family}", "").\ replace("{$font_italic}", "").\ replace("{$font_bold}", "").\ replace("{$num}", f'{index}').\ replace("{$num_just}", f"{index}".ljust(6, " ").replace(" ", " ")).\ replace("{$time}", f'{timestamp_to_str(item.get("timestamp"))}').\ replace("{$send_from_just}", f"{item.get('source')}".ljust(10, " ").replace(" ", " ")).\ replace("{$type_just}", f"{item.get('type')}".ljust(16 if long_type_string else 8, " ").replace(" ", " ")).\ replace("{$event_name}", item.get('brief')) events_data.append(new_entry_value) entries_rows.append(new_event_table_row) entries_list.append(f"Entry{index},") new_events_template = new_events_template.replace("{$events_data}", "\n".join(e for e in events_data)).\ replace("{$events_list}", "\n".join(e for e in entries_list)).\ replace("{$events_table}", "\n".join(e for e in entries_rows)) file.write(new_events_template) file.close()