From c9335715b82e6310baefb8d9a92df8cc5fc4c536 Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 4 Aug 2025 13:34:36 -0400 Subject: [PATCH] Add ability for PyDOS to switch between read-write/read-only modes --- builtin_apps/PyDOS/PyDOS.bmp | Bin 16522 -> 5258 bytes builtin_apps/PyDOS/code.py | 31 ++++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/builtin_apps/PyDOS/PyDOS.bmp b/builtin_apps/PyDOS/PyDOS.bmp index 6fe6f2264ed0065e664dd22b7030a33cf02425dc..9076dbfc836fae9c57986ab17ec314deb329bd6d 100644 GIT binary patch literal 5258 zcmeH{cUX^I9L7HpA`y|5m7SfvlaVAdk(rfQBBQ8`q(Nq~B4idBkxEi#C1fQP4H+#B zMOx2WPr9nN_qurBf8XD^e&?L;_kQlrInQ(d@l)5fZ-6-LrNO+YQu{TfkP&s{K|!`; zB2^?6PlVE+=uy|0Y$6u_VyW^EUMVRls#K{$)v8sImX@YkwQ5waUY!~>Y9J#cL(Q5s zsa2~Mva+(&u3Z~BIXUXosYBhmb&;2sr(V5!)URJ31qB5fG-yD>h7D0vRHRX(Ml^2R zm?lk{(6nh&nl)>Nl9Ce5n>VLLix#wO*^*YRTG6_7Ym}9hY15_+ZQHh`UAuO)Z{MB{ z9XimlV@Eo5>V%4l3Y|N5rc0MDbnV)eZr!@ky?b|h^yop)o;^`jRi#(2Ui9wWn?8N| z(6?`2`t|Ea|Ni|MFkk=!2M%P=pg{~CJeVOvhA?#KP=*Z~hMJlh!-o$?U0t0KBStWC z(Ovt}`S_H5?NnZw+1q&9iaN$B0En0+ufdPvbFJ{S-B`jUKlx547v3&V*R;*Zop`js0Mn0oF)=Y=&6+i=UAvZb>(;S;{d!DIO))bwW5b3GY}~jJb8~YnEG)3Jv}Dt! zO>Ex0nJrtkuyyNJtgNiqwrv~M*4Av_z8xDI8*FWDv9q(o-rk-aJ9e;h=T00P9N4vM z7rS@wX3w5I?A^PUef##YfB$|Q9UVDv-~dieP8>XVkVA(Karp3IjvP6{(W6Ikc6R32 zv11%RejFDU7fzfw!O4>+Id$q3uCA_}K7E=qXU=f;>{-s8JIDF+=ecm<0&Z?@xVyV^ z@!~};UAlyahXzVq;^8i;E*ZKAsOBK9G=*z{igt`Sj@%pFe-* z%a<=CCMJ@UltglJGASu3q^73w_3KyC($YvzPbVWIgUrlKzJ2>fR#q0-+1Y&m{+%B` zevp%s!_S{T$<56rFE5Y${Co-u3MecrL=cMpPb5Q(AfU2E(_n`krZvuqv0#fiNHp2m``^ zFdz&F1HynXAPfit!hkR!3LG4-XT{^z?MWy7ywx;c!qgnWShms`)R+S8Z)A z9UUF9rjwHsnw_0x?H3mpba;5k_0^<*YHEsO8W|a3{WCK&)YR1U=D7$4gKQ5><<6tU zVxhCMv#Qg7etu5(_xFVO5HHrj)6)}eY-~__d;5PHa`ohU21h8py}i1zfk2?D^mli6 zb3Ci7t6HorEiE)ZKhNtll}ge6{yq&24QcK9bZ6_YuC55<>gwurV|sdes!IRb+8W2x z+1aU!6+DcNj%sT;7K_o?*cjE<*X#Obwd0Qc?cw1;*{7qUqiXacKZ!(w*JN(|s%Om4 z`uaNS!k9ulApa<;dFt=)FG)Yn3{^apsPp-J97`w^D(b^-x6|C*9M9L?-5t5z?!03n zkqFxz930g3nVg&~N&o5Tsm?|vw8IA0HTF51&6d}P)9Iv@l@-oAbdQgZE7x^yOn$$g zH69!sP)$vZW*acZa=o~?NH;e({B8wX3kwTW>i*Z&)kQ9si}zr#3Vw?DHqwqg3bC2ZW}Urq zbQklj(qC*$rQ7@Z`Z)JE<5jlbl5dqARb4*)SdXe)sBDy5x3#s!e7Cl?D)pCZztDJ< zey`VCFdv2NeY7@}{(*r3K3|NS!yiqr#QVAbZzB1X{0alYfG{8o2m``^Fdz&F1HynX WAPfit!hkR!3','(',')','&','|','\x1b','\b','<','=',' ',_VER,'\n','$',''] print("Starting Py-DOS... Type 'help' for help.") + if readonly: + print("Warning: Py-DOS is running in read-only mode, some commands may not work.") + if input("Press Enter to continue or 'R' to restart in read-write mode: ").upper() == 'R': + print("\nNote: You can not modify files using the CIRCUITPY drive from a") + print("connected host computer in read-write mode. After restarting,") + print("you can use the 'readonly' command in PyDOS to return to read-only mode.\n") + if input('Are you sure? (Y/N): ').upper() == 'Y': + boot_args_file = argv_filename("/boot.py") + with open(boot_args_file, "w") as f: + f.write('[false, "/code.py"]') + microcontroller.reset() + envVars["PATH"] = f'{sep};{sep}apps{sep}PyDOS;{sep}apps{sep}PyBasic' envVars["PROMPT"] = "$P$G" envVars["LIB"] = ";".join(path[1:]) @@ -679,7 +698,7 @@ def PyDOS(): continue elif cmd == "HELP": print("File Commands: DIR[/p][/w][/s], RENAME, DEL[/s], TYPE[/p], CD, MKDIR, RMDIR[/s], COPY[/y]") - print("Environment Commands: HELP, SET[/p][/a], PROMPT, PATH") + print("Environment Commands: HELP, SET[/p][/a], PROMPT, PATH, READONLY") print("Operating System Commands: EXIT, VER, MEM, DATE [mm-dd-yy], TIME [hh:mm:ss]") print("Batch Commands: GOTO, IF, ECHO, PAUSE") print("Command to execute a single Python command: PEXEC [command]") @@ -1241,6 +1260,16 @@ def PyDOS(): else: print("Illegal switch, Command Format: PEXEC[/q] python command") + elif cmd == "READONLY": + if readonly: + print("The system is already set to read-only.") + else: + if input("Setting the system to read-only will cause the Fruit Jam to restart? (y/n): ").upper() == "Y": + boot_args_file = argv_filename("/boot.py") + with open(boot_args_file, "w") as f: + f.write('[true, "/code.py"]') + microcontroller.reset() + elif cmd == "EXIT": if activeBAT: if len(args) > 1: