########################################################################### # # Copyright (c) 2019-2021 Diality Inc. - All Rights Reserved. # # THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN # WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. # # @file utils.py # # @author (last) Joseph varghese # @date (last) 15-Jan-2022 # ############################################################################ import math import squish import sys import test from dialin.common import MsgIds from dialin.utils import * from dialin.protocols import DenaliMessage, DenaliCanMessenger, DenaliChannels from builtins import int as pyInt from datetime import datetime def check_if_object_is_within_the_container(obj=None, container=None): """ check if an object is inside a container @param obj - child UI object @param container - container UI object @return boolean true/false """ container = squish.findObject(container) containerPos = container.mapToGlobal(squish.QPoint(0, 0)) container_x, container_y = pyInt(containerPos.x), pyInt(containerPos.y) container_width, container_height = pyInt(container.width), pyInt(container.height) obj = squish.findObject(obj) objPos = obj.mapToGlobal(squish.QPoint(0, 0)) obj_x, obj_y = pyInt(objPos.x), pyInt(objPos.y) obj_width, obj_height = pyInt(obj.width), pyInt(obj.height) if obj_x >= container_x and obj_y >= container_y: if (obj_x + obj_width) <= (container_x + container_width) and (obj_y + obj_height) <= (container_y + container_height): return True return False def scroll_to_zone(zone=None, screen_object=None): """ scroll to the numeric if object is hidden @param zone - UI object @param screen_object - UI object (UI Home screen = waveforms + numerics) @return boolean true/false """ counter = 0 while counter <= 100: try: counter += 1 squish.findObject(zone) squish.snooze(0.5) if check_if_object_is_within_the_container(obj=zone, container=screen_object): return True else: raise RuntimeError except RuntimeError: ScreenObj = squish.waitForObject(screen_object) screenHeight = pyInt(ScreenObj.height) screenWidth = pyInt(ScreenObj.width) squish.mouseWheel(ScreenObj, screenWidth-1000, screenHeight-10, 0, -50, squish.Qt.NoModifier) raise LookupError("zone object is not in view to the user after " + \ "trying 100 times") def pad_message_with_zeros(message): """ Returns a packet padded with zeros that guarantees that the packet is a multiple of 8 bytes. @param message: packet that may or may not be multiple of 8 bytes @return:: packet that is 8-byte multiple """ PACKET_LENGTH = 4 message_length = len(message) if message_length % PACKET_LENGTH != 0: add_these_many_zeros = math.ceil(message_length / PACKET_LENGTH) * \ PACKET_LENGTH - message_length message += [0] * add_these_many_zeros return message def ui_all_publication_handler(message: dict) -> None: """ This function is the default handler of the ui received messages which only prints out the received message - This function can be used as an example. - Be careful that there is only one ui publication method and it will be overwritten on each call to the function set_ui_all_publication of the HDSimulator. Look into the _init_loader of the Simulator class for example on how to register. self.interface.hd.set_ui_all_publication(ui_all_publication_handler) - This function is filtering the two message ID: MsgIds.MSG_ID_UI_CHECK_IN.value, MsgIds.MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK.value for the simplicity of the printed message and as example of how to filter. That filter can obviously be removed. @param message: the ui received message @return: event binary from simulator """ exception_msg_id = { MsgIds.MSG_ID_UI_CHECK_IN.value, MsgIds.MSG_ID_ACK_MESSAGE_THAT_REQUIRES_ACK.value } msg_id = DenaliMessage.get_message_id(message) if msg_id in exception_msg_id: return message_list = DenaliCanMessenger.convert_message_to_string(message) event_binary = "" + pad_message_with_zeros(message_list) return event_binary def cmd_set_create_treatment_click_event(response): """ Sends a set RTC response message @param response: (int) 0=NO, 1=YES @return: N """ test.log("HD: Sending response {0}".format(response)) payload = integer_to_bytearray(response) message = DenaliMessage.build_message(channel_id=DenaliChannels.ui_to_hd_ch_id, message_id=MsgIds.MSG_ID_UI_INITIATE_TREATMENT_REQUEST.value, payload=payload) return message def get_current_date_and_time(date_format='%Y/%b/%d - %H:%M'): date = datetime.now() return str(date.strftime(date_format))