refactor(itho-wpu): compose request + calculate checksum on the fly
Messages have 6 header bytes, data bytes and 1 checksum byte. The 6 header bytes are: 1: i2c destination address (0x82) 2: i2c reply address (0x80) 3,4: message class 5: message type (0x04 = request) 6: data length (0x00 in case of a request)
This commit is contained in:
		
							parent
							
								
									58f35d988e
								
							
						
					
					
						commit
						b0ea3a9473
					
				
					 1 changed files with 22 additions and 6 deletions
				
			
		
							
								
								
									
										28
									
								
								itho-wpu.py
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								itho-wpu.py
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -125,17 +125,33 @@ class I2CMaster:
 | 
			
		|||
        self.i = i2c_raw.I2CRaw(address=address, bus=bus)
 | 
			
		||||
        self.queue = queue
 | 
			
		||||
 | 
			
		||||
    def execute_action(self, action):
 | 
			
		||||
    def compose_request(self, action):
 | 
			
		||||
        actions = {
 | 
			
		||||
            "getnodeid": [0x80, 0x90, 0xE0, 0x04, 0x00, 0x8A],
 | 
			
		||||
            "getserial": [0x80, 0x90, 0xE1, 0x04, 0x00, 0x89],
 | 
			
		||||
            "getdatatype": [0x80, 0xA4, 0x00, 0x04, 0x00, 0x56],
 | 
			
		||||
            "getdatalog": [0x80, 0xA4, 0x01, 0x04, 0x00, 0x55],
 | 
			
		||||
            "getnodeid": [0x90, 0xE0],
 | 
			
		||||
            "getserial": [0x90, 0xE1],
 | 
			
		||||
            "getdatatype": [0xA4, 0x00],
 | 
			
		||||
            "getdatalog": [0xA4, 0x01],
 | 
			
		||||
        }
 | 
			
		||||
        # 0x80 = source, 0x04 = msg_type, 0x00 = length
 | 
			
		||||
        request = [0x80] + actions[action] + [0x04, 0x00]
 | 
			
		||||
        request.append(self.calculate_checksum(request))
 | 
			
		||||
        return request
 | 
			
		||||
 | 
			
		||||
    def calculate_checksum(self, request):
 | 
			
		||||
        s = 0x82
 | 
			
		||||
        for i in request:
 | 
			
		||||
            s += i
 | 
			
		||||
        checksum = 256 - (s % 256)
 | 
			
		||||
        if checksum == 256:
 | 
			
		||||
            checksum = 0
 | 
			
		||||
        return checksum
 | 
			
		||||
 | 
			
		||||
    def execute_action(self, action):
 | 
			
		||||
        request = self.compose_request(action)
 | 
			
		||||
        result = None
 | 
			
		||||
        for i in range(0, 20):
 | 
			
		||||
            logger.debug(f"Executing action: {action}")
 | 
			
		||||
            self.i.write_i2c_block_data(actions[action])
 | 
			
		||||
            self.i.write_i2c_block_data(request)
 | 
			
		||||
            time.sleep(0.21)
 | 
			
		||||
            logger.debug("Queue size: {}".format(self.queue.qsize()))
 | 
			
		||||
            if self.queue.qsize() > 0:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue