SystemGui/Sources/PICUploader/PICUploader.h

177 lines
4.7 KiB
C++

#ifndef PICUPLOADER_H
#define PICUPLOADER_H
#include <QObject>
#include "PICUploaderGui.h"
#include "HexFile.h"
#include <QTcpSocket>
#include "BootloaderProtocol.h"
enum eBootloaderUploadSMEvents
{
BOOTLOADER_UPLOAD_SM_TICK_EVENT,
BOOTLOADER_UPLOAD_SM_NEW_CMD_EVENT,
BOOTLOADER_UPLOAD_SM_MAX_EVENT
};
enum eBootloaderSMCmdEvents
{
BOOTLOADER_UPLOAD_ERASE_FLASH_GUI_CMD,
BOOTLOADER_UPLOAD_START_UPLOAD_GUI_CMD,
BOOTLOADER_UPLOAD_START_FULL_UPDATE_GUI_CMD,
BOOTLOADER_UPLOAD_ABORT_GUI_CMD,
BOOTLOADER_UPLOAD_BOOTLOADER_CONNECTED_CMD,
BOOTLOADER_UPLOAD_BOOTLOADER_DISCONNECTED_CMD,
BOOTLOADER_UPLOAD_HEARTBEAT_HOST_CMD,
BOOTLOADER_UPLOAD_ERASE_BOOTLOADER_FLASH_ACK_HOST_CMD,
BOOTLOADER_UPLOAD_ERASE_BOOTLOADER_FLASH_RESULT_HOST_CMD,
BOOTLOADER_UPLOAD_INIT_UPLOAD_HOST_CMD,
BOOTLOADER_UPLOAD_GET_STATE_HOST_CMD,
BOOTLOADER_UPLOAD_READY_FOR_DATA_HOST_CMD,
BOOTLOADER_UPLOAD_SEND_DATA_CHUNK_HOST_CMD,
BOOTLOADER_UPLOAD_UPLOAD_FINISHED_HOST_CMD,
BOOTLOADER_UPLOAD_EXECUTE_UPGRADE_HOST_CMD,
BOOTLOADER_UPLOAD_ABORT_OPERATION_HOST_CMD,
BOOTLOADER_UPLOAD_MAX_CMD
};
typedef enum eBootloaderInterfaceSMStates
{
BOOTLOADER_INTERFACE_SM_STANDBY_STATE,
BOOTLOADER_INTERFACE_SM_BOOTLDR_CONNECTED_STATE,
BOOTLOADER_INTERFACE_SM_ERASE_FLASH_STATE,
BOOTLOADER_INTERFACE_SM_WAIT_READY_FOR_DATA_FROM_HOST_STATE,
BOOTLOADER_INTERFACE_SM_INIT_UPLOAD_STATE,
BOOTLOADER_INTERFACE_SM_SEND_DATA_STATE,
BOOTLOADER_INTERFACE_SM_DATA_FINISHED_STATE,
BOOTLOADER_UPLOAD_MAX_STATE
}BootloaderInterfaceSMStates;
typedef enum eBootloaderFirmwareUploadSMStates
{
BOOTLOADER_FIRM_UPLD_STANDBY_STATE,
// BOOTLOADER_FIRM_UPLD_WAIT_FOR_HOST_READY_STATE,
BOOTLOADER_FIRM_UPLD_SEND_CHUNK_STATE,
BOOTLOADER_FIRM_UPLD_FINISHED_STATE,
BOOTLOADER_FIRM_UPLD_MAX_STATE
}BootloaderFirmwareUpldState;
enum eBootloaderFirmwareUploadEvents
{
BOOTLOADER_FIRM_UPLD_TICK_EVENT,
BOOTLOADER_FIRM_UPLD_CMD_EVENT,
BOOTLOADER_FIRM_UPLD_MAX_EVENT
};
enum eBootloaderFirmwareUploadSMCmd
{
BOOTLOADER_FIRM_UPLD_INIT_UPLOAD_CMD,
BOOTLOADER_FIRM_UPLD_CHUNK_RX_RESPONSE_CMD,
BOOTLOADER_FIRM_UPLD_ABORT_UPLOAD_CMD,
BOOTLOADER_FIRM_UPLD_MAX_CMD
};
enum eBootloaderProtocolDataTransferError
{
BOOTLOADER_CHUNK_TRANSFER_SUCCESS = 1,
BOOTLOADER_CHUNK_TRANSFER_ERROR_RESEND = 2,
BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_FAILURE = 3,
BOOTLOADER_CHUNK_TRANSFER_ERROR_INVALID_CHUNK_INDEX = 4,
BOOTLOADER_CHUNK_TRANSFER_ERROR_FLASH_ERROR = 5,
BOOTLOADER_CHUNK_TRANSFER_MAX_ERROR
};
enum eBootloaderProtocolInitUploadError
{
BOOTLOADER_INIT_UPLOAD_FAILED = 0,
BOOTLOADER_INIT_UPLOAD_SUCCESS = 1,
BOOTLOADER_INIT_UPLOAD_ERROR_FLASH_NOT_ERASED = 2,
BOOTLOADER_INIT_UPLOAD_MAX_ERROR
};
enum eBootloaderFirmwareUploadRes
{
BOOTLOADER_FIRM_UPLD_STANDBY_RES,
BOOTLOADER_FIRM_UPLD_SENDING_RES,
BOOTLOADER_FIRM_UPLD_FINISHED_RES,
BOOTLOADER_FIRM_UPLD_ERROR_RES,
BOOTLOADER_FIRM_UPLD_TIMEOUT_RES,
BOOTLOADER_FIRM_UPLD_ABORT_RES,
BOOTLOADER_FIRM_UPLD_OK_RES,
BOOTLOADER_FIRM_UPLD_MAX_RES
};
//Used for both ACK and erase operation result
enum eBootloaderFlashEraseResult
{
BOOTLOADER_FLASH_ERASE_ERROR = 0,
BOOTLOADER_FLASH_ERASE_OK = 1,
BOOTLOADER_FLASH_ERASE_MAX_RESULT
};
class CPICUploader : public QObject
{
Q_OBJECT
public:
explicit CPICUploader(CPICUploaderGui *Gui);
int OpenHexFileRequest(QString FilePath);
int Start();
CPICUploaderGui *mPICUploaderGui;
CHexFile mHexFile;
QTcpSocket mBootloaderSocket;
CBootloaderProtocol mBootloaderProtocol;
int ConnectToBootloader(QString IP);
int DisconnectFromBootloader();
int SendSingleCmdRequest(int CmdID);
int SendCmdRequest(int CmdID, QByteArray Data);
int GuiEvent(int EventID, void* Data=0);
int ShowHexFileInfoRequest();
int BootloaderRxCmd(int CmdID, QByteArray Data);
int BootloaderFirmwareUploadStateMachine(int Event, int Cmd, int CmdResult = 1, int CmdParam = 0xBAADCAFE);
int BootloaderInterfaceStateMachine(int Event, int Cmd, int CmdParam = 0, void *Data = 0);
private:
BootloaderInterfaceSMStates mBootloaderInterfaceSMState;
int ResetBooloaderInterfaceStateMachine();
BootloaderFirmwareUpldState mBootloaderFirmwareUpldState;
int ResetFirmwareUploadStateMachine();
unsigned int mFirmwareUploadBufferSize;
unsigned int mFirmwareUploadCurFrame;
QByteArray mFirmwareData;
QByteArray GetCurDataChunk(bool &IsLastChunk);
QByteArray IntToByteArray(int);
signals:
public slots:
void BootloaderSocketConnected();
void BootloaderSocketDisconnected();
void BootloaderDataAvailable();
void BootloaderSocketError(QAbstractSocket::SocketError);
};
#endif // PICUPLOADER_H