def makepkg(values): packet = [] packet.append(len(values) + 3) packet += values p = CrcArc() p.process(packet) crc = p.final() packet.append(crc >> 8 & 0xFF) packet.append(crc & 0xFF) return packet
def crc(savefile): offsets = [ 0x20, 0xA030, 0xB260, 0x11EB0, 0x11EE0, 0x11F30, 0x11F60, 0x24090, 0x240C0, 0x240F0, 0x244A0, 0x248B0 ] sizes = [ 0x9C80, 0x1214, 0x6C28, 0xC, 0x34, 0x10, 0x12120, 0x10, 0x10, 0x384, 0x234, 0x40 ] section = [ "THUM", "FLAG", "GAME", "TIME", "PCPM", "CAMD", "ITEM", "WTHR", "SNDS", "MINE", "TBOX", "OPTD" ] for i in range(12): with open(savefile, 'rb') as f: f.seek(offsets[i] - 4) r = f.read(sizes[i] + 4) crc_orig = int.from_bytes(r[:4], "big") data = r[4:] crc_calc = CrcArc.calc(data) if crc_calc != crc_orig: print(section[i], ': CRC FIXED') with open(savefile, 'r+b') as g: g.seek(offsets[i] - 4) g.write(crc_calc.to_bytes(4, "big"))
def crc16_checksum(self): """Get CRC16 checksum A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data. The CRC was invented by W. Wesley Peterson in 1961. Returns: Chepy: The Chepy object. """ self.state = CrcArc().process(self._convert_to_bytes()).finalhex() return self
def sendMessage(self, method, Nbytes, rAddress, data, dAddress=None): """Comando genérico de comunicaciones para el envio de datos a la placa de evalución. Arguments: method {string} -- Consultar el datasheet para más información de los metodos de escritura. Nbytes {int} -- Número de bytes a enviar. Los envios de 7 bytes no estan permitidos, si se intenta hacer se enviaran 8 bytes, rellenando el byte más significativo con 0. Esto podría afectar a un registro no deseado. Usar con cuidado. rAddress {int,hex,bin} -- Dirección del registro de destino. Se pueden utilizar enteros, valores hexadecimales (de la forma 0x123AF) o valores binarios (de la forma 0b01110) data {int,hex,bin} -- Datos a enviar, el tamaño debe coincidir con Nbytes. Keyword Arguments: dAddress {int,hex,bin} -- Parámetro opcional, obligatorio para las transiciones a un solo dispositivo o hacia un grupo, ignorado para los envios con el método 'Broadcast'. Contiene la dirección del dispositivo o del grupo. Puede estar expresado de la misma forma que rAddress. (default: {None}) """ self.wake() def binary(b): s = int(bin(b), 2) return s methodsDic = { 'SinDevWthRes': 0b000, 'SinDevNoRes': 0b001, 'GroupWthRes': 0b010, 'GroupNoRes': 0b011, 'BroadWthRes': 0b110, 'BroadNoRes': 0b111 } if Nbytes == 8: Nbytes = 7 byteInit = (0b1 << 7) + (methodsDic[method] << 4) + ( 0b0 << 3) + binary(Nbytes) if method not in ['BroadWthRes', 'BroadNoRes']: sendingByte = ((binary(byteInit) << Nbytes * 8 + 16) + (binary(dAddress) << Nbytes * 8 + 8) + (binary(rAddress) << Nbytes * 8) + binary(data)).to_bytes(3 + Nbytes, byteorder='big') else: sendingByte = ((binary(byteInit) << Nbytes * 8 + 8) + (binary(rAddress) << Nbytes * 8) + binary(data)).to_bytes(2 + Nbytes, byteorder='big') crc = (CrcArc.calc(sendingByte)).to_bytes(2, byteorder='little') sendingByte = sendingByte + crc self.__comm.write(sendingByte) return
def reciveMessage(self): """Recibe un mensaje del dispositivo. Devuelve el dato recibido, 'CommErr' si no recibe nada o 'CrcErr' si hay un error en el proceso de comprobación del código de redundacia cíclica. Returns: hex,str -- El mensaje recibido o el error """ self.wake() init = self.__comm.read(1) if init == b'': Message = 'CommErr' else: Message = self.__comm.read(int.from_bytes(init, 'big') + 3) preCRC = init + Message crc = CrcArc.calc(init + Message) if crc == 0: Message = bytearray(Message) Message = bytes(Message[:len(Message) - 2]) else: Message = 'CRCErr' return Message