Adds file transfer capability to SimpleSerialProtocol
Dependents: SerialFileReceiver
Diff: SerialFileTransfer.h
- Revision:
- 0:31dff1f79b4f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SerialFileTransfer.h Wed Aug 27 17:59:05 2014 +0000 @@ -0,0 +1,97 @@ +#ifndef _SFT_PROTOCOL_H +#define _SFT_PROTOCOL_H + +#include <mbed.h> +#include <SimpleSerialProtocol/Protocol.h> + +//class will receive a packet and echo it back out +class SFTProtocol { +public: + SFTProtocol() { //LED1 to 4 for a status led, NC to disable + transfer_in_progress = false; + chunks_total = 0; + chunks_last = 0; + packet_retry_attempts = 0; + fp = 0; + } + virtual ~SFTProtocol() {}; + + //the callbacks and packet sending methods + virtual void update(SimpleSerialProtocol::Protocol* comms); + void onFileStart(SimpleSerialProtocol::Protocol* comms, SimpleSerialProtocol::Packet* packet); + void ack(SimpleSerialProtocol::Protocol* comms, uint8_t ack_type); + void onFileStream(SimpleSerialProtocol::Protocol* comms, SimpleSerialProtocol::Packet* packet); + + //variables to control the transfer and save the file + bool transfer_in_progress; + int chunks_total; + int chunks_last; + Timer last_chunk_timer; + int packet_retry_attempts; + FILE *fp; + + + //This packed is used to start a file transfer it is sent by the client + //once received a file is created and an ack packet sent to start the file stream + class FileStartPacket : public SimpleSerialProtocol::Packet { + public: + FileStartPacket() {} + virtual ~FileStartPacket() {} + +#pragma pack(push, 1) //must pack the structure to byte boundary for raw recast to work reliably + struct Interface { + Interface() { + type = 1; // initialise the type + } + uint8_t type; + uint8_t name[9]; + uint8_t ext[4]; + uint32_t chunks; + } interface; +#pragma pack(pop) + + }; + + //A very simple Ack packet used to inform the client that we need more data, and other commands based on the ack_type value + class AckFileStartPacket : public SimpleSerialProtocol::Packet { + public: + AckFileStartPacket() {} + virtual ~AckFileStartPacket() {} + +#pragma pack(push, 1) //must pack the structure to byte boundary for raw recast to work reliably + struct Interface { + Interface() { + type = 2; // initialise the type + } + uint8_t type; + uint8_t ack_type; + } interface; +#pragma pack(pop) + + }; + + //This is the packet used to send the file data 128 bytes at a time + //its posible to send upto 256 bytes but this was causing my xbees to drop a lot of data + class FileStreamPacket : public SimpleSerialProtocol::Packet { + public: + FileStreamPacket() { } + virtual ~FileStreamPacket() {} + +#pragma pack(push, 1) //must pack the structure to byte boundary for raw recast to work reliably + struct Interface { + Interface() { + type = 3; // initialise the type + } + uint8_t type; + uint16_t chunk; + uint8_t length; + uint8_t data[128]; + + } interface; +#pragma pack(pop) + + }; + +}; + +#endif \ No newline at end of file