PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 import os
demayer 0:6bf0743ece18 2 import json
demayer 0:6bf0743ece18 3 import sys
demayer 0:6bf0743ece18 4 import subprocess
demayer 0:6bf0743ece18 5 import logging
demayer 0:6bf0743ece18 6 import argparse
demayer 0:6bf0743ece18 7 from os.path import dirname, abspath, join
demayer 0:6bf0743ece18 8
demayer 0:6bf0743ece18 9 # Be sure that the tools directory is in the search path
demayer 0:6bf0743ece18 10 ROOT = abspath(join(dirname(__file__), "../.."))
demayer 0:6bf0743ece18 11 sys.path.insert(0, ROOT)
demayer 0:6bf0743ece18 12
demayer 0:6bf0743ece18 13 from tools.utils import run_cmd, delete_dir_files, mkdir, copy_file
demayer 0:6bf0743ece18 14
demayer 0:6bf0743ece18 15 def del_file(name):
demayer 0:6bf0743ece18 16 """ Delete the file in RTOS/CMSIS/features directory of mbed-os
demayer 0:6bf0743ece18 17 Args:
demayer 0:6bf0743ece18 18 name - name of the file
demayer 0:6bf0743ece18 19 """
demayer 0:6bf0743ece18 20 result = []
demayer 0:6bf0743ece18 21 search_path = [join(ROOT, 'rtos'), join(ROOT, 'cmsis'), join(ROOT, 'features')]
demayer 0:6bf0743ece18 22 for path in search_path:
demayer 0:6bf0743ece18 23 for root, dirs, files in os.walk(path):
demayer 0:6bf0743ece18 24 if name in files:
demayer 0:6bf0743ece18 25 result.append(os.path.join(root, name))
demayer 0:6bf0743ece18 26 for file in result:
demayer 0:6bf0743ece18 27 os.remove(file)
demayer 0:6bf0743ece18 28 rel_log.debug("Deleted: %s", os.path.relpath(file, ROOT))
demayer 0:6bf0743ece18 29
demayer 0:6bf0743ece18 30 def copy_folder(src, dest):
demayer 0:6bf0743ece18 31 """ Copy contents of folder in mbed-os listed path
demayer 0:6bf0743ece18 32 Args:
demayer 0:6bf0743ece18 33 src - src folder path
demayer 0:6bf0743ece18 34 dest - destination folder path
demayer 0:6bf0743ece18 35 """
demayer 0:6bf0743ece18 36 files = os.listdir(src)
demayer 0:6bf0743ece18 37 for file in files:
demayer 0:6bf0743ece18 38 abs_src_file = os.path.join(src, file)
demayer 0:6bf0743ece18 39 if os.path.isfile(abs_src_file):
demayer 0:6bf0743ece18 40 abs_dst_file = os.path.join(dest, file)
demayer 0:6bf0743ece18 41 mkdir(os.path.dirname(abs_dst_file))
demayer 0:6bf0743ece18 42 copy_file(abs_src_file, abs_dst_file)
demayer 0:6bf0743ece18 43
demayer 0:6bf0743ece18 44 def run_cmd_with_output(command, exit_on_failure=False):
demayer 0:6bf0743ece18 45 """ Passes a command to the system and returns a True/False result once the
demayer 0:6bf0743ece18 46 command has been executed, indicating success/failure. If the command was
demayer 0:6bf0743ece18 47 successful then the output from the command is returned to the caller.
demayer 0:6bf0743ece18 48 Commands are passed as a list of tokens.
demayer 0:6bf0743ece18 49 E.g. The command 'git remote -v' would be passed in as ['git', 'remote', '-v']
demayer 0:6bf0743ece18 50
demayer 0:6bf0743ece18 51 Args:
demayer 0:6bf0743ece18 52 command - system command as a list of tokens
demayer 0:6bf0743ece18 53 exit_on_failure - If True exit the program on failure (default = False)
demayer 0:6bf0743ece18 54
demayer 0:6bf0743ece18 55 Returns:
demayer 0:6bf0743ece18 56 result - True/False indicating the success/failure of the command
demayer 0:6bf0743ece18 57 output - The output of the command if it was successful, else empty string
demayer 0:6bf0743ece18 58 """
demayer 0:6bf0743ece18 59 rel_log.debug('[Exec] %s', ' '.join(command))
demayer 0:6bf0743ece18 60 returncode = 0
demayer 0:6bf0743ece18 61 output = ""
demayer 0:6bf0743ece18 62 try:
demayer 0:6bf0743ece18 63 output = subprocess.check_output(command, shell=True)
demayer 0:6bf0743ece18 64 except subprocess.CalledProcessError as e:
demayer 0:6bf0743ece18 65 returncode = e.returncode
demayer 0:6bf0743ece18 66
demayer 0:6bf0743ece18 67 if exit_on_failure:
demayer 0:6bf0743ece18 68 rel_log.error("The command %s failed with return code: %s",
demayer 0:6bf0743ece18 69 (' '.join(command)), returncode)
demayer 0:6bf0743ece18 70 sys.exit(1)
demayer 0:6bf0743ece18 71 return returncode, output
demayer 0:6bf0743ece18 72
demayer 0:6bf0743ece18 73 def get_curr_sha(repo_path):
demayer 0:6bf0743ece18 74 """ Gets the latest SHA for the specified repo
demayer 0:6bf0743ece18 75 Args:
demayer 0:6bf0743ece18 76 repo_path - path to the repository
demayer 0:6bf0743ece18 77
demayer 0:6bf0743ece18 78 Returns:
demayer 0:6bf0743ece18 79 sha - last commit SHA
demayer 0:6bf0743ece18 80 """
demayer 0:6bf0743ece18 81 cwd = os.getcwd()
demayer 0:6bf0743ece18 82 os.chdir(abspath(repo_path))
demayer 0:6bf0743ece18 83
demayer 0:6bf0743ece18 84 cmd = "git log --pretty=format:%h -n 1"
demayer 0:6bf0743ece18 85 _, sha = run_cmd_with_output(cmd, exit_on_failure=True)
demayer 0:6bf0743ece18 86
demayer 0:6bf0743ece18 87 os.chdir(cwd)
demayer 0:6bf0743ece18 88 return sha
demayer 0:6bf0743ece18 89
demayer 0:6bf0743ece18 90 def branch_exists(name):
demayer 0:6bf0743ece18 91 """ Check if branch already exists in mbed-os local repository.
demayer 0:6bf0743ece18 92 It will not verify if branch is present in remote repository.
demayer 0:6bf0743ece18 93 Args:
demayer 0:6bf0743ece18 94 name - branch name
demayer 0:6bf0743ece18 95 Returns:
demayer 0:6bf0743ece18 96 True - If branch is already present
demayer 0:6bf0743ece18 97 """
demayer 0:6bf0743ece18 98
demayer 0:6bf0743ece18 99 cmd = "git branch"
demayer 0:6bf0743ece18 100 _, output = run_cmd_with_output(cmd, exit_on_failure=False)
demayer 0:6bf0743ece18 101 if name in output:
demayer 0:6bf0743ece18 102 return True
demayer 0:6bf0743ece18 103 return False
demayer 0:6bf0743ece18 104
demayer 0:6bf0743ece18 105 def branch_checkout(name):
demayer 0:6bf0743ece18 106 """
demayer 0:6bf0743ece18 107 Checkout the required branch
demayer 0:6bf0743ece18 108 Args:
demayer 0:6bf0743ece18 109 name - branch name
demayer 0:6bf0743ece18 110 """
demayer 0:6bf0743ece18 111 cmd = "git checkout " + name
demayer 0:6bf0743ece18 112 run_cmd_with_output(cmd, exit_on_failure=False)
demayer 0:6bf0743ece18 113
demayer 0:6bf0743ece18 114 def get_last_cherry_pick_sha(branch):
demayer 0:6bf0743ece18 115 """
demayer 0:6bf0743ece18 116 SHA of last cherry pick commit is returned. SHA should be added to all
demayer 0:6bf0743ece18 117 cherry-pick commits with -x option.
demayer 0:6bf0743ece18 118
demayer 0:6bf0743ece18 119 Args:
demayer 0:6bf0743ece18 120 branch - Hash to be verified.
demayer 0:6bf0743ece18 121 Returns - SHA if found, else None
demayer 0:6bf0743ece18 122 """
demayer 0:6bf0743ece18 123 cmd = "git checkout " + branch
demayer 0:6bf0743ece18 124 run_cmd_with_output(cmd, exit_on_failure=False)
demayer 0:6bf0743ece18 125
demayer 0:6bf0743ece18 126 sha = None
demayer 0:6bf0743ece18 127 get_commit = "git log -n 1"
demayer 0:6bf0743ece18 128 _, output = run_cmd_with_output(get_commit, exit_on_failure=True)
demayer 0:6bf0743ece18 129 lines = output.split('\n')
demayer 0:6bf0743ece18 130 for line in lines:
demayer 0:6bf0743ece18 131 if 'cherry picked from' in line:
demayer 0:6bf0743ece18 132 sha = line.split(' ')[-1]
demayer 0:6bf0743ece18 133 return sha[:-1]
demayer 0:6bf0743ece18 134 return sha
demayer 0:6bf0743ece18 135
demayer 0:6bf0743ece18 136 if __name__ == "__main__":
demayer 0:6bf0743ece18 137
demayer 0:6bf0743ece18 138 parser = argparse.ArgumentParser(description=__doc__,
demayer 0:6bf0743ece18 139 formatter_class=argparse.RawDescriptionHelpFormatter)
demayer 0:6bf0743ece18 140 parser.add_argument('-l', '--log-level',
demayer 0:6bf0743ece18 141 help="Level for providing logging output",
demayer 0:6bf0743ece18 142 default='INFO')
demayer 0:6bf0743ece18 143 parser.add_argument('-r', '--repo-path',
demayer 0:6bf0743ece18 144 help="Git Repository to be imported",
demayer 0:6bf0743ece18 145 default=None,
demayer 0:6bf0743ece18 146 required=True)
demayer 0:6bf0743ece18 147 parser.add_argument('-c', '--config-file',
demayer 0:6bf0743ece18 148 help="Configuration file",
demayer 0:6bf0743ece18 149 default=None,
demayer 0:6bf0743ece18 150 required=True)
demayer 0:6bf0743ece18 151 args = parser.parse_args()
demayer 0:6bf0743ece18 152 level = getattr(logging, args.log_level.upper())
demayer 0:6bf0743ece18 153
demayer 0:6bf0743ece18 154 # Set logging level
demayer 0:6bf0743ece18 155 logging.basicConfig(level=level)
demayer 0:6bf0743ece18 156 rel_log = logging.getLogger("Importer")
demayer 0:6bf0743ece18 157
demayer 0:6bf0743ece18 158 if (args.repo_path is None) or (args.config_file is None):
demayer 0:6bf0743ece18 159 rel_log.error("Repository path and config file required as input. Use \"--help\" for more info.")
demayer 0:6bf0743ece18 160 exit(1)
demayer 0:6bf0743ece18 161
demayer 0:6bf0743ece18 162 json_file = os.path.abspath(args.config_file)
demayer 0:6bf0743ece18 163 if not os.path.isfile(json_file):
demayer 0:6bf0743ece18 164 rel_log.error("%s not found.", args.config_file)
demayer 0:6bf0743ece18 165 exit(1)
demayer 0:6bf0743ece18 166
demayer 0:6bf0743ece18 167 repo = os.path.abspath(args.repo_path)
demayer 0:6bf0743ece18 168 if not os.path.exists(repo):
demayer 0:6bf0743ece18 169 rel_log.error("%s not found.", args.repo_path)
demayer 0:6bf0743ece18 170 exit(1)
demayer 0:6bf0743ece18 171
demayer 0:6bf0743ece18 172 sha = get_curr_sha(repo)
demayer 0:6bf0743ece18 173 if not sha:
demayer 0:6bf0743ece18 174 rel_log.error("Could not obtain latest SHA")
demayer 0:6bf0743ece18 175 exit(1)
demayer 0:6bf0743ece18 176 rel_log.info("%s SHA = %s", os.path.basename(repo), sha)
demayer 0:6bf0743ece18 177
demayer 0:6bf0743ece18 178 branch = 'feature_' + os.path.basename(repo) + '_' + sha
demayer 0:6bf0743ece18 179 commit_msg = "[" + os.path.basename(repo) + "]" + ": Updated to " + sha
demayer 0:6bf0743ece18 180
demayer 0:6bf0743ece18 181 # Read configuration data
demayer 0:6bf0743ece18 182 with open(json_file, 'r') as config:
demayer 0:6bf0743ece18 183 json_data = json.load(config)
demayer 0:6bf0743ece18 184
demayer 0:6bf0743ece18 185 '''
demayer 0:6bf0743ece18 186 Check if branch exists already, in case branch is present
demayer 0:6bf0743ece18 187 we will skip all file transfer and merge operations and will
demayer 0:6bf0743ece18 188 jump to cherry-pick
demayer 0:6bf0743ece18 189 '''
demayer 0:6bf0743ece18 190 if branch_exists(branch):
demayer 0:6bf0743ece18 191 rel_log.info("Branch present = %s", branch)
demayer 0:6bf0743ece18 192 else:
demayer 0:6bf0743ece18 193 data_files = json_data["files"]
demayer 0:6bf0743ece18 194 data_folders = json_data["folders"]
demayer 0:6bf0743ece18 195
demayer 0:6bf0743ece18 196 ## Remove all files listed in .json from mbed-os repo to avoid duplications
demayer 0:6bf0743ece18 197 for file in data_files:
demayer 0:6bf0743ece18 198 src_file = file['src_file']
demayer 0:6bf0743ece18 199 del_file(os.path.basename(src_file))
demayer 0:6bf0743ece18 200
demayer 0:6bf0743ece18 201 for folder in data_folders:
demayer 0:6bf0743ece18 202 dest_folder = folder['dest_folder']
demayer 0:6bf0743ece18 203 delete_dir_files(dest_folder)
demayer 0:6bf0743ece18 204 rel_log.debug("Deleted = %s", folder)
demayer 0:6bf0743ece18 205
demayer 0:6bf0743ece18 206 rel_log.info("Removed files/folders listed in json file")
demayer 0:6bf0743ece18 207
demayer 0:6bf0743ece18 208 ## Copy all the CMSIS files listed in json file to mbed-os
demayer 0:6bf0743ece18 209 for file in data_files:
demayer 0:6bf0743ece18 210 repo_file = os.path.join(repo, file['src_file'])
demayer 0:6bf0743ece18 211 mbed_path = os.path.join(ROOT, file['dest_file'])
demayer 0:6bf0743ece18 212 mkdir(os.path.dirname(mbed_path))
demayer 0:6bf0743ece18 213 copy_file(repo_file, mbed_path)
demayer 0:6bf0743ece18 214 rel_log.debug("Copied = %s", mbed_path)
demayer 0:6bf0743ece18 215
demayer 0:6bf0743ece18 216 for folder in data_folders:
demayer 0:6bf0743ece18 217 repo_folder = os.path.join(repo, folder['src_folder'])
demayer 0:6bf0743ece18 218 mbed_path = os.path.join(ROOT, folder['dest_folder'])
demayer 0:6bf0743ece18 219 copy_folder(repo_folder, mbed_path)
demayer 0:6bf0743ece18 220 rel_log.debug("Copied = %s", mbed_path)
demayer 0:6bf0743ece18 221
demayer 0:6bf0743ece18 222 ## Create new branch with all changes
demayer 0:6bf0743ece18 223 create_branch = "git checkout -b "+ branch
demayer 0:6bf0743ece18 224 run_cmd_with_output(create_branch, exit_on_failure=True)
demayer 0:6bf0743ece18 225 rel_log.info("Branch created = %s", branch)
demayer 0:6bf0743ece18 226
demayer 0:6bf0743ece18 227 add_files = "git add -A"
demayer 0:6bf0743ece18 228 run_cmd_with_output(add_files, exit_on_failure=True)
demayer 0:6bf0743ece18 229
demayer 0:6bf0743ece18 230 commit_branch = "git commit -m \"" + commit_msg + "\""
demayer 0:6bf0743ece18 231 run_cmd_with_output(commit_branch, exit_on_failure=True)
demayer 0:6bf0743ece18 232 rel_log.info("Commit added = %s", mbed_path)
demayer 0:6bf0743ece18 233
demayer 0:6bf0743ece18 234 ## Checkout the feature branch
demayer 0:6bf0743ece18 235 branch_checkout(branch)
demayer 0:6bf0743ece18 236 commit_sha = json_data["commit_sha"]
demayer 0:6bf0743ece18 237 last_sha = get_last_cherry_pick_sha(branch)
demayer 0:6bf0743ece18 238 if not last_sha:
demayer 0:6bf0743ece18 239 ## Apply commits specific to mbed-os changes
demayer 0:6bf0743ece18 240 for sha in commit_sha:
demayer 0:6bf0743ece18 241 cherry_pick_sha = "git cherry-pick -x " + sha
demayer 0:6bf0743ece18 242 run_cmd_with_output(cherry_pick_sha, exit_on_failure=True)
demayer 0:6bf0743ece18 243 rel_log.info("Commit added = %s", cherry_pick_sha)
demayer 0:6bf0743ece18 244 ## Few commits are already applied, check the next in sequence
demayer 0:6bf0743ece18 245 ## and skip to last applied
demayer 0:6bf0743ece18 246 else:
demayer 0:6bf0743ece18 247 found = False
demayer 0:6bf0743ece18 248 for sha in commit_sha:
demayer 0:6bf0743ece18 249 if sha == last_sha:
demayer 0:6bf0743ece18 250 found = True
demayer 0:6bf0743ece18 251 continue
demayer 0:6bf0743ece18 252 if found is True:
demayer 0:6bf0743ece18 253 cherry_pick_sha = "git cherry-pick -x " + sha
demayer 0:6bf0743ece18 254 run_cmd_with_output(cherry_pick_sha, exit_on_failure=True)