@@ -57,7 +57,8 @@ enum class FtmCommands
5757 DirDelete,
5858 Cancel =90 ,
5959 ModuleVersion =100 ,
60- FwUpdate
60+ FwUpdate,
61+ CheckFeatures
6162};
6263
6364bool FileTransferModule::checkOpenFile (uint8_t *resultData,uint8_t &resultLength)
@@ -144,7 +145,8 @@ void FileTransferModule::writeFile(uint16_t sequence, uint8_t *data, uint8_t len
144145
145146if (_lastSequence +1 != sequence)
146147 {
147- if (!_file.seek ((sequence -1 ) * (_size -3 )))
148+ uint16_t pos = ((sequence -1 ) * (_size -3 ));
149+ if (!_file.seek (pos))
148150 {
149151pushByte (0x46 , resultData);
150152 resultLength =1 ;
@@ -262,6 +264,12 @@ bool FileTransferModule::processFunctionProperty(uint8_t objectIndex, uint8_t pr
262264return true ;
263265 }
264266
267+ case FtmCommands::CheckFeatures:
268+ {
269+ cmdCheckFeatures (length, data, resultData, resultLength);
270+ return true ;
271+ }
272+
265273case FtmCommands::FwUpdate:
266274 {
267275cmdFwUpdate (length, data, resultData, resultLength);
@@ -497,13 +505,29 @@ void FileTransferModule::cmdFileUpload(uint8_t length, uint8_t *data, uint8_t *r
497505
498506if (data[0 ] ==0x00 && data[1 ] ==0x00 )
499507 {
500- const char *filename = (const char *)(data +3 );
508+ const char *filename = (const char *)(data +4 );
501509if (checkOpenFile (resultData, resultLength) ||checkOpenDir (resultData, resultLength))return ;
502510
511+ if (data[3 ] >1 )
512+ {
513+ pushByte (0x42 , resultData);
514+ logErrorP (" Start file upload to\" %s\" is failed" , filename);
515+ return ;
516+ }
517+
503518 _size = data[2 ];
504519 resultLength =1 ;
505520
506- _file = LittleFS.open (filename," w" );
521+ // TODO maybe add a byte to truncate the file if it is not the same
522+ bool isResume = data[3 ] ==0x01 ;
523+ if (isResume)
524+ {
525+ logInfoP (" Resume file upload" );
526+ }else {
527+ logInfoP (" Truncate file upload" );
528+ }
529+
530+ _file = LittleFS.open (filename, isResume ?" r+" :" w" );
507531if (!_file)
508532 {
509533pushByte (0x42 , resultData);
@@ -582,5 +606,16 @@ void FileTransferModule::cmdFileDownload(uint8_t length, uint8_t *data, uint8_t
582606 _lastSequence = sequence;
583607}
584608
609+ void FileTransferModule::cmdCheckFeatures (uint8_t length,uint8_t *data,uint8_t *resultData,uint8_t &resultLength)
610+ {
611+ uint8_t result =0 ;
612+ result |=0x1 ;// Resume
613+ #ifdef ARDUINO_ARCH_RP2040
614+ result |=0x2 ;// Update
615+ #endif
616+ resultData[0 ] = result;
617+ resultLength =1 ;
618+ }
619+
585620FileTransferModule openknxFileTransferModule;
586621#endif