Skip to content

AttributeError: 'mHID' object has no attribute 'dict' #8

Description

@abodsakah

I am using py 3.8 and this project is built on py 2.7 so i am trying to do is to integrate this project into py 3.8 and i fixed a lot of issues that i was facing but this one i was stuck on so any help would be appreciated :)

I am getting this error:

`
init mBot
bot

<lib.mBot.mSerial object at 0x034D3850>
start with serial

<lib.mBot.mHID object at 0x036582C8>
self.device = mHID()

starting start

'mHID' object has no attribute 'dict'
Exception in thread Thread-1:
Traceback (most recent call last):
File "c:\Users\abdsak11\OneDrive - Lärande\Dokument\GitHub\python-for-mbot\lib\mBot.py", line 154, in __onRead
n = self.device.inWaiting()
File "c:\Users\abdsak11\OneDrive - Lärande\Dokument\GitHub\python-for-mbot\lib\mBot.py", line 96, in inWaiting
buf = self.dict.device.read(64)
AttributeError: 'mHID' object has no attribute 'dict'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\abdsak11\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\abdsak11\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "c:\Users\abdsak11\OneDrive - Lärande\Dokument\GitHub\python-for-mbot\lib\mBot.py", line 163, in __onRead
self.close()
File "c:\Users\abdsak11\OneDrive - Lärande\Dokument\GitHub\python-for-mbot\lib\mBot.py", line 142, in close
self.device.close()
File "c:\Users\abdsak11\OneDrive - Lärande\Dokument\GitHub\python-for-mbot\lib\mBot.py", line 106, in close
self.dict.device.close()
AttributeError: 'mHID' object has no attribute 'dict'`

and this is my mbot.py file after i played around with it:
`import serial
import sys,time
import signal
from time import ctime,sleep
import glob,struct
from multiprocessing import Process,Manager,Array
import threading
import hid

class mSerial():
ser = None
def init(self):
print (self)

def start(self, port):
	self.ser = serial.Serial(port,115200)

def device(self):
	return self.ser

def serialPorts(self):
	if sys.platform.startswith('win'):
		ports = ['COM%s' % (i + 1) for i in range(256)]
	elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
		ports = glob.glob('/dev/tty[A-Za-z]*')
	elif sys.platform.startswith('darwin'):
		ports = glob.glob('/dev/tty.*')
	else:
		raise EnvironmentError('Unsupported platform')
	result = []
	for port in ports:
		s = serial.Serial()
		s.port = port
		s.close()
		result.append(port)
	return result

def writePackage(self,package):
	self.ser.write(package)
	sleep(0.01)

def read(self):
	return self.ser.read()

def isOpen(self):
	return self.ser.isOpen()

def inWaiting(self):
	return self.ser.inWaiting()

def close(self):
	self.ser.close()

class mHID():
def init(self):
print (self)

def start(self):
	print ("starting start \n\n")
	self.manager = Manager()
	print("manager pass \n\n")
	self.dict = self.manager.dict()
	print("dict pass \n\n")
	self.dict.device = hid.device()
	print("dict device pass \n\n")
	self.dict.device.open(0x0416, 0xffff)
	print("dict device open pass \n\n")
	self.dict.device.hid_set_nonblocking(self.device,1)
	print ("start")
	self.buffer = []
	self.bufferIndex = 0

def enumerate(self):
	print ("enumerate")
	for dev in self.dict.device.enumerate():
		print ('------------------------------------------------------------')
		print (dev.description())

def writePackage(self,package):
	buf = []
	buf += [0, len(package)]
	for i in range(len(package)):
		buf += [package[i]]
	n = self.dict.device.write(buf)
	sleep(0.01)

def read(self):
	c = self.buffer[0]
	self.buffer = self.buffer[1:]
	return chr(c)
	
def isOpen(self):
	return True
	
def inWaiting(self):
	buf = self.dict.device.read(64)
	l = 0
	if len(buf)>0:
		l = buf[0]
	if l>0:
		for i in range(0,l):
			self.buffer += [buf[i+1]]
	return len(self.buffer)
	
def close(self):
	self.dict.device.close()

class mBot():
def init(self):
print ("init mBot")
signal.signal(signal.SIGINT, self.exit)
self.manager = Manager()
self.__selectors = self.manager.dict()
self.buffer = []
self.bufferIndex = 0
self.isParseStart = False
self.exiting = False
self.isParseStartIndex = 0

def startWithSerial(self, port):
	self.device = mSerial()
	self.device.start(port)
	self.start()

def startWithHID(self):
	self.device = mHID()
	print ("self.device = mHID()\n \n")
	self.device.start()
	print ("self.device.start()\n \n")
	self.start()
	print ("self.start()\n \n")

def excepthook(self, exctype, value, traceback):
	self.close()
	
def start(self):
	sys.excepthook = self.excepthook
	th = threading.Thread(target=self.__onRead,args=(self.onParse,))
	th.start()
	
def close(self):
	self.device.close()
	
def exit(self, signal, frame):
	self.exiting = True
	sys.exit(0)
	
def __onRead(self,callback):
	while 1:
		if(self.exiting==True):
			break
		try:	
			if self.device.isOpen()==True:
				n = self.device.inWaiting()
				for i in range(n):
					r = ord(self.device.read())
					callback(r)
				sleep(0.01)
			else:	
				sleep(0.5)
		except Exception as ex:
			print (str(ex))
			self.close()
			sleep(1)
			
def __writePackage(self,pack):
	self.device.writePackage(pack)

def doRGBLed(self,port,slot,index,red,green,blue):
	self.__writePackage(bytearray([0xff,0x55,0x9,0x0,0x2,0x8,port,slot,index,red,green,blue]))

def doRGBLedOnBoard(self,index,red,green,blue):
	self.doRGBLed(0x7,0x2,index,red,green,blue)

def doMotor(self,port,speed):
	self.__writePackage(bytearray([0xff,0x55,0x6,0x0,0x2,0xa,port]+self.short2bytes(speed)))

def doMove(self,leftSpeed,rightSpeed):
	self.__writePackage(bytearray([0xff,0x55,0x7,0x0,0x2,0x5]+self.short2bytes(-leftSpeed)+self.short2bytes(rightSpeed)))
	
def doServo(self,port,slot,angle):
	self.__writePackage(bytearray([0xff,0x55,0x6,0x0,0x2,0xb,port,slot,angle]))

def doBuzzer(self,buzzer,time=0):
	self.__writePackage(bytearray([0xff,0x55,0x7,0x0,0x2,0x22]+self.short2bytes(buzzer)+self.short2bytes(time)))

def doSevSegDisplay(self,port,display):
	self.__writePackage(bytearray([0xff,0x55,0x8,0x0,0x2,0x9,port]+self.float2bytes(display)))
	
def doIROnBoard(self,message):
	self.__writePackage(bytearray([0xff,0x55,len(message)+3,0x0,0x2,0xd,message]))
	
def requestLightOnBoard(self,extID,callback):
	self.requestLight(extID,8,callback)

def requestLight(self,extID,port,callback):
	self.__doCallback(extID,callback)
	self.__writePackage(bytearray([0xff,0x55,0x4,extID,0x1,0x3,port]))

def requestButtonOnBoard(self,extID,callback):
	self.__doCallback(extID,callback)
	self.__writePackage(bytearray([0xff,0x55,0x4,extID,0x1,0x1f,0x7]))
	
def requestIROnBoard(self,extID,callback):
	self.__doCallback(extID,callback)
	self.__writePackage(bytearray([0xff,0x55,0x3,extID,0x1,0xd]))
	
def requestUltrasonicSensor(self,extID,port,callback):
	self.__doCallback(extID,callback)
	self.__writePackage(bytearray([0xff,0x55,0x4,extID,0x1,0x1,port]))
	
def requestLineFollower(self,extID,port,callback):
	self.__doCallback(extID,callback)
	self.__writePackage(bytearray([0xff,0x55,0x4,extID,0x1,0x11,port]))

def onParse(self, byte):
	position = 0
	value = 0	
	self.buffer+=[byte]
	bufferLength = len(self.buffer)
	if bufferLength >= 2:
		if (self.buffer[bufferLength-1]==0x55 and self.buffer[bufferLength-2]==0xff):
			self.isParseStart = True
			self.isParseStartIndex = bufferLength-2	
		if (self.buffer[bufferLength-1]==0xa and self.buffer[bufferLength-2]==0xd and self.isParseStart==True):			
			self.isParseStart = False
			position = self.isParseStartIndex+2
			extID = self.buffer[position]
			position+=1
			type = self.buffer[position]
			position+=1
			# 1 byte 2 float 3 short 4 len+string 5 double
			if type == 1:
				value = self.buffer[position]
			if type == 2:
				value = self.readFloat(position)
				if(value<-255 or value>1023):
					value = 0
			if type == 3:
				value = self.readShort(position)
			if type == 4:
				value = self.readString(position)
			if type == 5:
				value = self.readDouble(position)
			if(type<=5):
				self.responseValue(extID,value)
			self.buffer = []

def readFloat(self, position):
	v = [self.buffer[position], self.buffer[position+1],self.buffer[position+2],self.buffer[position+3]]
	return struct.unpack('<f', struct.pack('4B', *v))[0]
def readShort(self, position):
	v = [self.buffer[position], self.buffer[position+1]]
	return struct.unpack('<h', struct.pack('2B', *v))[0]
def readString(self, position):
	l = self.buffer[position]
	position+=1
	s = ""
	for i in Range(l):
		s += self.buffer[position+i].charAt(0)
	return s
def readDouble(self, position):
	v = [self.buffer[position], self.buffer[position+1],self.buffer[position+2],self.buffer[position+3]]
	return struct.unpack('<f', struct.pack('4B', *v))[0]

def responseValue(self, extID, value):
	self.__selectors["callback_"+str(extID)](value)
	
def __doCallback(self, extID, callback):
	self.__selectors["callback_"+str(extID)] = callback

def float2bytes(self,fval):
	val = struct.pack("f",fval)
	return [ord(val[0]),ord(val[1]),ord(val[2]),ord(val[3])]

def short2bytes(self,sval):
	val = struct.pack("h",sval)
	return [ord(val[0]),ord(val[1])]`

and thats what i am trying to do:

`
from lib.mBot import *

if name == "main":
bot = mBot()
print ("bot \n\n")
bot.startWithSerial("COM3")
print ("start with serial\n\n")
bot.startWithHID()
print ("start with HID \n\n")

print(f'--------------------\n')
print (bot)
print(f'--------------------\n')

bot.doMove(50,50)`

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions