Пример #1
0
	def __init__(self):
		self.global_ids = GlobalIdNums()
		self.e_model = False
		self.empty_receptacle_ids = []
		self.full_receptacle_ids = []
		self.outlet_ids = []
		self.light_string_ids = []
		self.splitter_ids = []
Пример #2
0
class Support(object):

	def __init__(self):
		self.global_ids = GlobalIdNums()
		self.e_model = False
		self.empty_receptacle_ids = []
		self.full_receptacle_ids = []
		self.outlet_ids = []
		self.light_string_ids = []
		self.splitter_ids = []

	#### Protocol Funcs ####

	def pack_single_uint32(self, uint32_val):
		'''
		Pack unsigned int32
		'''
		return struct.pack('I', uint32_val)

	def pack_single_int32(self, int32_val):
		'''
		Pack signed int32
		'''
		return struct.pack('i', int32_val)

	def pack_single_uint8(self, uint8_val):
		'''
		Pack unsigned int8
		'''
		return struct.pack('B', uint8_val)

	def pack_single_int8(self, int8_val):
		'''
		Pack signed int8
		'''
		return struct.pack('b', int8_val)

	def pack_mode(self, mode):
		'''
		mode is uint32_t
		'''
		return self.pack_single_uint32(MODES[mode])

	def pack_command(self, command):
		'''
		command is uint32_t
		'''
		return self.pack_single_uint32(COMMANDS[command])

	def pack_error(self, err_name):
		'''
		err_name is int32_t
		'''
		return self.pack_single_int32(ERRORS[err_name])

	def pack_model(self, model_id, component_type='LOAD_CENTER'):
		'''
		model_id is uint32_t
		'''
		if component_type == 'LOAD_CENTER':
			return self.pack_single_uint32(LOAD_CENTER_MODELS[model_id])
		elif component_type == 'BREAKER':
			return self.pack_single_uint32(BREAKER_MODELS[model_id])
		elif component_type == 'OUTLET':
			return self.pack_single_uint32(OUTLET_MODELS[model_id])
		elif component_type == 'SPLITTER':
			return self.pack_single_uint32(SPLITTER_MODELS[model_id])
		elif component_type == 'LIGHT_STRING':
			return self.pack_single_uint32(LIGHT_STRING_MODELS[model_id])

	def pack_target(self, target_id):
		'''
		target_id is uint32_t
		'''
		return self.pack_single_uint32(target_id)

	def pack_results(self, results_obj):
		'''
		results_obj is an instance of Results
		'''
		r = ''
		r += self.pack_single_uint32(results_obj.get_object_id())
		r_ids = results_obj.get_receptacle_id_list()
		for idx in range(8):
			r += self.pack_single_uint32(r_ids[idx])
		r += self.pack_single_uint8(results_obj.get_receptacle_ids_assigned_count())
		return r


	def get_list_valid_models(self, component_type):
		res = {}
		if component_type == 'LOAD_CENTER':
			res = LOAD_CENTER_MODELS
		elif component_type == 'BREAKER':
			res = BREAKER_MODELS
		elif component_type == 'OUTLET':
			res = OUTLET_MODELS
		elif component_type == 'SPLITTER':
			res = SPLITTER_MODELS
		elif component_type == 'LIGHT_STRING':
			res = LIGHT_STRING_MODELS

		keys = res.keys()
		if 'BAD' in keys:
			keys.remove('BAD')
		return keys

	def is_model_created(self):
		return self.e_model != False

	def init_panel(self, model_name):
		self.e_model = LoadCenter(model_name)

	def is_panel_full(self):
		return self.e_model.is_full()

	def is_panel_empty(self):
		return self.e_model.is_empty()

	def add_breaker(self, model_name):
		b = Breaker(model_name)
		self.e_model.add_breaker(b)

		r = Results()
		r.set_object_id(b.get_id())
		return r

	def get_breaker_count(self):
		if True == self.is_model_created():
			return self.e_model.get_breakers_installed_cnt()
		else:
			return 0

	def outlet_amps_exceed_breaker_amps(self, outlet_model_name, breaker_id):
		if True == self.is_panel_empty():
			if True == DEBUG:
				print('Support outlet amps > breaker amps - is_empty: {0}, breaker count: {1}'.format(self.is_panel_empty(), self.get_breaker_count()))
			return True
		else:
			b = self.e_model.get_breaker_by_id(breaker_id)
			if True == DEBUG:
				print('Support outlet amps > breaker amps - outlet:{0} > breaker:{1}'.format(OUTLET_MODELS[outlet_model_name], b.get_amp_rating()))
			return OUTLET_MODELS[outlet_model_name] > b.get_amp_rating()

	def get_random_empty_receptacle_id(self):
		r_count = len(self.empty_receptacle_ids)
		if 1 < r_count:
			return self.empty_receptacle_ids[randint(0, r_count - 1)]
		elif 1 == r_count:
			return self.empty_receptacle_ids[0]
		else:
			return 0

	def get_random_full_receptacle_id(self):
		r_count = len(self.full_receptacle_ids)
		if 1 < r_count:
			return self.full_receptacle_ids[randint(0, r_count - 1)]
		elif 1 == r_count:
			return self.full_receptacle_ids[0]
		else:
			return 0

	def get_max_empty_receptacle_id(self):
		r_count = len(self.empty_receptacle_ids)
		if 1 < r_count:
			return max(self.empty_receptacle_ids)
		elif 1 == r_count:
			return self.empty_receptacle_ids[0]
		else:
			return 0

	def get_min_empty_receptacle_id(self):
		r_count = len(self.empty_receptacle_ids)
		if 1 < r_count:
			return min(self.empty_receptacle_ids)
		elif 1 == r_count:
			return self.empty_receptacle_ids[0]
		else:
			return 0

	def get_min_valid_outlet_id(self):
		count = len(self.outlet_ids)
		if 1 < count:
			return min(self.outlet_ids)
		elif 1 == count:
			return self.outlet_ids[0]
		else:
			return 0

	def get_min_valid_light_string_id(self):
		count = len(self.light_string_ids)
		if 1 < count:
			return min(self.light_string_ids)
		elif 1 == count:
			return self.light_string_ids[0]
		else:
			return 0

	def get_min_valid_splitter_id(self):
		count = len(self.splitter_ids)
		if 1 < count:
			return min(self.splitter_ids)
		elif 1 == count:
			return self.splitter_ids[0]
		else:
			return 0

	def get_receptacle_by_id(self, receptacle_id):
		if True == DEBUG:
			print('Support.get_receptacle_by_id. receptacle_id:{0}'.format(receptacle_id))
		return self.e_model.get_receptacle_by_id(receptacle_id)

	def add_outlet(self, model_name, breaker_id):
		outlet_id = self.global_ids.get_next_outlet_id()
		rid_1 = self.global_ids.get_next_receptacle_id()
		rid_2 = self.global_ids.get_next_receptacle_id()
		if True == DEBUG:
			print('Support.add_outlet o_id:{0}, rid_1:{1}, rid_2:{2}.'.format(outlet_id, rid_1, rid_2))

		o = Outlet(model_name, outlet_id, [rid_1, rid_2])
		b = self.e_model.get_breaker_by_id(breaker_id)
		b.add_outlet(o)

		r = Results()
		r.set_object_id(outlet_id)
		r.set_next_receptacle_id(rid_1)
		r.set_next_receptacle_id(rid_2)

		r1 = o.get_receptacle_by_id(rid_1)
		r2 = o.get_receptacle_by_id(rid_2)
		if None == r1:
			print('Support.add_outlet o.get_receptacle_by_id returned None for r1.')
		if None == r2:
			print('Support.add_outlet o.get_receptacle_by_id returned None for r2.')

		self.outlet_ids.append(outlet_id)
		self.empty_receptacle_ids.append(rid_1)
		self.empty_receptacle_ids.append(rid_2)

		if True == DEBUG:
			print('Support.add_outlet(). Final empty_receptacle_ids:{0}'.format(self.empty_receptacle_ids))

		return r

	def add_light_string(self, model_name, receptacle_id):
		light_string_id = self.global_ids.get_next_light_string_id()
		rid_1 = self.global_ids.get_next_receptacle_id()
		ls = LightString(model_name, light_string_id, rid_1)

		receptacle = self.get_receptacle_by_id(receptacle_id)
		receptacle.connect_load('LIGHT_STRING', ls)

		self.full_receptacle_ids.append(receptacle_id)
		self.empty_receptacle_ids.remove(receptacle_id)

		r = Results()
		r.set_object_id(light_string_id)
		r.set_next_receptacle_id(rid_1)

		r1 = ls.get_receptacle_by_id(rid_1)
		if None == r1:
			print('Support.add_light_string ls.get_receptacle_by_id returned None for r1.')

		self.light_string_ids.append(light_string_id)
		self.empty_receptacle_ids.append(rid_1)

		if True == DEBUG:
			print('Support.add_light_string(). Final empty_receptacle_ids:{0}'.format(self.empty_receptacle_ids))
			print('Support.add_light_string(). Final full_receptacle_ids:{0}'.format(self.full_receptacle_ids))

		return r

	def add_splitter(self, model_name, receptacle_id):
		splitter_id = self.global_ids.get_next_splitter_id()
		rids = []
		receptacle_count = SPLITTER_MODELS[model_name]
		for r_id in range(receptacle_count):
			rids.append(self.global_ids.get_next_receptacle_id())

		if True == DEBUG:
			print('Support.add_splitter() receptacle_count:{0}, rids:{1}'.format(receptacle_count, rids))

		sp = Splitter(model_name, splitter_id, rids)

		receptacle = self.get_receptacle_by_id(receptacle_id)
		receptacle.connect_load('SPLITTER', sp)

		self.full_receptacle_ids.append(receptacle_id)
		self.empty_receptacle_ids.remove(receptacle_id)

		r = Results()
		r.set_object_id(splitter_id)
		r.set_next_receptacle_id_from_list(rids)

		self.splitter_ids.append(splitter_id)
		del(r_id)
		for r_id in rids:
			r1 = sp.get_receptacle_by_id(r_id)
			if None == r1:
				print('Support.add_splitter sp.get_receptacle_by_id returned None for r1. r_id:{0}, rids:{1}'.format(r_id, rids))
			self.empty_receptacle_ids.append(r_id)

		if True == DEBUG:
			print('Support.add_splitter(). Final empty_receptacle_ids:{0}'.format(self.empty_receptacle_ids))
			print('Support.add_splitter(). Final full_receptacle_ids:{0}'.format(self.full_receptacle_ids))

		return r

	def is_panel_overloaded(self):
		res = (self.e_model.get_amp_load() > self.e_model.get_amp_rating())
		r = Results()
		r.set_object_id(res)
		return r

	def is_breaker_overloaded(self, breaker_id):
		b = self.e_model.get_breaker_by_id(breaker_id)
		too_much_amp_load = (b.get_amp_load() > (0.8 * b.get_amp_rating()))

		outlet_count = b.get_count_outlets()
		too_many_outlets = False
		if b.get_amp_rating() == BREAKER_MODELS['FIFTEEN_AMP']:
			if 8 < outlet_count:
				too_many_outlets = True
		elif b.get_amp_rating() == BREAKER_MODELS['TWENTY_AMP']:
			if 10 < outlet_count:
				too_many_outlets = True

		res = too_many_outlets or too_much_amp_load
		r = Results()
		r.set_object_id(res)
		return r

	def is_outlet_overloaded(self, outlet_id):
		o = self.e_model.get_outlet_by_id(outlet_id)
		total_amp_load = o.get_amp_load()
		amp_rating = (0.8 * o.get_amp_rating())
		max_amp_load = o.get_max_receptacle_amp_load()

		too_much_total_amp_load = (total_amp_load > amp_rating)
		too_much_amp_load_one_receptacle = (max_amp_load > amp_rating)
		res = too_much_total_amp_load or too_much_amp_load_one_receptacle
		if True == DEBUG:
			print('Support.is_outlet_overloaded() total_amp_load:{0}, max_amp_load:{1}, amp_rating:{2} => {3}'.format(total_amp_load, max_amp_load, amp_rating, res))
		r = Results()
		r.set_object_id(res)
		return r


	def is_splitter_overloaded(self, splitter_id):
		sp = self.e_model.get_splitter_by_id(splitter_id)
		res = False
		if None != sp:
			amp_rating = (0.8 * sp.get_amp_rating())
			total_amp_load = sp.get_amp_load()
			max_amp_load = sp.get_max_receptacle_amp_load()

			too_much_total_amp_load = (total_amp_load > amp_rating)
			too_much_amp_load_one_receptacle = (max_amp_load > amp_rating)
			res = too_much_total_amp_load or too_much_amp_load_one_receptacle
			if True == DEBUG:
				print('Support.is_splitter_overloaded() total_amp_load:{0}, max_amp_load:{1}, amp_rating:{2} => {3}'.format(total_amp_load, max_amp_load, amp_rating, res))
		r = Results()
		r.set_object_id(res)
		return r

	def is_light_string_overloaded(self, light_string_id):
		ls = self.e_model.get_light_string_by_id(light_string_id)
		res = False
		if None != ls:
			total_amp_load = ls.get_amp_load()
			amp_rating = ls.get_amp_rating()
			res = (total_amp_load > amp_rating)
			if True == DEBUG:
				print('Support.is_light_string_overloaded() total_amp_load:{0} > amp_rating:{1} => {2}'.format(total_amp_load, amp_rating, res))
		r = Results()
		r.set_object_id(res)
		return r

	def is_receptacle_overloaded(self, receptacle_id):
		receptacle = self.e_model.get_receptacle_by_id(receptacle_id)
		total_amp_load = receptacle.get_amp_load()
		amp_rating = receptacle.get_amp_rating()
		res = (total_amp_load > amp_rating)
		if True == DEBUG:
			print('Support.is_receptacle_overloaded() total_amp_load:{0} > amp_rating:{1} => {2}'.format(total_amp_load, amp_rating, res))

		r = Results()
		r.set_object_id(res)
		return r