Merge branch 'main' into tx812-performance

pull/884/head
probonopd 2 weeks ago committed by GitHub
commit 2f61e4a748
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 8
      src/minidexed.cpp
  2. 8
      src/uimenu.cpp
  3. 108
      updater.py

@ -833,7 +833,7 @@ void CMiniDexed::SetMIDIChannel (uint8_t uchChannel, unsigned nTG)
assert (nActiveTGs <= 8);
static const unsigned Log2[] = {0, 0, 1, 2, 2, 3, 3, 3, 3};
m_nActiveTGsLog2 = Log2[nActiveTGs];
m_nActiveTGsLog2 = Log2[nActiveTGs];
*/
#endif
@ -2334,7 +2334,8 @@ void CMiniDexed::UpdateNetwork()
}
static constexpr const char *ServiceTypeFTP = "_ftp._tcp";
if (!m_pmDNSPublisher->PublishService (m_pConfig->GetNetworkHostname(), ServiceTypeFTP, 21))
static const char *ftpTxt[] = { "app=MiniDexed", nullptr };
if (!m_pmDNSPublisher->PublishService (m_pConfig->GetNetworkHostname(), ServiceTypeFTP, 21, ftpTxt))
{
LOGPANIC ("Cannot publish mdns service");
}
@ -2384,7 +2385,8 @@ void CMiniDexed::UpdateNetwork()
}
static constexpr const char *ServiceTypeFTP = "_ftp._tcp";
if (!m_pmDNSPublisher->PublishService (m_pConfig->GetNetworkHostname(), ServiceTypeFTP, 21))
static const char *ftpTxt[] = { "app=MiniDexed", nullptr };
if (!m_pmDNSPublisher->PublishService (m_pConfig->GetNetworkHostname(), ServiceTypeFTP, 21, ftpTxt))
{
LOGPANIC ("Cannot publish mdns service");
}

@ -1574,9 +1574,11 @@ void CUIMenu::PerformanceMenu (CUIMenu *pUIMenu, TMenuEvent Event)
}
std::string Value;
if (Event == MenuEventUpdate)
if (Event == MenuEventUpdate || Event == MenuEventUpdateParameter)
{
pUIMenu->m_bPerformanceDeleteMode=false;
// Ensure selected performance matches the actual loaded one
pUIMenu->m_nSelectedPerformanceID = pUIMenu->m_pMiniDexed->GetActualPerformanceID();
}
if (pUIMenu->m_bSplashShow)
@ -1705,7 +1707,7 @@ void CUIMenu::PerformanceMenu (CUIMenu *pUIMenu, TMenuEvent Event)
nPPerf = nPPerf.substr(nPPerf.length()-3,3);
nPSelected += ":"+nPPerf;
if(nValue == pUIMenu->m_pMiniDexed->GetActualPerformanceID())
if(bPerformanceSelectToLoad && nValue == pUIMenu->m_pMiniDexed->GetActualPerformanceID())
{
nPSelected += " [L]";
}
@ -1793,7 +1795,7 @@ void CUIMenu::EditPerformanceBankNumber (CUIMenu *pUIMenu, TMenuEvent Event)
nPSelected += std::to_string(nValue+1); // Convert to user-facing number rather than index
nPSelected = nPSelected.substr(nPSelected.length()-3,3);
if(nValue == (unsigned)pUIMenu->m_pMiniDexed->GetParameter (CMiniDexed::ParameterPerformanceBank))
if(bPerformanceSelectToLoad && nValue == (unsigned)pUIMenu->m_pMiniDexed->GetParameter (CMiniDexed::ParameterPerformanceBank))
{
nPSelected += " [L]";
}

@ -36,10 +36,18 @@ class MyListener(ServiceListener):
info = zc.get_service_info(type_, name)
print(f"Service {name} added, service info: {info}")
if info and info.addresses:
ip = socket.inet_ntoa(info.addresses[0])
if ip not in self.ip_list:
self.ip_list.append(ip)
self.name_list.append(info.server.rstrip('.'))
# Only add if TXT record contains 'MiniDexed'
txt_records = info.properties
if txt_records:
for k, v in txt_records.items():
# v may be bytes, decode if needed
val = v.decode() if isinstance(v, bytes) else v
if (b"MiniDexed" in k or b"MiniDexed" in v) or ("MiniDexed" in str(k) or "MiniDexed" in str(val)):
ip = socket.inet_ntoa(info.addresses[0])
if ip not in self.ip_list:
self.ip_list.append(ip)
self.name_list.append(info.server.rstrip('.'))
break
# Constants
@ -82,6 +90,8 @@ def extract_zip(zip_path):
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="MiniDexed Updater")
parser.add_argument("-v", action="store_true", help="Enable verbose FTP debug output")
parser.add_argument("--ip", type=str, help="IP address of the device to upload to (skip mDNS discovery)")
parser.add_argument("--version", type=int, choices=[1,2,3], help="Version to upload: 1=Latest official, 2=Continuous, 3=Local build (skip prompt)")
args = parser.parse_args()
import time
@ -97,16 +107,24 @@ if __name__ == "__main__":
]
if has_local_build:
release_options.append(("Local build (from src/)", None))
print("Which release do you want to update?")
for idx, (desc, _) in enumerate(release_options):
print(f" [{idx+1}] {desc}")
while True:
choice = input(f"Enter the number of your choice (1-{len(release_options)}): ").strip()
if choice.isdigit() and 1 <= int(choice) <= len(release_options):
selected_idx = int(choice)-1
github_url = release_options[selected_idx][1]
break
print("Invalid selection. Please enter a valid number.")
if args.version:
selected_idx = args.version - 1
if selected_idx < 0 or selected_idx >= len(release_options):
print(f"Invalid version selection: {args.version}")
sys.exit(1)
github_url = release_options[selected_idx][1]
else:
print("Which release do you want to update?")
for idx, (desc, _) in enumerate(release_options):
print(f" [{idx+1}] {desc}")
while True:
choice = input(f"Enter the number of your choice (1-{len(release_options)}): ").strip()
if choice.isdigit() and 1 <= int(choice) <= len(release_options):
selected_idx = int(choice)-1
github_url = release_options[selected_idx][1]
break
print("Invalid selection. Please enter a valid number.")
# If local build is selected, skip all GitHub/zip logic and do not register cleanup
use_local_build = has_local_build and selected_idx == len(release_options)-1
@ -167,29 +185,35 @@ if __name__ == "__main__":
# Using mDNS to find the IP address of the device(s) that advertise the FTP service "_ftp._tcp."
ip_addresses = []
device_names = []
zeroconf = Zeroconf()
listener = MyListener(ip_addresses, device_names)
browser = ServiceBrowser(zeroconf, "_ftp._tcp.local.", listener)
try:
print("Searching for devices...")
time.sleep(10)
if ip_addresses:
print("Devices found:")
for idx, (name, ip) in enumerate(zip(device_names, ip_addresses)):
print(f" [{idx+1}] {name} ({ip})")
while True:
selection = input(f"Enter the number of the device to upload to (1-{len(ip_addresses)}): ").strip()
if selection.isdigit() and 1 <= int(selection) <= len(ip_addresses):
selected_ip = ip_addresses[int(selection)-1]
selected_name = device_names[int(selection)-1]
break
print("Invalid selection. Please enter a valid number.")
else:
print("No devices found.")
sys.exit(1)
finally:
zeroconf.close()
print("Devices found:", list(zip(device_names, ip_addresses)))
selected_ip = None
selected_name = None
if args.ip:
selected_ip = args.ip
selected_name = args.ip
else:
zeroconf = Zeroconf()
listener = MyListener(ip_addresses, device_names)
browser = ServiceBrowser(zeroconf, "_ftp._tcp.local.", listener)
try:
print("Searching for devices...")
time.sleep(10)
if ip_addresses:
print("Devices found:")
for idx, (name, ip) in enumerate(zip(device_names, ip_addresses)):
print(f" [{idx+1}] {name} ({ip})")
while True:
selection = input(f"Enter the number of the device to upload to (1-{len(ip_addresses)}): ").strip()
if selection.isdigit() and 1 <= int(selection) <= len(ip_addresses):
selected_ip = ip_addresses[int(selection)-1]
selected_name = device_names[int(selection)-1]
break
print("Invalid selection. Please enter a valid number.")
else:
print("No devices found.")
sys.exit(1)
finally:
zeroconf.close()
print("Devices found:", list(zip(device_names, ip_addresses)))
# Log into the selected device and upload the new version of MiniDexed
print(f"Connecting to {selected_name} ({selected_ip})...")
@ -319,7 +343,15 @@ if __name__ == "__main__":
with open(local_path, 'rb') as f:
ftp.storbinary(f'STOR {remote_path}', f, 8192, callback=progress_callback)
print(f"\nUploaded {file} to {selected_ip}.")
except ftplib.all_errors as e:
print(f"FTP error: {e}")
try:
ftp.sendcmd("BYE")
print(f"Disconnected from {selected_ip}.")
except ftplib.all_errors as e:
print(f"FTP error: {e}")
if str(e).strip().lower() == "timed out":
# Suppress expected timeout after BYE
print(f"Disconnected from {selected_ip}.")
else:
print(f"FTP error after BYE: {e}")

Loading…
Cancel
Save