前回、前々回の記事で、MachiKaniaとPCでファイルの送受信のプログラムをPowerShellを使って作ってみました。
このファイルをMachiKaniaからPCを送信するプログラムでは、ファイル名をプログラムに書いておく必要があり、これはちょっと手間がかかり、使い勝手がよくありません。
なので、MachiKaniaのSDカードにあるファイルを選択するプログラムを作成してプログラム中にファイル名を書く必要がない様にしたいと思い、簡易的なファイルマネージャーを作ってみました。
MachiKaniaの SAMPLES にSDカードのファイルを操作するファイルマネージャーのサンプル(FILEMAN.BAS)があるので、ファイル名を配列に格納して表示する方法やキーのスキャン方法等を参考にさせていただきました。
この簡易ファイルマネージャーのプログラムリストは下記。
FMANL.BAS
REM -------------------------------------
REM File Manager lite
REM for Machikania Ver. 1.7 or later
REM -------------------------------------
USEGRAPHIC
USEVAR PX,PY,FCNT,SELF,REDISP,MODE,BRTE
MODE=0:REM Set File mode (1:Dir mode)
BRTE=9600:REM Set Baud Rate
LABEL TOP
REDISP=0
DIM F(280):REM MAX (40Col*22Row)/4Byte
CLS:LINE 0,195,310,195,5
COLOR 4:PRINT "Dir: "+GETDIR$()
GOSUB FOOTDSP:REM Print foot area
REM Read file/dir FINFO=16:Dir
COLOR 7:N=0
IF MODE=1 AND LEN(GETDIR$())!=1 THEN GOSUB STRCPY,F,"/[Root]":N=1
S$=FFIND$("*")
DO WHILE LEN(S$)
IF MODE=0 AND FINFO(3)!=16 THEN
GOSUB STRCPY,F+N*13,S:N=N+1
ELSEIF MODE=1 AND FINFO(3)=16 THEN
GOSUB STRCPY,F+N*13,S:N=N+1
ENDIF
IF N>=66 THEN BREAK:REM MAX 66 items
S$=FFIND$()
LOOP
FCNT=N-1:REM FCNT=Item count
REM Print file/dir list
E=F:COLOR 7
IF MODE=1 THEN COLOR 6
PX=0:PY=0
FOR I=0 TO FCNT
PX=I%3:PY=I/3:REM Calc disp position
CURSOR 1+PX*13,PY+2:PRINT E$
E=E+13
NEXT
DELAYMS 10:REM Wait 10mS
REM Select file/dir
SELF=0:REM Selected file No.
GOSUB DSPCUR,SELF,0
DO
IF J=KEYS() THEN
L=0
ELSE
L=KEYS():J=L
ENDIF
K=((READKEY() AND $FF00)>>8)
IF K=27 OR L=33 THEN BREAK
IF (K=39 OR L=8) AND SELF=1 THEN
GOSUB DSPCUR,SELF,-1:SELF=SELF-1
ELSEIF (K=38 OR L=1) AND SELF-3>=0 THEN
GOSUB DSPCUR,SELF,-3:SELF=SELF-3
ELSEIF (K=40 OR L=2) AND SELF+3<=FCNT THEN
GOSUB DSPCUR,SELF,3:SELF=SELF+3
ELSEIF K=82 OR L=20 THEN
GOSUB RCVFIL
IF REDISP=1 THEN BREAK
ELSEIF K=13 OR L=32 THEN
GOSUB FILOPE
IF REDISP=1 THEN BREAK
ELSEIF K=68 OR L=16 THEN
MODE=MODE+1
IF MODE>=2 THEN MODE=0
REDISP=1:BREAK
ELSEIF K=191 THEN
SETDIR "/":REDISP=1:BREAK
ENDIF
DELAYMS 10:REM Wait 10mS
LOOP
IF REDISP=1 THEN GOTO TOP
CLS:GCLS
IF SYSTEM(40)=0 Then PRINT "Push START button to RESET"
END
REM ----Subroutin-----
REM Copy a string -----
LABEL STRCPY
VAR D,S
D=ARGS(1):S=ARGS(2)
DO WHILE PEEK(S)
POKE D,PEEK(S)
D=D+1:S=S+1
LOOP
POKE D,0
RETURN
REM Disp cursor N:ItemNo M:Relative ----
LABEL DSPCUR
VAR N,M:N=ARGS(1):M=ARGS(2):COLOR 5
CURSOR (N%3)*13,N/3+2:PRINT " "
N=N+M
CURSOR (N%3)*13,N/3+2:PRINT ">"
RETURN
REM File operetion -----
LABEL FILOPE
VAR S
S=F+13*SELF
IF MODE=1 THEN
MODE=0
IF LEN(GETDIR$())!=1 AND SELF=0 THEN
SETDIR "/":REDISP=1:RETURN
ELSE
SETDIR GETDIR$()+"/"+S$:REDISP=1:RETURN
ENDIF
ENDIF
COLOR 7:CURSOR 0,25: PRINT S$+" "
COLOR 6:PRINT "D/"+CHR$($1D)+":Del R:ReName S/"+CHR$($1C)+":Send ESC/"+CHR$($1E)+":Camcel":COLOR 7
DO
K=((READKEY() AND $FF00)>>8)
IF K=27 OR KEYS()=1 THEN
GOSUB FOOTDSP:BREAK
ELSEIF K=68 OR KEYS()=4 THEN
CURSOR 15,25:PRINT "Delete ? Y(F)/N "
K=0:J=0:WAIT 10
DO WHILE K=0 AND J=0
K=INKEY()
J=KEYS()
LOOP
IF K=89 OR J=32 THEN
FREMOVE S$:REM Delate a file
GOSUB FOOTDSP:REDISP=1:BREAK
ELSE
CURSOR 15,25:PRINT " "
ENDIF
ELSEIF K=82 THEN
CURSOR 13,25:PRINT ">>New name= ";
A$=INPUT$()
IF A$!="" THEN
FRENAME S$,A$:REM Rename a file
GOSUB FOOTDSP:REDISP=1:BREAK
ELSE
CURSOR 13,25:PRINT " "
ENDIF
ELSEIF K=83 OR KEYS(8) THEN
GOSUB SNDFIL:REM Send a file
REDISP=1:BREAK
ENDIF
DELAYMS 10:REM Wait 10mS
LOOP
RETURN
REM Disply foot area -----
LABEL FOOTDSP
CURSOR 0,25:COLOR 6
IF MODE=0 THEN PRINT "Enter/(F:Select file "
IF MODE=1 THEN PRINT "Enter/(F:Select Dir "
CURSOR 0,26
IF MODE=0 THEN PRINT "D/(S:Dir R/"+CHR$($1D)+"+(S:Recv ESC/"+CHR$($1E)+"+(F:End "
IF MODE=1 THEN PRINT "D/(S:File ESC/"+CHR$($1E)+"+(F:End "
COLOR 7
RETURN
REM Send file -----
LABEL SNDFIL
DIM B(0)
CURSOR 0,26:PRINT "Run receive program on PC(start with #)"
SERIAL BRTE,0
DO
K=((READKEY() AND $FF00)>>8)
IF K=27 OR KEYS()=1 THEN RETURN
LOOP WHILE NOT(SERIALIN()=ASC("#"))
WAIT 100:D=0
FOPEN S$,"r"
FOR I=0 TO LEN(S$)-1
SERIALOUT ASC(S$(I)):REM Send file name
NEXT
SERIALOUT 13
WHILE FGET(B,1)>0
D=D+1:SERIALOUT B(0)
CURSOR 20,25:PRINT D;:PRINT " bytes sent"
WEND
FCLOSE:WAIT 10
RETURN
REM Receive file -----
LABEL RCVFIL
CURSOR 0,25:PRINT " "
COLOR 6:CURSOR 0,26:PRINT "ESC"+CHR$($1E)+":Camcel ":COLOR 7
CURSOR 0,25:PRINT "Start file send from PC";
A$="":SERIAL BRTE,0,1000
DO
C=SERIALIN()
IF ((READKEY() AND $FF00)>>8)=27 OR KEYS()=1 THEN REDISP=1:RETURN
IF C>=0 THEN
IF C=13 THEN BREAK
A$=A$+CHR$(C)
ENDIF
LOOP
WAIT 30:FOPEN A$,"w":D=0:USETIMER 1000
DO
C=SERIALIN()
IF C>=0 THEN
FPUTC C:D=D+1
CURSOR 0,25:PRINT "Recive ";:PRINT A$+" ";:PRINT D;:PRINT " bytes"
TIMER 0
ENDIF
IF ((READKEY() AND $FF00)>>8)=27 THEN BREAK
IF TIMER()>=3000 THEN BREAK
LOOP
FCLOSE:REDISP=1
RETURN
ファイルの送受信以外の機能で、標準のファイルマネージャーの補助的なファイル操作として、ファイルの削除、リネームもできる様にしてSDカードの抜き差しせずにSDカード内のファイルの整理もできるようにしました。
(標準のファイルマネージャーではディレクトリの作成可能で、ファイルコピーはエディタで一度読み込んでから別名で保存すればよいので)
キーボード接続していなくても、MachiKania標準のボタン方向ボタン、Start、Fire でもリネーム以外の操作はできる様にしています。(画面上の表記はそれぞれ (S、(F )
操作説明は下記。
(画面下部にも表示されます)
・ファイル/ディレクトリ表示時
ファイル/ディレクトリの選択: 方向キー/方向ボタン
ファイル決定: Enter/Fireボタン
表示モード(ファイル/ディレクトリ)変更: Dキー/Startボタン
ディレクトリ表示モードでディレクトリを選択した直後はファイル表示モード
ファイル受信: Sキー/右方向ボタン+Startボタン
終了: Escキー/上方向ボタン+Fireボタン
・ファイル操作時(ファイル決定後)
ファイル削除: Dキー/左方向ボタン
ファイル名変更: Rキー (ボタンでは操作不可)
ファイル送信: Sキー/右方向ボタン
ファイル選択に戻る: Escキー/上方向ボタン
MachiKaniaにキーボード接続していない状態でボタンで終了した場合は Hit Any Key が表示されずリセットするしかなくなりますので、Startボタンを押してリセットしてください。
プログラムの起動直後は、プログラムのカレントディレクトリにあるファイルの一覧が表示されます。

Rキーを押すと、カレントディレクトリにPCからファイルを受信します。
表示可能なファイル数は最大66ファイルです。
プログラムをシンプルにするため(というかメンドクサかった)スクロールはできず66を超える数のファイルは表示できません。まあ、実用上はあまり問題にならないと思います。
この状態でDキーを押すとディレクトリ一覧が表示され、ディレクトリを選択してEnterキーを押すとカレントディレクトリがそのディレクトリに移動し、そのディレクトリのファイル一覧が表示されます。
プログラムをシンプルにするため(というかメンドクサかった)一つ上のディレクトリには戻れず、上位のディレクトリに戻りたい場合は、[Root]を選択して一旦ルートディレクトリに戻ります。
方向キーでファイルを選択してEnterキーを押すと、ファイル操作モードになります。

画面下部に選択したファイル名が表示され、Dキーで削除、Rキーでリネーム、Sキーでファイル送信が可能です。
実際に操作したMachiKaniaの画面の動画はこちら
PC側の操作は、前回、前々回の記事の通りです。
MachiKaniaにPCからファイルを送信をしてみる(PowerShell版) - 諸々の記録
MachiKaniaからPCにファイルを送信をしてみる(PowerShell版) - 諸々の記録
PCからファイルを送信するときは、ファイルを右クリックして「送る」を選択、PCにファイルを送るときは、フォルダを道クリックして「送る」を選択します。
必要なファイルが複数のブログに分かれているので、必要なファイルを1つにまとめて下記からダウンロードできるようにしました。
https://img.atwiki.jp/machikania/attach/25/31/fmanl.zip
拡張子が ps1 のファイルは、C:\ttl に配置。
拡張子が bat のファイルは、ウインドウズキー + R で shell:sendto と入れて OK で表示されたフォルダに配置します。
また、MachiKania 側は、 MACHICAP.INI の UART pins の設定で URRT で使うピンを設定する必要があります。
詳しくは下記の記事を参照してください。(TeraTermは不要です)
これでSDカードを抜き差ししなくても、ファイルの送受信とファイルの整理が出来るようになりました。
自分で使ってみて、結構使い勝手が良いものが出来たと思っています。