Files
usbserial-dw/xymodem.h

142 lines
2.5 KiB
C++

#ifndef modem_HH
#define modem_HH
#include <string>
#include <fstream>
#include "Thread.h"
#include "TimeoutSerial.h"
using std::fstream;
using std::string;
class __tools;
struct y_modem_data
{
y_modem_data() : first_ack(false) {}
bool first_ack;
bool first_pkt;
};
class Operator: public Thread< Operator >
{
public:
Operator (TimeoutSerial &c);
private:
int Entry(); //Strting point
void SetupInfoBlock (string &block);
void UpdateProgress (int = 0);
bool GetChar();
bool IsChar ();
bool IsAck ();
bool IsSync ();
bool IsNack ();
bool IsCan ();
protected:
void SendBlock(char *p, int size);
void SendEot ();
virtual int GetBlockSize () = 0;
virtual int SetupBlockHdr () = 0;
virtual int SetupCheckSum (char *data, char *dest) = 0;
virtual char GetSync () = 0;
virtual char GetAck () = 0;
virtual char GetCan () = 0;
virtual char GetNack () = 0;
virtual char GetEot () = 0;
virtual char GetProto() = 0;
virtual void SetSize (int) {}
virtual void SetMode (int) {}
virtual int GetMode () { return 0; }
public:
void SessionStartup (const string &);
void StartTransfert ();
protected:
TimeoutSerial *com, *q;
fstream f;
int pkt;
int fsize,psize;
int count;
string fname;
string ibuff;
string obuff;
};
static const int LEN_B_XMODEM = 128;
// bitmask
enum {
XMODEM1K=0x01,
XMODEMCRC=0x02,
};
class XModem : public Operator {
public:
XModem (TimeoutSerial &c);
private:
int GetBlockSize () { return psize; }
int SetupBlockHdr ();
int SetupCheckSum (char *data, char *dest);
char GetSync ();
char GetAck ();
char GetNack ();
char GetCan ();
char GetProto();
char GetEot ();
int GetMode () {return xmodem_mode;}
void SetSize (int size);
void SetMode (int mode) {
xmodem_mode|=mode;
if (mode&XMODEM1K) psize=1024;
}
public:
int xmodem_mode;
private:
__tools &t;
int psize;
};
/* we don't use the standard 128 block but 1024 only
*/
static const int LEN_B_YMODEM = 1024;
class YModem : public Operator {
public:
YModem (TimeoutSerial &c);
private:
int GetBlockSize () { return psize; }
int SetupBlockHdr ();
int SetupCheckSum (char *data, char *dest);
char GetSync ();
char GetAck ();
char GetNack ();
char GetCan ();
char GetProto();
char GetEot ();
void SetSize (int size);
private:
__tools &t;
int psize;
};
#endif // modem_HH