Beispiel #1
0
    def setUp(self):
        """ Main file for KSDK Project Generator

        .. todo::

            test on Linux, OSX

        .. todo::

            go over comments for documentation; params, etc...

        """

        osName = platform.system()
        root = Tk()                                                # Call Tkinter object 'root'
        s = Style()

        #tkMessageBox.showinfo("Error", 'Path: ' + os.getcwd())

        # Set ttk style for the OS
        if osName == 'Linux':
            themeName = 'alt'
        elif osName == 'Windows':
            themeName = 'vista'
        elif osName == 'Darwin':
            themeName = 'aqua'

        themeNames = s.theme_names()
        if themeNames.count(themeName) == 1:
            s.theme_use(themeName)
        elif len(themeNames) > 0:
            s.theme_use(themeNames[0])

        if osName == 'Windows':                                     # Check if running on Windows
            try:
                root.iconbitmap(default='./kds_icon.ico')           # Use the .ico file if in Windows
            except TclError:
                root.iconbitmap(default=None)
        elif osName == 'Linux':
            img = Image("photo", data=kImg.boardImages['kds_icon.gif']) # Use the .gif file if in Linux
            root.tk.call('wm', 'iconphoto', root._w, img)

        root.title(PGKSDK_NAME + ' -- ' + PGKSDK_VERSION)   # Set title of Tkinter window

        if osName == 'Darwin':
            root.configure(background='#E7E7E7')

        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        if osName == 'Windows':

            key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics")
            value = _winreg.QueryValueEx(key, "AppliedDPI")[0]

            #print "DPI value: " + str(value)

            if value == 96:
                kGUI.WIN_SCALE = 1.0
            elif value == 120:
                kGUI.WIN_SCALE = 1.25
            elif value == 144:
                kGUI.WIN_SCALE = 1.5
            elif value == 192:
                kGUI.WIN_SCALE = 2.0
            else:
                kGUI.WIN_SCALE = value / 96.0

            #print "DPI scale: " + str(kGUI.WIN_SCALE)


            windowWidth = (650 * kGUI.WIN_SCALE)
            windowHeight = (500 * kGUI.WIN_SCALE)

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        elif osName == 'Linux':

            windowWidth = 650
            windowHeight = 500

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        else:

            #print "Mac Version"

            macVer = platform.mac_ver()[0]

            #print macVer[:5]

            if macVer[:5] == '10.10':
                windowWidth = 620
                windowHeight = 480
            elif macVer[:5] == '10.11':
                windowWidth = 680
                windowHeight = 480

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))

        root.resizable(width=FALSE, height=FALSE)
        self.root = root

        global SDK_PATH
        if DEBUG: print 'SDK_PATH is ' + SDK_PATH
        if osName != 'Darwin':
            self.settingsPath = './settings.json'
        else:
            ##print os.getcwd()
            self.settingsPath = '/Users/' + getpass.getuser() + '/Documents/KSDK_Project_Generator/settings.json'

        if os.path.exists(self.settingsPath):
            kT.update_json_file(self.settingsPath, "ksdkPath", SDK_PATH)
        else:
            self.create_json_config()

        self.app = PgGui(master=root)

        #first step is to launch the main ui
        self.prepare_main_ui_dict()
Beispiel #2
0
class TestChooseBoard(unittest.TestCase):
    def setUp(self):
        """ Main file for KSDK Project Generator

        .. todo::

            test on Linux, OSX

        .. todo::

            go over comments for documentation; params, etc...

        """

        osName = platform.system()
        root = Tk()                                                # Call Tkinter object 'root'
        s = Style()

        #tkMessageBox.showinfo("Error", 'Path: ' + os.getcwd())

        # Set ttk style for the OS
        if osName == 'Linux':
            themeName = 'alt'
        elif osName == 'Windows':
            themeName = 'vista'
        elif osName == 'Darwin':
            themeName = 'aqua'

        themeNames = s.theme_names()
        if themeNames.count(themeName) == 1:
            s.theme_use(themeName)
        elif len(themeNames) > 0:
            s.theme_use(themeNames[0])

        if osName == 'Windows':                                     # Check if running on Windows
            try:
                root.iconbitmap(default='./kds_icon.ico')           # Use the .ico file if in Windows
            except TclError:
                root.iconbitmap(default=None)
        elif osName == 'Linux':
            img = Image("photo", data=kImg.boardImages['kds_icon.gif']) # Use the .gif file if in Linux
            root.tk.call('wm', 'iconphoto', root._w, img)

        root.title(PGKSDK_NAME + ' -- ' + PGKSDK_VERSION)   # Set title of Tkinter window

        if osName == 'Darwin':
            root.configure(background='#E7E7E7')

        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        if osName == 'Windows':

            key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics")
            value = _winreg.QueryValueEx(key, "AppliedDPI")[0]

            #print "DPI value: " + str(value)

            if value == 96:
                kGUI.WIN_SCALE = 1.0
            elif value == 120:
                kGUI.WIN_SCALE = 1.25
            elif value == 144:
                kGUI.WIN_SCALE = 1.5
            elif value == 192:
                kGUI.WIN_SCALE = 2.0
            else:
                kGUI.WIN_SCALE = value / 96.0

            #print "DPI scale: " + str(kGUI.WIN_SCALE)


            windowWidth = (650 * kGUI.WIN_SCALE)
            windowHeight = (500 * kGUI.WIN_SCALE)

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        elif osName == 'Linux':

            windowWidth = 650
            windowHeight = 500

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        else:

            #print "Mac Version"

            macVer = platform.mac_ver()[0]

            #print macVer[:5]

            if macVer[:5] == '10.10':
                windowWidth = 620
                windowHeight = 480
            elif macVer[:5] == '10.11':
                windowWidth = 680
                windowHeight = 480

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))

        root.resizable(width=FALSE, height=FALSE)
        self.root = root

        global SDK_PATH
        if DEBUG: print 'SDK_PATH is ' + SDK_PATH
        if osName != 'Darwin':
            self.settingsPath = './settings.json'
        else:
            ##print os.getcwd()
            self.settingsPath = '/Users/' + getpass.getuser() + '/Documents/KSDK_Project_Generator/settings.json'

        if os.path.exists(self.settingsPath):
            kT.update_json_file(self.settingsPath, "ksdkPath", SDK_PATH)
        else:
            self.create_json_config()

        self.app = PgGui(master=root)

        #first step is to launch the main ui
        self.prepare_main_ui_dict()


    def create_json_config(self):
        settingsData = [{'userName':'******', 'ksdkPath':SDK_PATH}]
        try:
            with open(self.settingsPath, "w+") as f:
                json.dump(settingsData, f, sort_keys=True, indent=2)
                f.close()
        except IOError:
            tkMessageBox.showinfo("Error", \
                                  'Check Read/Write permissions.')


    def tearDown(self):
        #need destroy the window, otherwise the next case cannot setUp successfully
        if DEBUG: print 'tearDown, destroy the window successfully'
        try:
            self.root.destroy()
        except TclError:
            sys.exit()


    def prepare_main_ui_dict(self):
        if DEBUG: print 'prepare_main_ui_dict'

        main_widigets = {'ksdk_path'        : self.app.widgetList[1],
                         'project_name'     : self.app.widgetList[4],
                         'choose_board'     : self.app.widgetList[6],
                         'advanced'         : self.app.widgetList[11],
                         'quick_generate'   : self.app.widgetList[10],
                         }
        self.dict_main_widgets = main_widigets


    def prepare_advance_ui_dict(self):
        if DEBUG: print "prepare_advance_ui_dict"

        ad_widgets = {'project_name'        : self.app.widgetList[3],
                      'device_or_board_list': self.app.widgetList[8],
                      'project_type_new'    : self.app.widgetList[5], #0
                      'project_type_clone'  : self.app.widgetList[6], #1
                      'lib_config_platform' : self.app.widgetList[11], #1
                      'lib_config_hal'      : self.app.widgetList[10], #0
                      'lib_rtos_none'       : self.app.widgetList[13], #0
                      'lib_rtos_mqx'        : self.app.widgetList[14], #1
                      'lib_rtos_freertos'   : self.app.widgetList[15], #2
                      'lib_rtos_ucosii'     : self.app.widgetList[16], #3
                      'lib_rtos_ucosiii'    : self.app.widgetList[17], #4
                      'choose_device'       : self.app.widgetList[35], #0
                      'choose_board'        : self.app.widgetList[36], #1
                      'tool_kds'            : self.app.widgetList[19],
                      'tool_iar'            : self.app.widgetList[20],
                      'tool_mdk'            : self.app.widgetList[21],
                      'tool_atl'            : self.app.widgetList[22],
                      #'tool_gcc'            : self.app.widgetList[23], #remove by default
                      'include_bsp'         : self.app.widgetList[25],
                      'parent_folder'       : self.app.widgetList[27],
                      'standalone'          : self.app.widgetList[29],
                      'advance_generate'    : self.app.widgetList[31],
                     }

        self.dict_ad_widgets = ad_widgets


    def test_quick_generate(self):
        global g_failure_count
        failure_count_before_test = g_failure_count

        #get the list boards
        w_choose_board = self.dict_main_widgets['choose_board']
        list_items = w_choose_board.get(0, END)
        if DEBUG: print list_items

        #select and quick generate the boards one by one
        boards_num = len(list_items)
        index = 0
        while (index < boards_num):
            #clear the selection
            if index > 0:
                w_choose_board.selection_clear(index - 1 )

            w_choose_board.selection_set(index)
            self.app.update()

            if w_choose_board.selection_get() in SKIP_LIST:
                self.record_failure('SKIP: ' + w_choose_board.selection_get() + ' may block the whole test!')
                index += 1
                continue

            new_project_name = PROJECT_PRE + w_choose_board.selection_get() + "_quick"
            new_project_name = self.append_prefix(new_project_name)

            print '-quick generate: --board:' + list_items[index] + " --project_name:" + new_project_name

            self.set_project_name(self.dict_main_widgets['project_name'], new_project_name)

            # need update the widget before the invoke
            self.prepare_main_ui_dict()
            self.dict_main_widgets['quick_generate'].invoke()
            self.app.update()

            self.wait_and_destroy_pop_gen()

            if AUTO_VERIFICATION:
                global SDK_PATH

                folder_root = os.path.join(SDK_PATH, os.path.join(get_quick_folder_root(), \
                                    os.path.join(dict_board_folder[list_items[index]], \
                                    os.path.join(TEMP_QUICK_FOLDER, new_project_name))))
                self.verify_quick_projects(list_items[index], folder_root)

            if QUICK_TEST: break    # only test one board in quick test

            index += 1

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, "test_quick_generate")


    def append_prefix(self, project_name):
        new_project_name = project_name

        global sdk_info
        if sdk_info.isNewVersion():
            new_project_name = SDK2x_PRE + project_name
        else:
            new_project_name = SDK1x_PRE + project_name

        return new_project_name


    def set_project_name(self, name_wdiget, new_name):
        name_wdiget.delete(0, END)
        name_wdiget.insert(0, new_name.rstrip())


    def wait_and_destroy_pop_gen(self):
        # Need patch to the ksdkGUI.py
        global g_failure_count

        timeout = 0
        while (None == self.app.pop_gen and timeout < TIME_OUT):
            print 'waiting until pop up gen window... '
            time.sleep(1)
            timeout = timeout + 1

        if DEBUG_SLOW: time.sleep(2)

        if timeout >= TIME_OUT:
            print "Time out in waiting gen window !!!!"
            g_failure_count = g_failure_count + 1

        if self.app.pop_gen != None:
            self.app.pop_gen.destroy()
            self.app.pop_gen = None


    def verify_quick_projects(self, platform_name, project_root):
        if DEBUG: print 'verify_quick_project: ' + platform_name + ', ' + project_root
        global sdk_info
        if sdk_info.isToolchainTypeSupported(ToolchainType.KinetisDesignStudio):
            self.verify_project_kds(platform_name, None, project_root)

        if 'Windows' == platform.system():
            if sdk_info.isToolchainTypeSupported(ToolchainType.IARname):
                self.verify_project_iar(platform_name, None, project_root)
            if sdk_info.isToolchainTypeSupported(ToolchainType.KeilMDK):
                self.verify_project_mdk(platform_name, None, project_root)
            if sdk_info.isToolchainTypeSupported(ToolchainType.AtollicStudio):
                self.verify_project_atl(platform_name, None, project_root)
            if sdk_info.isToolchainTypeSupported(ToolchainType.ARMgcc):
                self.verify_project_armgcc(platform_name, None, project_root)


        if sdk_info.isNewVersion():
            # For SDK 2.0, need check the files exist as following
            self.check_source_files(project_root, True)
            self.check_main_c_code(project_root, True)

    def verify_project_iar(self, name, parent_device, project_root):
        self.verify_project_file("iar", ".+\.ewp$", self.get_cpu_serach_key(name, parent_device), project_root)


    def verify_project_kds(self, name, parent_device, project_root):
        self.verify_project_file("kds", "\.cproject$", self.get_cpu_serach_key(name, parent_device), project_root)


    def verify_project_mdk(self, name, parent_device, project_root):
        self.verify_project_file("mdk", ".+\.uvprojx$", self.get_cpu_serach_key(name, parent_device), project_root)


    def verify_project_atl(self, name, parent_device, project_root):
        self.verify_project_file("atl", "\.cproject$", self.get_cpu_serach_key(name, parent_device), project_root)


    def verify_project_armgcc(self, name, parent_device, project_root):
        self.verify_project_file("armgcc", "CMakeLists.txt$", self.get_cpu_serach_key(name, parent_device), project_root)


    def get_cpu_serach_key(self, key, parent_key):
        if DEBUG: print 'Parent key: ' + parent_key + ', key: ' + key
        search_key = ''
        if parent_key != None: # it's device name, need parent key
            search_key = 'CPU_' + dict_device_cpu[parent_key][key]
        else: # it's board name
            search_key = 'CPU_' + dict_board_cpu[key]

        if DEBUG: print "search key: " + search_key

        return search_key


    def verify_project_file(self, toolchain, file_name_reg, search_key, folder_root):
        folder_root = os.path.join(folder_root, toolchain)
        folder_root = kT.string_replace(folder_root, '\\', '/')

        msg = "Didn't generate " + toolchain + " project folder: " + folder_root
        if os.path.exists(folder_root) != True: self.record_failure(msg)

        if ASSERT:
            self.assertEqual(os.path.exists(folder_root), True, msg)
        else:
            return

        is_found = False
        for item in os.listdir(folder_root):
            if DEBUG: print item
            if re.match(file_name_reg, item):
                is_found = True

                is_match_key = self.verify_file_content(os.path.join(folder_root, item), search_key)

                msg = "Wrong project file generated, the platform name does not match " \
                        + search_key + " in " + os.path.join(folder_root, item)
                if False == is_match_key: self.record_failure(msg)
                if ASSERT: self.assertNotEqual(is_match_key, False, msg)
                break

        msg = "Didn't find the project file in: " + folder_root
        if False == is_found: self.record_failure(msg)
        if ASSERT: self.assertNotEqual(is_found, False, msg)


    def verify_file_content(self, file_path, search_key):
        file_path = kT.string_replace(file_path, '\\', '/')

        if not os.path.exists(file_path): return False

        f = open(file_path)
        if DEBUG: print "file to search content: " + file_path + ", key: " + search_key
        content = f.readlines()
        f.close()

        is_match_key = False
        for line in content:
            #if DEBUG: print line
            if re.search(search_key, line):
                is_match_key = True
                break

        return is_match_key


    def check_source_files(self, root_folder_path, need_main_h):
        self.check_folder_file(need_main_h, 'main.h', root_folder_path)
        self.check_folder_file_exists('main.c', root_folder_path)
        self.check_folder_file_exists('board.c', root_folder_path)
        self.check_folder_file_exists('board.h', root_folder_path)
        self.check_folder_file_exists('pin_mux.c', root_folder_path)
        self.check_folder_file_exists('pin_mux.h', root_folder_path)
        self.check_folder_file_exists('clock_config.c', root_folder_path)
        self.check_folder_file_exists('clock_config.h', root_folder_path)


    def check_main_c_code(self, root_folder_path, is_quick_gen):
        main_c_path = os.path.join(root_folder_path, 'main.c')
        main_h_path = os.path.join(root_folder_path, 'main.h')
        #check #include header files
        if is_quick_gen:
            self.check_header_include_code(main_c_path, 'stdio.h')
            self.check_header_include_code(main_c_path, 'main.h')

            self.check_header_include_code(main_h_path, 'fsl_debug_console.h')
            self.check_header_include_code(main_h_path, 'board.h')
            self.check_header_include_code(main_h_path, 'pin_mux.h')
            self.check_header_include_code(main_h_path, 'clock_config.h')
        else:
            self.check_header_include_code(main_c_path, 'fsl_debug_console.h')
            self.check_header_include_code(main_c_path, 'board.h')
            self.check_header_include_code(main_c_path, 'pin_mux.h')
            self.check_header_include_code(main_c_path, 'clock_config.h')

        #check initial functions
        self.check_main_initial_func_code(main_c_path, 'BOARD_InitPins')
        self.check_main_initial_func_code(main_c_path, 'BOARD_BootClockRUN')
        self.check_main_initial_func_code(main_c_path, 'BOARD_InitDebugConsole')

    def check_header_include_code(self, file_path, header):
        search_key = '#include "'+ header + '"'
        if 'stdio.h' == header:
            search_key = '#include <'+ header + '>'
        is_match = self.verify_file_content(file_path, search_key)

        msg = "#include header file is not correct " + search_key + " in " + file_path
        if False == is_match: self.record_failure(msg)
        if ASSERT: self.assertNotEqual(is_match_key, False, msg)


    def check_main_initial_func_code(self, file_path, func):
        is_match = self.verify_file_content(file_path, func)

        msg = "initial function " + func + " is not present in " + file_path
        if False == is_match: self.record_failure(msg)
        if ASSERT: self.assertNotEqual(is_match_key, False, msg)

    def record_failure(self, msg):
        global g_failure_count
        global g_failure_file

        g_failure_count = g_failure_count + 1
        g_failure_file.write(str(g_failure_count) + ". " + msg + "\n")


    def test_advance_platform_boards_all_toolchains(self):
        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets['lib_config_platform'].invoke()
        self.app.update()

        self.new_all_toolchains(False, False)

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_platform_boards_all_toolchains")


    def test_advance_platform_device_all_toolchains(self):
        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_device'].invoke()
        self.dict_ad_widgets['lib_config_platform'].invoke()
        self.app.update()

        self.new_all_toolchains(True, False)

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_platform_device_all_toolchains")

    def test_advance_hal_boards_all_toolchains(self):
        global sdk_info
        if sdk_info.isNewVersion():
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets['lib_config_hal'].invoke()
        self.app.update()

        self.new_all_toolchains(False, True)

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_hal_boards_all_toolchains")


    def test_advance_hal_device_all_toolchains(self):
        global sdk_info
        if sdk_info.isNewVersion():
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_device'].invoke()
        self.dict_ad_widgets['lib_config_hal'].invoke()
        self.app.update()

        self.new_all_toolchains(True, True)

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
            "test_advance_hal_device_all_toolchains")


    def new_all_toolchains(self, is_device_part_number, is_hal_only):
        self.prepare_advance_ui_dict()
        w_device_or_board = self.dict_ad_widgets['device_or_board_list']
        boards_list =  w_device_or_board['values']
        if DEBUG: print boards_list

        global sdk_info
        #select all toolchains and bsp
        if sdk_info.isToolchainTypeSupported(ToolchainType.KinetisDesignStudio):
            self.dict_ad_widgets['tool_kds'].invoke()
        if sdk_info.isToolchainTypeSupported(ToolchainType.IARname):
            self.dict_ad_widgets['tool_iar'].invoke()
        if sdk_info.isToolchainTypeSupported(ToolchainType.KeilMDK):
            self.dict_ad_widgets['tool_mdk'].invoke()
        if sdk_info.isToolchainTypeSupported(ToolchainType.AtollicStudio):
            self.dict_ad_widgets['tool_atl'].invoke()
        #self.dict_ad_widgets['tool_gcc'].invoke()
        self.app.update()

        hal_name_pre = ''
        if is_hal_only:
            hal_name_pre = 'hal_'

        rtos_support_list = self.get_rtos_support_list()

        #loop boards
        board_index = 0
        boards_num = len(boards_list)
        while (board_index < boards_num):
            if DEBUG: print 'board index is : %d', board_index
            w_device_or_board.current(newindex=board_index)

            if w_device_or_board.get() in SKIP_LIST:
                self.record_failure('SKIP: ' + w_device_or_board.get() + ' may block the whole test!')
                board_index += 1
                continue

            #loop standalone
            for include_standalone in range(0, 2):
                standalone_name = self.update_checkbox('standalone', include_standalone, '_st_')

                # need reset the device or board selection after changing the rtos setting
                w_device_or_board.current(newindex=board_index)
                self.app.update()

                #loop rtos
                for os_name in rtos_support_list:
                    self.dict_ad_widgets[os_name].invoke()
                    self.app.update()

                    # need reset the device or board selection after changing the rtos setting
                    w_device_or_board.current(newindex=board_index)
                    self.app.update()

                    #some SoCs don't support RTOS, skip to generate the projects
                    if os_name != 'lib_rtos_none' and w_device_or_board.get() in RTOS_NOT_AVAIBLE_LIST:
                        continue

                    if sdk_info.isNewVersion():
                        bsp_loop_count = 1 # V2 release doesn't support BSP
                    else:
                        if False == is_hal_only and 'lib_rtos_none' == os_name:
                            bsp_loop_count = 2
                        else:
                            bsp_loop_count = 1

                    #loop bsp
                    for include_bsp in range(0, bsp_loop_count):
                        bsp_name = self.update_checkbox('include_bsp', include_bsp, '_bsp_')

                        # mux the project_name
                        project_name = PROJECT_PRE + hal_name_pre
                        if is_device_part_number:
                            # to reduce project name length, there is limitation of KDS path length
                            project_name = project_name + '_' + standalone_name + bsp_name + os_name
                        else:
                            project_name = project_name + w_device_or_board.get() \
                                            + '_' + standalone_name + bsp_name + os_name

                        project_name = self.append_prefix(project_name)

                        if is_device_part_number:
                            device_family = boards_list[board_index]
                            for part_num in dict_device_cpu[device_family]:
                                self.execute_generate_and_verify(part_num, project_name + '_' + part_num, \
                                    is_device_part_number, is_hal_only, include_standalone, \
                                    include_bsp, os_name, part_num, 0, device_family) # index is only 0 for part number
                        else:
                            self.execute_generate_and_verify(None, project_name, is_device_part_number, \
                                is_hal_only, include_standalone, include_bsp, os_name, boards_list[board_index], board_index, None)

                    # RTOS does not support hal lib
                    if is_hal_only or is_device_part_number:
                        break   # break the rtos loop

            if QUICK_TEST: break    # only test one board in quick test

            board_index = board_index + 1

    def execute_generate_and_verify(self, part_num, project_name, is_device_part_number, \
                                    is_hal_only, include_standalone, include_bsp, os_name, verify_name, index, parent_key):
        self.set_project_name(self.dict_ad_widgets['project_name'], project_name)
        print '-advance generate: ---project_name:' + project_name

        # need update the widget before the invoke
        self.prepare_advance_ui_dict()
        self.dict_ad_widgets['advance_generate'].invoke()
        self.app.update()

        if is_device_part_number:
            self.wait_and_start_advance_package_gen(part_num)

        self.wait_and_destroy_pop_gen()

        if AUTO_VERIFICATION:
            self.verify_adv_projects(is_hal_only, include_standalone, include_bsp, os_name, \
                                    verify_name, parent_key, self.get_advance_projects_root_folder(project_name, index, parent_key))

    def get_advance_projects_root_folder(self, project_name, index, parent_key):
        global SDK_PATH

        user_board = self.app.localSDK.brdList[index]
        if parent_key != None: # it's device chip, use manifest first evaluation_board
            global evaluation_board_name
            # fix bug that the key is not found exception
            if dict_board_folder.has_key(evaluation_board_name): user_board = evaluation_board_name

        board_folder_name = dict_board_folder[user_board]

        folder_root = os.path.join(os.path.join(os.path.join(os.path.join(\
                        SDK_PATH, get_quick_folder_root()), board_folder_name), TEMP_QUICK_FOLDER), project_name)

        return kT.string_replace(folder_root, '\\', '/')


    def get_rtos_support_list(self):
        rtos_support_list = ['lib_rtos_none']

        global sdk_info

        if sdk_info.isMQXSupported():
            rtos_support_list.append('lib_rtos_mqx')
        if sdk_info.isFreeRTOSSupported():
            rtos_support_list.append('lib_rtos_freertos')
        if sdk_info.isuCOSIISupported():
            rtos_support_list.append('lib_rtos_ucosii')
        if sdk_info.isuCOSIIISupported():
            rtos_support_list.append('lib_rtos_ucosiii')
        return rtos_support_list


    def update_checkbox(self, checkbox_name, select, intial_name):
        default_name = ''
        if select:
            default_name = intial_name
            if len(self.dict_ad_widgets[checkbox_name].state()) <= 0:
                self.dict_ad_widgets[checkbox_name].invoke()
        else:
            if len(self.dict_ad_widgets[checkbox_name].state()) > 0:
                self.dict_ad_widgets[checkbox_name].invoke()

        self.app.update()

        return default_name


    def wait_and_start_advance_package_gen(self, part_num):
        # Need patch to the ksdkGUI.py
        global g_failure_count

        timeout = 0
        while (None == self.app.pop_package and timeout < TIME_OUT):
            # wait until pop package window is ready
            print 'waiting until pop up package window...'
            time.sleep(1)
            timeout = timeout + 1

        if DEBUG_SLOW: time.sleep(2)

        if timeout >= TIME_OUT:
            print "Time out in waiting package window !!!!"
            g_failure_count = g_failure_count + 1

            if self.app.pop_package != None:
                self.app.pop_package.destroy()
                self.app.pop_package = None
        elif self.app.pop_package != None:
            self.update_package(part_num)

            # it will destroy pop_package window
            self.app.begin_advanced_gen(self.app, self.app.pop_package)
            self.app.update()
            self.app.pop_package = None


    def update_package(self, part_num):
        """ Update project device package
        """

        temp = (self.app.newProj.device[0],\
                self.app.newProj.device[1],\
                part_num,\
                self.app.newProj.device[3],\
                self.app.newProj.device[4])

        del self.app.newProj.device

        self.app.newProj.device = temp

        kT.debug_log(self.app.newProj.device)

        del temp


    def verify_adv_projects(self, is_hal_only, include_standalone, include_bsp, os_name, \
                            board_or_device, parent_key, project_root):
        global sdk_info

        if 'Windows' == platform.system() and sdk_info.isNewVersion() != True:
            if is_hal_only:
                # only iar and keil has lib link
                self.verify_project_file("iar", ".+\.eww$", "ksdk_hal_lib", project_root)
                self.verify_project_file("mdk", ".+\.uvprojx$", "ksdk_hal_lib", project_root)
            else:
                # platform link
                self.verify_project_file("iar", ".+\.eww$", dict_os_lib[os_name], project_root)
                self.verify_project_file("mdk", ".+\.uvprojx$", dict_os_lib[os_name], project_root)

        # check the standalone
        self.verify_standalone(is_hal_only, include_standalone, os_name, project_root)

        if sdk_info.isNewVersion() != True:
            # check the bsp, the RTOS includes the bsp file by default
            if 'lib_rtos_mqx' == os_name or 'lib_rtos_freertos' == os_name \
                or 'lib_rtos_ucosii' == os_name or 'lib_rtos_ucosiii' == os_name or include_bsp:
                self.check_folder_file_exists('board', project_root)
            else:
                self.check_folder_file_not_exists('board', project_root)

        if sdk_info.isToolchainTypeSupported(ToolchainType.KinetisDesignStudio):
            self.verify_project_kds(board_or_device, parent_key, project_root)
        if 'Windows' == platform.system():
            # don't verify armgcc so far, because it does not support
            if sdk_info.isToolchainTypeSupported(ToolchainType.IARname):
                self.verify_project_iar(board_or_device, parent_key, project_root)
            if sdk_info.isToolchainTypeSupported(ToolchainType.KeilMDK):
                self.verify_project_mdk(board_or_device, parent_key, project_root)
            if sdk_info.isToolchainTypeSupported(ToolchainType.AtollicStudio):
                self.verify_project_atl(board_or_device, parent_key, project_root)

        if sdk_info.isNewVersion():
            # For SDK 2.0, need check the files exist as following
            self.check_source_files(project_root, False)
            self.check_main_c_code(project_root, False)


    def check_folder_file_exists(self, folder_file, root_folder_path):
        self.check_folder_file(True, folder_file, root_folder_path)

    def check_folder_file_not_exists(self, folder_file, root_folder_path):
        self.check_folder_file(False, folder_file, root_folder_path)

    def check_folder_file(self, exist, folder_file, root_folder_path):
        if exist:
            msg = folder_file + ' does not include in ' + root_folder_path
        else:
            msg = folder_file + ' should not be included in ' + root_folder_path

        if os.path.exists(os.path.join(root_folder_path, folder_file)) != exist:
            self.record_failure(msg)

        if ASSERT:
            self.assertEqual(os.path.exists(os.path.join(root_folder_path, folder_file)), exist, msg)


    def verify_standalone(self, is_hal_only, include_standalone, os_name, folder_root):
        # check the standalone
        global sdk_info
        if include_standalone:
            # check standalone folders required
            if sdk_info.isNewVersion(): # SDK 2.0
                self.check_folder_file_exists('CMSIS', folder_root)
                self.check_folder_file_exists('devices', folder_root)
                if os_name != 'lib_rtos_none':
                    self.check_folder_file_exists('rtos', folder_root)
                    # disable boards folder checking in RC2
                    #self.check_folder_file_exists('boards', folder_root)
            else:
                self.check_folder_file_exists('platform', folder_root)


            # check lib links, only for SDK 1.3
            if sdk_info.isNewVersion() != True:
                self.check_folder_file_exists('lib', folder_root)

                is_found_lib = False
                for dir_name in os.listdir(os.path.join(folder_root, 'lib')):
                    if is_hal_only:
                        if 'ksdk_hal_lib' == dir_name:
                            is_found_lib = True
                            break
                    else:
                        if dict_os_lib[os_name] == dir_name:
                            is_found_lib = True
                            break
                msg = "correct lib should be included in " + os.path.join(folder_root, 'lib')
                if is_found_lib != True: self.record_failure(msg)
                if ASSERT: self.assertEqual(is_found_lib, True, msg)

        else: # not select standalone option
            if sdk_info.isNewVersion():
                self.check_folder_file_not_exists('CMSIS', folder_root)
                self.check_folder_file_not_exists('devices', folder_root)
                self.check_folder_file_not_exists('rtos', folder_root)
                self.check_folder_file_not_exists('boards', folder_root)
            else:
                self.check_folder_file_not_exists('lib', folder_root)
                self.check_folder_file_not_exists('platform', folder_root)


    def test_advance_singal_toolchain_kds(self):
        global sdk_info
        if sdk_info.isToolchainTypeSupported(ToolchainType.KinetisDesignStudio) != True:
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()
        self.new_singal_toolchain('tool_kds')

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_singal_toolchain_kds")


    def test_advance_singal_toolchain_iar(self):
        global sdk_info
        if sdk_info.isToolchainTypeSupported(ToolchainType.IARname) != True:
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        if 'Windows' == platform.system():
            #launch the advance ui
            self.app.advanced_gui(self.root)
            self.prepare_advance_ui_dict()
            self.new_singal_toolchain('tool_iar')

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_singal_toolchain_iar")


    def test_advance_singal_toolchain_atl(self):
        global sdk_info
        if sdk_info.isToolchainTypeSupported(ToolchainType.AtollicStudio) != True:
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        if 'Windows' == platform.system():
            #launch the advance ui
            self.app.advanced_gui(self.root)
            self.prepare_advance_ui_dict()
            self.new_singal_toolchain('tool_atl')

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_singal_toolchain_atl")


    def test_advance_singal_toolchain_mdk(self):
        global sdk_info
        if sdk_info.isToolchainTypeSupported(ToolchainType.KeilMDK) != True:
            self.skipTest('unsupported')

        global g_failure_count
        failure_count_before_test = g_failure_count

        if 'Windows' == platform.system():
            #launch the advance ui
            self.app.advanced_gui(self.root)
            self.prepare_advance_ui_dict()
            self.new_singal_toolchain('tool_mdk')

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, \
                        "test_advance_singal_toolchain_mdk")


    def new_singal_toolchain(self, toolchain):

        # only check one board
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets[toolchain].invoke()
        self.app.update()

        rtos_support_list = self.get_rtos_support_list()

        #loop standalone
        for include_standalone in range(0, 2):
            standalone_name = self.update_checkbox('standalone', include_standalone, '_st_')

            # loop os
            for os_name in rtos_support_list:
                self.dict_ad_widgets[os_name].invoke()
                self.app.update()

                name = self.dict_ad_widgets['device_or_board_list'].get()
                project_name = PROJECT_PRE  + toolchain + '_' + name + '_' + standalone_name + os_name
                project_name = self.append_prefix(project_name)

                self.set_project_name(self.dict_ad_widgets['project_name'], project_name)

                # need update the widget before the invoke
                self.prepare_advance_ui_dict()
                self.dict_ad_widgets['advance_generate'].invoke()
                self.app.update()

                self.wait_and_destroy_pop_gen()

                if AUTO_VERIFICATION:
                    self.verify_singal_toolchain_projects(include_standalone, os_name, toolchain, \
                                                          name, self.get_advance_projects_root_folder(project_name, 0, None))


    def verify_singal_toolchain_projects(self, include_standalone, os_name, toolchain, name, folder_root):
        self.verify_standalone(False, include_standalone, os_name, folder_root)

        self.check_toolchain('kds', folder_root, toolchain)
        if 'Windows' == platform.system():
            self.check_toolchain('iar', folder_root, toolchain)
            self.check_toolchain('mdk', folder_root, toolchain)
            self.check_toolchain('atl', folder_root, toolchain)

            if 'tool_iar' == toolchain:
                self.verify_project_iar(name, None, folder_root)

            if 'tool_mdk' == toolchain:
                self.verify_project_mdk(name, None, folder_root)

            if 'tool_atl' == toolchain:
                self.verify_project_atl(name, None, folder_root)

        if 'tool_kds' == toolchain:
            self.verify_project_kds(name, None, folder_root)


        if sdk_info.isNewVersion():
            # For SDK 2.0, need check the files exist as following
            self.check_source_files(folder_root, False)
            self.check_main_c_code(folder_root, False)


    def check_toolchain(self, tool_chain_name, folder_root, toolchain):
        exist = (('tool_'+ tool_chain_name) == toolchain)
        if os.path.exists(os.path.join(folder_root, tool_chain_name)) != exist:
            if True == exist:
                self.record_failure('should include ' + tool_chain_name + " in the folder: " + folder_root)
            else:
                self.record_failure('should not include ' + tool_chain_name + " in the folder: " + folder_root)

        if ASSERT: self.assertEqual(os.path.exists(os.path.join(folder_root, tool_chain_name)), exist)


    def test_advance_clone(self):
        global g_failure_count
        failure_count_before_test = g_failure_count

        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_clone'].invoke()
        self.app.update()

        w_demos = self.app.widgetList[36]
        demo_list = w_demos['values']
        if DEBUG: print demo_list

        #loop boards
        demo_index = 0
        demo_num = len(demo_list)
        while (demo_index < demo_num):
            if DEBUG: print 'demo index is : %d', demo_index
            w_demos.current(newindex=demo_index)
            self.app.update()

            #loop standalone
            # change loop to 1, disable "Generate standalone option" when the project is cloned in RC2
            for include_standalone in range(0, 1):
                self.update_checkbox('standalone', include_standalone, '_st_')
                self.app.update()

                if DEBUG_SLOW: time.sleep(1)

                # need update the widget before the invoke
                self.prepare_advance_ui_dict()
                self.dict_ad_widgets['advance_generate'].invoke()
                self.app.update()

                self.wait_and_destroy_pop_gen()

            if QUICK_TEST: break    # only test one board in quick test

            demo_index += 1

        failure_count_after_test = g_failure_count
        self.assertEqual(failure_count_before_test, failure_count_after_test, "test_quick_generate")
Beispiel #3
0
    def setUp(self):
        """ Main file for KSDK Project Generator
        .. todo::
          test on Linux, OSX
        .. todo::
        go over comments for documentation; params, etc...
        """

        osName = platform.system()
        root = Tk()                                                # Call Tkinter object 'root'
        s = Style()

        # Set ttk style for the OS
        if osName == 'Linux':
            s.theme_use('alt')
        elif osName == 'Windows':
            s.theme_use('vista')
        elif osName == 'Darwin':
            s.theme_use('aqua')

        if osName == 'Windows':                                     # Check if running on Windows
            try:
                root.iconbitmap(default='./kds_icon.ico')           # Use the .ico file if in Windows
            except TclError:
                root.iconbitmap(default=None)
        elif osName == 'Linux':
            img = Image("photo", data=kImg.boardImages['kds_icon.gif']) # Use the .gif file if in Linux
            root.tk.call('wm', 'iconphoto', root._w, img)

        root.title(PGKSDK_NAME + ' -- ' + PGKSDK_VERSION)   # Set title of Tkinter window

        if osName == 'Darwin':
            root.configure(background='#E7E7E7')

        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        if osName == 'Windows':

            key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics")
            value = _winreg.QueryValueEx(key, "AppliedDPI")[0]

            print "DPI value: " + str(value)

            if value == 96:
                kGUI.WIN_SCALE = 1.0
            elif value == 120:
                kGUI.WIN_SCALE = 1.25
            elif value == 144:
                kGUI.WIN_SCALE = 1.5
            elif value == 192:
                kGUI.WIN_SCALE = 2.0
            else:
                kGUI.WIN_SCALE = value / 96.0

            print "DPI scale: " + str(kGUI.WIN_SCALE)

            windowWidth = (570 * kGUI.WIN_SCALE)
            windowHeight = (420 * kGUI.WIN_SCALE)

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        elif osName == 'Linux':

            windowWidth = 605
            windowHeight = 420

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        else:

            windowWidth = 620
            windowHeight = 480

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))

        root.resizable(width=FALSE, height=FALSE)
        self.root = root
        self.app = PgGui(master=root)

        self.app.localSDK.path = SDK_PATH # we have force to set the path because of script issue

        #fix the sdk path not effect issue
        self.app.pop_main_boards()

        #first step is to launch the main ui
        self.prepare_main_ui_dict()

        #set SDK root path
        w_ksdk_path = self.dict_main_widgets['ksdk_path']
        w_ksdk_path.delete(0, END)
        w_ksdk_path.insert(0, SDK_PATH)
Beispiel #4
0
def main(argv):
    """ Main file for KSDK Project Generator

    .. todo::

        test on Linux, OSX

    .. todo::

        go over comments for documentation; params, etc...

    """

    osName = platform.system()
    root = Tk()                                                # Call Tkinter object 'root'
    s = Style()

    #tkMessageBox.showinfo("Error", 'Path: ' + os.getcwd())
        
    # Set ttk style for the OS
    if osName == 'Linux':
        themeName = 'alt'
    elif osName == 'Windows':
        themeName = 'vista'
    elif osName == 'Darwin':
        themeName = 'aqua'
        
    themeNames = s.theme_names()
    if themeNames.count(themeName) == 1:
        s.theme_use(themeName)
    elif len(themeNames) > 0:
        s.theme_use(themeNames[0])

    if osName == 'Windows':                                     # Check if running on Windows
        try:
            root.iconbitmap(default='./kds_icon.ico')           # Use the .ico file if in Windows
        except TclError:
            root.iconbitmap(default=None)
    elif osName == 'Linux':
        img = Image("photo", data=kImg.boardImages['kds_icon.gif']) # Use the .gif file if in Linux
        root.tk.call('wm', 'iconphoto', root._w, img)

    root.title(PGKSDK_NAME + ' -- ' + PGKSDK_VERSION)   # Set title of Tkinter window

    if osName == 'Darwin':
        root.configure(background='#E7E7E7')

    screenWidth = root.winfo_screenwidth()
    screenHeight = root.winfo_screenheight()

    if osName == 'Windows':

        key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics")
        value = _winreg.QueryValueEx(key, "AppliedDPI")[0]

        #print "DPI value: " + str(value)

        if value == 96:
            kGUI.WIN_SCALE = 1.0
        elif value == 120:
            kGUI.WIN_SCALE = 1.25
        elif value == 144:
            kGUI.WIN_SCALE = 1.5
        elif value == 192:
            kGUI.WIN_SCALE = 2.0
        else:
            kGUI.WIN_SCALE = value / 96.0

        #print "DPI scale: " + str(kGUI.WIN_SCALE)

        
        windowWidth = (570 * kGUI.WIN_SCALE)
        windowHeight = (450 * kGUI.WIN_SCALE)

        # Get x & y location for centering the window
        xLocation = screenWidth / 2 - windowWidth / 2
        yLocation = screenHeight / 2 - windowHeight / 2

        root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
    elif osName == 'Linux':

        windowWidth = 605
        windowHeight = 420

        # Get x & y location for centering the window
        xLocation = screenWidth / 2 - windowWidth / 2
        yLocation = screenHeight / 2 - windowHeight / 2

        root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
    else:

        #print "Mac Version"

        macVer = platform.mac_ver()[0]

        #print macVer[:5]

        if macVer[:5] == '10.10':
            windowWidth = 620
            windowHeight = 480
        elif macVer[:5] == '10.11':
            windowWidth = 680
            windowHeight = 480            

        # Get x & y location for centering the window
        xLocation = screenWidth / 2 - windowWidth / 2
        yLocation = screenHeight / 2 - windowHeight / 2

        root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))

    root.resizable(width=FALSE, height=FALSE)
    gui = PgGui(master=root)
    gui.mainloop()

    try:
        root.destroy()                                          # Destroy the Tkinter object 'root'
    except TclError:
        sys.exit()
Beispiel #5
0
class TestChooseBoard(unittest.TestCase):
    def setUp(self):
        """ Main file for KSDK Project Generator
        .. todo::
          test on Linux, OSX
        .. todo::
        go over comments for documentation; params, etc...
        """

        osName = platform.system()
        root = Tk()                                                # Call Tkinter object 'root'
        s = Style()

        # Set ttk style for the OS
        if osName == 'Linux':
            s.theme_use('alt')
        elif osName == 'Windows':
            s.theme_use('vista')
        elif osName == 'Darwin':
            s.theme_use('aqua')

        if osName == 'Windows':                                     # Check if running on Windows
            try:
                root.iconbitmap(default='./kds_icon.ico')           # Use the .ico file if in Windows
            except TclError:
                root.iconbitmap(default=None)
        elif osName == 'Linux':
            img = Image("photo", data=kImg.boardImages['kds_icon.gif']) # Use the .gif file if in Linux
            root.tk.call('wm', 'iconphoto', root._w, img)

        root.title(PGKSDK_NAME + ' -- ' + PGKSDK_VERSION)   # Set title of Tkinter window

        if osName == 'Darwin':
            root.configure(background='#E7E7E7')

        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        if osName == 'Windows':

            key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\\Desktop\\WindowMetrics")
            value = _winreg.QueryValueEx(key, "AppliedDPI")[0]

            print "DPI value: " + str(value)

            if value == 96:
                kGUI.WIN_SCALE = 1.0
            elif value == 120:
                kGUI.WIN_SCALE = 1.25
            elif value == 144:
                kGUI.WIN_SCALE = 1.5
            elif value == 192:
                kGUI.WIN_SCALE = 2.0
            else:
                kGUI.WIN_SCALE = value / 96.0

            print "DPI scale: " + str(kGUI.WIN_SCALE)

            windowWidth = (570 * kGUI.WIN_SCALE)
            windowHeight = (420 * kGUI.WIN_SCALE)

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        elif osName == 'Linux':

            windowWidth = 605
            windowHeight = 420

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))
        else:

            windowWidth = 620
            windowHeight = 480

            # Get x & y location for centering the window
            xLocation = screenWidth / 2 - windowWidth / 2
            yLocation = screenHeight / 2 - windowHeight / 2

            root.geometry('%dx%d+%d+%d' % (windowWidth, windowHeight, xLocation, yLocation))

        root.resizable(width=FALSE, height=FALSE)
        self.root = root
        self.app = PgGui(master=root)

        self.app.localSDK.path = SDK_PATH # we have force to set the path because of script issue

        #fix the sdk path not effect issue
        self.app.pop_main_boards()

        #first step is to launch the main ui
        self.prepare_main_ui_dict()

        #set SDK root path
        w_ksdk_path = self.dict_main_widgets['ksdk_path']
        w_ksdk_path.delete(0, END)
        w_ksdk_path.insert(0, SDK_PATH)


    def tearDown(self):
        #need destroy the window, otherwise the next case cannot setUp successfully
        if DEBUG: print 'tearDown, destroy the window successfully'
        self.root.destroy()


    def prepare_main_ui_dict(self):
        if DEBUG: print 'prepare_main_ui_dict'

        main_widigets = {'ksdk_path'        : self.app.widgetList[1],
                         'project_name'     : self.app.widgetList[4],
                         'choose_board'     : self.app.widgetList[6],
                         'advanced'         : self.app.widgetList[11],
                         'quick_generate'   : self.app.widgetList[10],
                         }
        self.dict_main_widgets = main_widigets


    def prepare_advance_ui_dict(self):
        if DEBUG: print "prepare_advance_ui_dict"

        ad_widgets = {'project_name'        : self.app.widgetList[3],
                      'device_or_board_list': self.app.widgetList[8],
                      'project_type_new'    : self.app.widgetList[5], #0
                      'project_type_clone'  : self.app.widgetList[6], #1
                      'lib_config_platform' : self.app.widgetList[11], #1
                      'lib_config_hal'      : self.app.widgetList[10], #0
                      'lib_rtos_none'       : self.app.widgetList[13], #0
                      'lib_rtos_mqx'        : self.app.widgetList[14], #1
                      'lib_rtos_freertos'   : self.app.widgetList[15], #2
                      'lib_rtos_ucosii'     : self.app.widgetList[16], #3
                      'lib_rtos_ucosiii'    : self.app.widgetList[17], #4
                      'choose_device'       : self.app.widgetList[35], #0
                      'choose_board'        : self.app.widgetList[36], #1
                      'tool_kds'            : self.app.widgetList[19],
                      'tool_iar'            : self.app.widgetList[20],
                      'tool_mdk'            : self.app.widgetList[21],
                      'tool_atl'            : self.app.widgetList[22],
                      #'tool_gcc'            : self.app.widgetList[23], #remove by default
                      'include_bsp'         : self.app.widgetList[25],
                      'parent_folder'       : self.app.widgetList[27],
                      'standalone'          : self.app.widgetList[29],
                      'advance_generate'    : self.app.widgetList[31],
                     }

        self.dict_ad_widgets = ad_widgets


    def test_quick_generate(self):
        #get the list boards
        w_choose_board = self.dict_main_widgets['choose_board']
        list_items = w_choose_board.get(0, END)
        if DEBUG: print list_items

        #select and quick generate the boards one by one
        boards_num = len(list_items)
        index = 0
        while (index < boards_num):
            #clear the selection
            if index > 0:
                w_choose_board.selection_clear(index - 1 )

            w_choose_board.selection_set(index)
            self.app.update()

            new_project_name = PROJECT_PRE + w_choose_board.selection_get() + "_quick"
            print '-quick generate: --board:' + list_items[index] + " --project_name:" + new_project_name

            self.set_project_name(self.dict_main_widgets['project_name'], new_project_name)

            # need update the widget before the invoke
            self.prepare_main_ui_dict()
            self.dict_main_widgets['quick_generate'].invoke()
            self.app.update()

            self.wait_and_destroy_pop_gen()

            if AUTO_VERIFICATION:
                folder_root = SDK_PATH + '\\examples\\' + self.lowercase_removeothers(list_items[index]) + '\\user_apps\\' + new_project_name
                self.verify_quick_projects(list_items[index], folder_root)

            if QUICK_TEST: break    # only test one board in quick test

            index += 1


    def set_project_name(self, name_wdiget, new_name):
        name_wdiget.delete(0, END)
        name_wdiget.insert(0, new_name.rstrip())


    def wait_and_destroy_pop_gen(self):
        # Need patch to the ksdkGUI.py
        timeout = 0
        while (None == self.app.pop_gen and timeout < TIME_OUT):
            print 'waiting until pop up gen window... '
            time.sleep(1)
            timeout = timeout + 1

        if DEBUG_SLOW: time.sleep(2)
        if self.app.pop_gen != None:
            self.app.pop_gen.destroy()
            self.app.pop_gen = None
        else:
            print "Time out in waiting gen window !!!!"


    def lowercase_removeothers(self, platform_name):
        platform_path_name = platform_name.replace('-', '').rstrip().lower()
        if DEBUG: print 'lowercase_removeothers: ' + platform_name + ' --- ' + platform_path_name
        return platform_path_name


    def verify_quick_projects(self, platform_name, project_root):
        if DEBUG: print 'verify_quick_project: ' + platform_name + ', ' + project_root
        self.verify_project_iar(platform_name, project_root)
        self.verify_project_kds(platform_name, project_root)
        self.verify_project_mdk(platform_name, project_root)
        self.verify_project_atl(platform_name, project_root)
        #self.verify_project_armgcc(platform_name, project_root)


    def verify_project_iar(self, name, project_root):
        self.verify_project_file("iar", ".+\.ewp$", self.get_cpu_serach_key(name), project_root)


    def verify_project_kds(self, name, project_root):
        self.verify_project_file("kds", "\.cproject$", self.get_cpu_serach_key(name), project_root)


    def verify_project_mdk(self, name, project_root):
        self.verify_project_file("mdk", ".+\.uvprojx$", self.get_cpu_serach_key(name), project_root)


    def verify_project_atl(self, name, project_root):
        self.verify_project_file("atl", "\.cproject$", self.get_cpu_serach_key(name), project_root)


    def verify_project_armgcc(self, name, project_root):
        self.verify_project_file("armgcc", "CMakeLists.txt$", self.get_cpu_serach_key(name), project_root)


    def get_cpu_serach_key(self, name):
        search_key = ''
        if re.search('xxx', name): # it's device name
            search_key = 'CPU_' + dict_device_cpu[name]
        else: # it's board name
            search_key = 'CPU_' + dict_board_cpu[name]

        if DEBUG: print "search key: " + search_key

        return search_key


    def verify_project_file(self, toolchain, file_name_reg, search_key, folder_root):
        folder_root = folder_root + "\\" + toolchain + "\\"
        self.assertEqual(os.path.exists(folder_root), True, "Didn't generate " + toolchain + " project folder: " + folder_root)
        is_found = False
        for item in os.listdir(folder_root):
            if DEBUG: print item
            if re.match(file_name_reg, item):
                is_found = True
                project_file = open(os.path.join(folder_root, item))
                if DEBUG: print "project file: " + os.path.join(folder_root, item)
                content = project_file.readlines()
                project_file.close()

                is_match_key = False
                for line in content:
                    #if DEBUG: print line
                    if re.search(search_key, line):
                        is_match_key = True
                        break

                self.assertNotEqual(is_match_key, False, "Wrong project file generated, the platform name does not match " + search_key + " in " + os.path.join(folder_root, item))
                break

        self.assertNotEqual(is_found, False, "Didn't find the project file in: " + folder_root)


    def test_advance_platform_boards_all_toolchains(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets['lib_config_platform'].invoke()
        self.app.update()

        self.new_all_toolchains(False, False)


    def test_advance_platform_device_all_toolchains(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_device'].invoke()
        self.dict_ad_widgets['lib_config_platform'].invoke()
        self.app.update()

        self.new_all_toolchains(True, False)


    def test_advance_hal_boards_all_toolchains(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets['lib_config_hal'].invoke()
        self.app.update()

        self.new_all_toolchains(False, True)


    def test_advance_hal_device_all_toolchains(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_new'].invoke()
        self.dict_ad_widgets['choose_device'].invoke()
        self.dict_ad_widgets['lib_config_hal'].invoke()
        self.app.update()

        self.new_all_toolchains(True, True)


    def new_all_toolchains(self, addition_apply, hal_only):
        w_device_or_board = self.dict_ad_widgets['device_or_board_list']
        boards_list =  w_device_or_board['values']
        if DEBUG: print boards_list

        #select all toolchains and bsp
        self.dict_ad_widgets['tool_kds'].invoke()
        self.dict_ad_widgets['tool_iar'].invoke()
        self.dict_ad_widgets['tool_mdk'].invoke()
        self.dict_ad_widgets['tool_atl'].invoke()
        #self.dict_ad_widgets['tool_gcc'].invoke()
        self.app.update()

        hal_name_pre = ''
        if hal_only:
            hal_name_pre = 'hal_'

        #loop boards
        board_index = 0
        boards_num = len(boards_list)
        while (board_index < boards_num):
            if DEBUG: print 'board index is : %d', board_index
            w_device_or_board.current(newindex=board_index)

            #loop standalone
            for include_standalone in range(0, 2):
                standalone_name = self.update_checkbox('standalone', include_standalone, '_st_')

                # need reset the device or board selection after changing the rtos setting
                w_device_or_board.current(newindex=board_index)
                self.app.update()

                #loop rtos
                for os_name in ['lib_rtos_none', 'lib_rtos_mqx', 'lib_rtos_freertos', 'lib_rtos_ucosii', 'lib_rtos_ucosiii']:
                    self.dict_ad_widgets[os_name].invoke()
                    self.app.update()

                    # need reset the device or board selection after changing the rtos setting
                    w_device_or_board.current(newindex=board_index)
                    self.app.update()

                    #some SoCs don't support RTOS, skip to generate the projects
                    if os_name != 'lib_rtos_none' and w_device_or_board.get() in RTOS_NOT_AVAIBLE_LIST: continue

                    if False == hal_only and 'lib_rtos_none' == os_name:
                        bsp_loop_count = 2
                    else:
                        bsp_loop_count = 1

                    #loop bsp
                    for include_bsp in range(0, bsp_loop_count):
                        bsp_name = self.update_checkbox('include_bsp', include_bsp, '_bsp_')

                        # mux the project_name
                        project_name = PROJECT_PRE + hal_name_pre + w_device_or_board.get() + '_' + standalone_name + bsp_name + os_name
                        #update project name
                        self.set_project_name(self.dict_ad_widgets['project_name'], project_name)

                        print '-advance generate: ---board:' + boards_list[board_index] + '  ---project_name:' + project_name

                        # need update the widget before the invoke
                        self.prepare_advance_ui_dict()
                        self.dict_ad_widgets['advance_generate'].invoke()
                        self.app.update()

                        if addition_apply:
                            self.wait_and_destory_pop_package()

                        self.wait_and_destroy_pop_gen()

                        if AUTO_VERIFICATION:
                            folder_root = SDK_PATH + '\\user_projects\\' + project_name
                            self.verify_adv_projects(hal_only, include_standalone, include_bsp, os_name, boards_list[board_index], folder_root)

                    # RTOS does not support hal lib
                    if hal_only or addition_apply:
                        break   # break the rtos loop

            if QUICK_TEST: break    # only test one board in quick test

            board_index += 1

    def update_checkbox(self, checkbox_name, select, intial_name):
        default_name = ''
        if select:
            default_name = intial_name
            if len(self.dict_ad_widgets[checkbox_name].state()) <= 0:
                self.dict_ad_widgets[checkbox_name].invoke()
        else:
            if len(self.dict_ad_widgets[checkbox_name].state()) > 0:
                self.dict_ad_widgets[checkbox_name].invoke()

        self.app.update()

        return default_name


    def wait_and_destory_pop_package(self):
        # Need patch to the ksdkGUI.py
        timeout = 0
        while (None == self.app.pop_package and timeout < TIME_OUT):
            # wait until pop package window is ready
            print 'waiting until pop up package window ...'
            time.sleep(1)
            timeout = timeout + 1

        if DEBUG_SLOW: time.sleep(2)

        if None == self.app.pop_package:
            print "Time out in waiting pop up package window !!!"

        self.app.begin_advanced_gen(self.app, self.app.pop_package)
        self.app.update()
        self.app.pop_package = None

    def verify_adv_projects(self, hal_only, include_standalone, include_bsp, os_name, board_or_device, project_root):
        if hal_only:
            # only iar and keil has lib link
            self.verify_project_file("iar", ".+\.eww$", "ksdk_hal_lib", project_root)
            self.verify_project_file("mdk", ".+\.uvprojx$", "ksdk_hal_lib", project_root)
        else:
            # platform link
            self.verify_project_file("iar", ".+\.eww$", dict_os_lib[os_name], project_root)
            self.verify_project_file("mdk", ".+\.uvprojx$", dict_os_lib[os_name], project_root)

        # check the standalone
        self.verify_standalone(hal_only, include_standalone, os_name, project_root)

        # check the bsp, the RTOS includes the bsp file by default
        if 'lib_rtos_mqx' == os_name or 'lib_rtos_freertos' == os_name or 'lib_rtos_ucosii' == os_name or 'lib_rtos_ucosiii' == os_name or include_bsp:
            self.assertEqual(os.path.exists(os.path.join(project_root, 'board')), True, 'bsp folder does not include in ' + project_root)
        else:
            self.assertEqual(os.path.exists(os.path.join(project_root, 'board')), False, 'bsp folder should not include in ' + project_root)

        # don't verify armgcc so far, because it does not support
        self.verify_project_iar(board_or_device, project_root)
        self.verify_project_kds(board_or_device, project_root)
        self.verify_project_mdk(board_or_device, project_root)
        self.verify_project_atl(board_or_device, project_root)

    def verify_standalone(self, hal_only, include_standalone, os_name, folder_root):
        # check the standalone
        if include_standalone:
            self.assertEqual(os.path.exists(os.path.join(folder_root, 'lib')), True, 'lib does not include in ' + folder_root)
            self.assertEqual(os.path.exists(os.path.join(folder_root, 'platform')), True, 'platform does not include in ' + folder_root)

            is_found_lib = False
            for dir_name in os.listdir(os.path.join(folder_root, 'lib')):
                if hal_only:
                    if 'ksdk_hal_lib' == dir_name:
                        is_found_lib = True
                        break
                else:
                    if dict_os_lib[os_name] == dir_name:
                        is_found_lib = True
                        break
            self.assertEqual(is_found_lib, True)

        else:
            self.assertEqual(os.path.exists(os.path.join(folder_root, 'lib')), False, 'lib should not include in ' + folder_root)
            self.assertEqual(os.path.exists(os.path.join(folder_root, 'platform')), False, 'platform should not include in ' + folder_root)

    def test_advance_singal_toolchain_iar(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()
        self.new_singal_toolchain('tool_iar')


    def test_advance_singal_toolchain_kds(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()
        self.new_singal_toolchain('tool_kds')


    def test_advance_singal_toolchain_atl(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()
        self.new_singal_toolchain('tool_atl')


    def test_advance_singal_toolchain_mdk(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()
        self.new_singal_toolchain('tool_mdk')


    def new_singal_toolchain(self, toolchain):

        # only check one board
        self.dict_ad_widgets['choose_board'].invoke()
        self.dict_ad_widgets[toolchain].invoke()
        self.app.update()

        #loop standalone
        for include_standalone in range(0, 2):
            standalone_name = self.update_checkbox('standalone', include_standalone, '_st_')

            # loop os
            for os_name in ['lib_rtos_none', 'lib_rtos_mqx', 'lib_rtos_freertos', 'lib_rtos_ucosii', 'lib_rtos_ucosiii']:
                self.dict_ad_widgets[os_name].invoke()
                self.app.update()

                name = self.dict_ad_widgets['device_or_board_list'].get()
                project_name = PROJECT_PRE  + toolchain + '_' + name + '_' + standalone_name + os_name
                self.set_project_name(self.dict_ad_widgets['project_name'], project_name)

                # need update the widget before the invoke
                self.prepare_advance_ui_dict()
                self.dict_ad_widgets['advance_generate'].invoke()
                self.app.update()

                self.wait_and_destroy_pop_gen()

                if AUTO_VERIFICATION:
                    folder_root = SDK_PATH + '\\user_projects\\' + project_name
                    self.verify_singal_toolchain_projects(include_standalone, os_name, toolchain, name, folder_root)


    def verify_singal_toolchain_projects(self, include_standalone, os_name, toolchain, name, folder_root):
        self.verify_standalone(False, include_standalone, os_name, folder_root)

        self.assertEqual(os.path.exists(os.path.join(folder_root, 'iar')), 'tool_iar' == toolchain)
        self.assertEqual(os.path.exists(os.path.join(folder_root, 'mdk')), 'tool_mdk' == toolchain)
        self.assertEqual(os.path.exists(os.path.join(folder_root, 'atl')), 'tool_atl' == toolchain)
        self.assertEqual(os.path.exists(os.path.join(folder_root, 'kds')), 'tool_kds' == toolchain)

        if 'tool_iar' == toolchain:
            self.verify_project_iar(name, folder_root)

        if 'tool_mdk' == toolchain:
            self.verify_project_mdk(name, folder_root)

        if 'tool_atl' == toolchain:
            self.verify_project_atl(name, folder_root)

        if 'tool_kds' == toolchain:
            self.verify_project_kds(name, folder_root)


    def test_advance_clone(self):
        #launch the advance ui
        self.app.advanced_gui(self.root)
        self.prepare_advance_ui_dict()

        self.dict_ad_widgets['project_type_clone'].invoke()
        self.app.update()

        w_demos = self.app.widgetList[36]
        demo_list = w_demos['values']
        if DEBUG: print demo_list

        #loop boards
        demo_index = 0
        demo_num = len(demo_list)
        while (demo_index < demo_num):
            if DEBUG: print 'demo index is : %d', demo_index
            w_demos.current(newindex=demo_index)
            self.app.update()

            #loop standalone
            for include_standalone in range(0, 2):
                self.update_checkbox('standalone', include_standalone, '_st_')
                self.app.update()

                if DEBUG_SLOW: time.sleep(1)

                # need update the widget before the invoke
                self.prepare_advance_ui_dict()
                self.dict_ad_widgets['advance_generate'].invoke()
                self.app.update()

                self.wait_and_destroy_pop_gen()

            if QUICK_TEST: break    # only test one board in quick test

            demo_index += 1