Skip to content

Commit c4c678c

Browse files
committed
Implemented shell tools to work with Apps from host.
Signed-off-by: ubi de feo <me@ubidefeo.com>
1 parent 60529a7 commit c4c678c

30 files changed

+2125
-0
lines changed

shell_tools/_backup.sh

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
source _common.sh
2+
function backup_app {
3+
app_safe_name=$(echo "$1" | tr -d '\r\n')
4+
output_msg="Archiving \"$app_safe_name\" on board"
5+
echo -n "$output_msg"
6+
cmd="${PYTHON_HELPERS}"
7+
cmd+='''
8+
'''
9+
cmd+="res = export_app('$app_safe_name');print(res)"
10+
11+
error=$(mpremote exec "$cmd")
12+
# Print error message if return code is not 0
13+
if [ $? -ne 0 ]; then
14+
echo -ne "\r\033[2K"
15+
echo "$output_msg"
16+
echo "Error: $error"
17+
return 0
18+
fi
19+
20+
echo -ne "\r\033[2K"
21+
echo "☑️ $output_msg"
22+
remote_archive_path=$(echo "$error" | tr -d '\r\n')
23+
24+
output_msg="Copying app \"$app_safe_name\" archive to local machine"
25+
echo -n "$output_msg"
26+
27+
error=$(mpremote cp :$remote_archive_path ./)
28+
# Print error message if return code is not 0
29+
if [ $? -ne 0 ]; then
30+
echo -ne "\r\033[2K"
31+
echo "$output_msg"
32+
echo "Error: $error"
33+
return 0
34+
fi
35+
echo -ne "\r\033[2K"
36+
echo "☑️ $output_msg"
37+
38+
local_folder_name="$APPS_PREFIX$app_safe_name"
39+
if [ -d "$local_folder_name" ]; then
40+
input_msg="Delete local folder $local_folder_name?"
41+
read -p "$input_msg [Y/n]: " confirm
42+
confirm=${confirm:-n}
43+
44+
if [ $confirm == "Y" ]; then
45+
echo -ne "\033[F\r\033[2K"
46+
echo "👍🏼 $input_msg"
47+
output_msg="Deleting local folder $local_folder_name"
48+
echo -n "$output_msg"
49+
rm -rf "$local_folder_name"
50+
echo -ne "\r\033[2K"
51+
echo "☑️ $output_msg"
52+
else
53+
echo -ne "\r\033[2K"
54+
echo "👎🏼 $input_msg"
55+
timestamp=$(date +%s)
56+
57+
local_folder_backup_name="$local_folder_name""_backup_$timestamp"
58+
59+
output_msg="Moving $local_folder_name to $local_folder_backup_name"
60+
echo -n "$output_msg"
61+
mv $local_folder_name $local_folder_backup_name
62+
echo -ne "\r\033[2K"
63+
echo "☑️ $output_msg"
64+
fi
65+
fi
66+
67+
68+
archive_name=`basename $remote_archive_path`
69+
output_msg="Extracting \"$archive_name\" to $APPS_PREFIX$app_safe_name"
70+
tar --strip-components=1 -xf $archive_name
71+
rm -f $archive_name
72+
# Print error message if return code is not 0
73+
if [ $? -ne 0 ]; then
74+
echo -ne "\r\033[2K"
75+
echo "$output_msg"
76+
echo "Error: $res"
77+
return 0
78+
fi
79+
echo -ne "\r\033[2K"
80+
echo "☑️ $output_msg"
81+
82+
}
83+
84+
85+
app_safe_name=$1
86+
remote_app_path="$APPS_ROOT""$APPS_PREFIX""$app_safe_name"
87+
echo $remote_app_path
88+
if directory_exists $remote_app_path; then
89+
echo "App \"$app_safe_name\" exists on board. Backing up locally."
90+
backup_app $app_safe_name
91+
else
92+
echo "App \"$app_safe_name\" does not exist on board. Backup canceled."
93+
fi
94+
95+
echo -e "\n✅ App \"$app_safe_name\" backed up and available locally"

shell_tools/_common.sh

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
#!/bin/bash
2+
APPS_ROOT="/"
3+
APPS_PREFIX="app_"
4+
ARDUINO_TOOLS_MIP_URL="github:arduino/arduino-tools-mpy"
5+
6+
7+
PYTHON_HELPERS='''
8+
import os
9+
10+
os.chdir(get_root())
11+
from arduino_tools.apps_manager import create_app, export_app
12+
13+
def is_directory(path):
14+
return True if os.stat(path)[0] == 0x4000 else False
15+
16+
def get_all_files(path, array_of_files = []):
17+
files = os.ilistdir(path)
18+
for file in files:
19+
is_folder = file[1] == 16384
20+
p = path + "/" + file[0]
21+
array_of_files.append({
22+
"path": p,
23+
"type": "folder" if is_folder else "file"
24+
})
25+
if is_folder:
26+
array_of_files = get_all_files(p, array_of_files)
27+
return array_of_files
28+
29+
def delete_folder(path):
30+
files = get_all_files(path)
31+
for file in files:
32+
if file["type"] == "file":
33+
os.remove(file["path"])
34+
for file in reversed(files):
35+
if file["type"] == "folder":
36+
os.rmdir(file["path"])
37+
os.rmdir(path)
38+
39+
def sys_info():
40+
import sys
41+
print(sys.platform, sys.implementation.version)
42+
43+
def list_apps():
44+
import os
45+
from arduino_tools.apps_manager import get_apps_list
46+
apps = get_apps_list()
47+
apps_names = ""
48+
for i, app in enumerate(apps):
49+
if i != 0:
50+
apps_names += " "
51+
apps_names += app["name"]
52+
print(apps_names)
53+
54+
def get_root(has_flash_mount = True):
55+
if "/flash" in sys.path:
56+
return "/flash/"
57+
else:
58+
return "/"
59+
60+
os.chdir(get_root())
61+
'''
62+
63+
ARDUINO_TOOLS_CHECK='''
64+
import sys
65+
sys.path.insert(0, "/lib")
66+
try:
67+
from arduino_tools.apps_manager import create_app
68+
from tarfile import write
69+
except ImportError as e:
70+
print("Error: ")
71+
72+
'''
73+
74+
function check_arduino_tools {
75+
error=$(mpremote exec "$ARDUINO_TOOLS_CHECK")
76+
if [[ $error == *"Error"* ]]; then
77+
return 1
78+
else
79+
return 0
80+
fi
81+
}
82+
83+
# Check if device is present/connectable
84+
# returns 0 if device is present, 1 if it is not
85+
function device_present {
86+
# Run mpremote and capture the error message
87+
echo "⏳ Querying MicroPython board..."
88+
sys_info="${PYTHON_HELPERS}sys_info()"
89+
error=$(mpremote exec "$sys_info")
90+
# Return error if error message contains "OSError: [Errno 2] ENOENT"
91+
if [[ $error == *"no device found"* ]]; then
92+
return 0
93+
else
94+
return 1
95+
fi
96+
}
97+
98+
function directory_exists {
99+
# Run mpremote and capture the error message
100+
output="Checking if \"$1\" exists on board"
101+
echo -ne "$output"
102+
103+
error=$(mpremote fs ls $1 2>&1)
104+
echo -ne "\r\033[2K"
105+
echo -e "\r☑️ $output"
106+
# Return error if error message contains "OSError: [Errno 2] ENOENT"
107+
if [[ $error == *"OSError: [Errno 2] ENOENT"* || $error == *"No such"* ]]; then
108+
return 1
109+
else
110+
return 0
111+
fi
112+
113+
}
114+
115+
# Copies a file to the board using mpremote
116+
# Only produces output if an error occurs
117+
function copy_file {
118+
output="Copying $1 to $2"
119+
echo -n "$output"
120+
# Run mpremote and capture the error message
121+
error=$(mpremote cp $1 $2)
122+
# Print error message if return code is not 0
123+
if [ $? -ne 0 ]; then
124+
echo "Error: $error"
125+
fi
126+
echo -ne "\r\033[2K"
127+
echo -e "\r☑️ $output"
128+
}
129+
130+
# Deletes a file from the board using mpremote
131+
# Only produces output if an error occurs
132+
function delete_file {
133+
echo "Deleting $1"
134+
# Run mpremote and capture the error message
135+
error=$(mpremote rm $1)
136+
137+
# Print error message if return code is not 0
138+
if [ $? -ne 0 ]; then
139+
echo "Error: $error"
140+
fi
141+
}
142+
143+
function create_folder {
144+
output_msg="Creating $1 on board"
145+
echo -n "$output_msg"
146+
error=$(mpremote mkdir "$1")
147+
# Print error message if return code is not 0
148+
if [ $? -ne 0 ]; then
149+
echo "Error: $error"
150+
fi
151+
echo -ne "\r\033[2K"
152+
echo -e "\r☑️ $output_msg"
153+
}
154+
155+
function delete_folder {
156+
output_msg="Deleting $1 on board"
157+
echo -n "$output_msg"
158+
delete_folder="${PYTHON_HELPERS}delete_folder(\"/$1\")"
159+
error=$(mpremote exec "$delete_folder")
160+
# Print error message if return code is not 0
161+
if [ $? -ne 0 ]; then
162+
echo "Error: $error"
163+
fi
164+
echo -ne "\r\033[2K"
165+
echo -e "\r☑️ $output_msg"
166+
}

shell_tools/_create.sh

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#!/bin/bash
2+
#
3+
# Create an Arduino MicroPython App on the target board.
4+
#
5+
# ./_create.sh <app_name> <friendly_name>
6+
7+
#########################
8+
# VERY WORK IN PROGRESS #
9+
#########################
10+
source _common.sh
11+
app_name=$1
12+
app_safe_name=$(echo $app_name | tr ' [:punct:]' '_')
13+
shift
14+
app_friendly_name=$*
15+
16+
17+
function create_app {
18+
app_safe_name=$1
19+
shift
20+
app_friendly_name=$*
21+
22+
if [ "$app_friendly_name" = "" ]; then
23+
app_friendly_name=$app_safe_name
24+
fi
25+
26+
output_msg="Creating app \"$app_safe_name\" with friendly name \"$app_friendly_name\""
27+
echo -n "$output_msg"
28+
29+
# Run mpremote and capture the error message
30+
cmd="${PYTHON_HELPERS}"
31+
cmd+='''
32+
'''
33+
cmd+="create_app('$app_safe_name', friendly_name = '$app_friendly_name')"
34+
cmd+='''
35+
'''
36+
37+
cmd+="print('App $app_safe_name created')"
38+
error=$(mpremote exec "$cmd")
39+
# Print error message if return code is not 0
40+
if [ $? -ne 0 ]; then
41+
echo -ne "\r\033[2K"
42+
echo "$output_msg"
43+
echo "Error: $error"
44+
exit 1
45+
fi
46+
echo -ne "\r\033[2K"
47+
echo "☑️ $output_msg"
48+
}
49+
50+
remote_app_path="$APPS_ROOT""$APPS_PREFIX""$app_safe_name"
51+
echo $remote_app_path
52+
if directory_exists $remote_app_path; then
53+
echo "App \"$app_friendly_name\" already exists on board. Delete first."
54+
exit 1
55+
else
56+
echo "App \"$app_friendly_name\" does not exist on board. Creating..."
57+
create_app $app_safe_name $app_friendly_name
58+
fi
59+
60+
transfer_app $app_safe_name
61+
62+
echo -e "\n✅ App \"$app_friendly_name\" created and available locally"

0 commit comments

Comments
 (0)