mirror of
https://github.com/clockworkpi/PicoCalc.git
synced 2025-12-12 10:18:54 +01:00
66 lines
2.1 KiB
C
66 lines
2.1 KiB
C
#include "MMBasic_Includes.h"
|
|
#include "Hardware_Includes.h"
|
|
#include "lwip/apps/tftp_common.h"
|
|
#include "lwip/apps/tftp_server.h"
|
|
struct tftp_context ctx;
|
|
int tftp_fnbr;
|
|
void* tftp_open(const char* fname, const char* fmode, u8_t write){
|
|
if (!InitSDCard()) return NULL;
|
|
BYTE mode = 0;
|
|
tftp_fnbr=FindFreeFileNbr();
|
|
if (write){
|
|
mode = FA_WRITE | FA_CREATE_ALWAYS;
|
|
if(!optionsuppressstatus)MMPrintString("TFTP request to create ");
|
|
}
|
|
else {
|
|
mode = FA_READ;
|
|
if(!optionsuppressstatus)MMPrintString("TFTP request to read ");
|
|
}
|
|
if(!optionsuppressstatus)MMPrintString(strcmp(fmode,"octet")==0? "binary file : " : "ascii file : ");
|
|
if(!optionsuppressstatus)MMPrintString((char *)fname);
|
|
if(!optionsuppressstatus)PRet();
|
|
if (!BasicFileOpen((char *)fname, tftp_fnbr, mode))
|
|
return NULL;
|
|
return &tftp_fnbr;
|
|
}
|
|
|
|
void tftp_close(void* handle){
|
|
// int nbr;
|
|
int fnbr=*(int *)handle;
|
|
FileClose(fnbr);
|
|
if(!optionsuppressstatus)MMPrintString("TFTP transfer complete\r\n");
|
|
}
|
|
int tftp_read(void* handle, void* buf, int bytes){
|
|
int n_read;
|
|
int fnbr=*(int *)handle;
|
|
if(filesource[fnbr]==FATFSFILE) f_read(FileTable[fnbr].fptr, buf, bytes, (UINT *)&n_read);
|
|
else n_read=lfs_file_read(&lfs, FileTable[fnbr].lfsptr, buf, bytes);
|
|
return n_read;
|
|
}
|
|
int tftp_write(void* handle, struct pbuf* p){
|
|
int nbr;
|
|
int fnbr=*(int *)handle;
|
|
if(filesource[fnbr]==FATFSFILE) f_write(FileTable[fnbr].fptr, p->payload, p->tot_len, (UINT *)&nbr);
|
|
else {
|
|
nbr=FSerror=lfs_file_write(&lfs, FileTable[fnbr].lfsptr, p->payload, p->tot_len);
|
|
}
|
|
if(FSerror>0)FSerror=0;
|
|
ErrorCheck(tftp_fnbr);
|
|
return nbr;
|
|
}
|
|
void tftp_error(void* handle, int err, const char* msg, int size){
|
|
int fnbr=*(int *)handle;
|
|
ForceFileClose(fnbr);
|
|
MMPrintString("TFTP Error: ");
|
|
MMPrintString((char *)msg);
|
|
PRet();
|
|
}
|
|
int cmd_tftp_server_init(void){
|
|
ctx.open=tftp_open;
|
|
ctx.close=tftp_close;
|
|
ctx.error=tftp_error;
|
|
ctx.write=tftp_write;
|
|
ctx.read=tftp_read;
|
|
tftp_init_server(&ctx);
|
|
return 1;
|
|
} |