示例#1
0
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
示例#2
0
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"))
示例#3
0
    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
示例#4
0
    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
示例#5
0
 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