123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #ifndef _SHELLMATTA_H_
- #define _SHELLMATTA_H_
- #include <stdint.h>
- #include <stdbool.h>
- typedef void* shellmatta_handle_t;
- typedef enum
- {
- SHELLMATTA_OK = 0u,
- SHELLMATTA_ERROR ,
- SHELLMATTA_CONTINUE ,
- SHELLMATTA_USE_FAULT ,
- SHELLMATTA_DUPLICATE ,
- SHELLMATTA_BUSY
- } shellmatta_retCode_t;
- typedef enum
- {
- SHELLMATTA_MODE_INSERT = 0u,
- SHELLMATTA_MODE_OVERWRITE ,
- } shellmatta_mode_t;
- typedef enum
- {
- SHELLMATTA_OPT_ARG_NONE = 0u,
- SHELLMATTA_OPT_ARG_REQUIRED,
- SHELLMATTA_OPT_ARG_OPTIONAL,
- } shellmatta_opt_argtype_t;
- typedef struct
- {
- const char *paramLong;
- const char paramShort;
- shellmatta_opt_argtype_t argtype;
- } shellmatta_opt_long_t;
- typedef struct
- {
- uint32_t argStart;
- uint32_t offset;
- uint32_t nextOffset;
- uint32_t len;
- } shellmatta_opt_t;
- typedef shellmatta_retCode_t (*shellmatta_cmdFct_t)(const shellmatta_handle_t handle,
- const char *arguments,
- uint32_t length);
- typedef shellmatta_retCode_t (*shellmatta_write_t)(const char* data, uint32_t length);
- typedef struct shellmatta_cmd
- {
- char *cmd;
- char *cmdAlias;
- char *helpText;
- char *usageText;
- shellmatta_cmdFct_t cmdFct;
- struct shellmatta_cmd *next;
- } shellmatta_cmd_t;
- typedef enum
- {
- SHELLMATTA_TRANSPORT_STATE_WAIT =0u ,
- SHELLMATTA_TRANSPORT_STATE_GET_HEADER ,
- SHELLMATTA_TRANSPORT_STATE_GET_PAYLOAD ,
- SHELLMATTA_TRANSPORT_STATE_GET_CRC ,
- } shellmatta_transport_state_t;
- #define SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH ((uint8_t)(255))
- typedef struct __attribute__((__packed__))
- {
- uint8_t startOfHeader;
- uint8_t protocolVersion;
- uint8_t packetType;
- uint8_t payloadLength;
- uint8_t source;
- uint8_t destination;
- uint8_t sequenceH2S;
- uint8_t sequenceS2H;
- char payload[SHELLMATTA_TRANPORT_PAYLOAD_MAXLENGTH];
- uint32_t checksum;
- } shellmatta_transport_packet_t;
- typedef struct
- {
- shellmatta_transport_state_t state;
- bool active;
- bool mandatory;
- bool continueStep;
- uint8_t sequenceH2S;
- uint8_t sequenceS2H;
- shellmatta_write_t originalWrite;
- uint32_t headerIndex;
- uint32_t payloadIndex;
- uint32_t crcIndex;
- shellmatta_transport_packet_t packetBuffer;
- shellmatta_transport_packet_t outputPacketBuffer;
- } shellmatta_transport_layer_t;
- typedef struct
- {
- uint32_t magic;
- char *buffer;
- uint32_t bufferSize;
- uint32_t inputCount;
- uint32_t byteCounter;
- uint32_t lastNewlineIdx;
- uint32_t cursor;
- uint32_t stdinIdx;
- uint32_t stdinLength;
- char *historyBuffer;
- uint32_t historyBufferSize;
- uint32_t historyStart;
- uint32_t historyEnd;
- uint32_t historyRead;
- bool historyReadUp;
- uint32_t tabCounter;
- uint32_t escapeCounter;
- char escapeChars[4u];
- uint32_t hereStartIdx;
- uint32_t hereDelimiterIdx;
- uint32_t hereLength;
- bool echoEnabled;
- bool dirty;
- const char *prompt;
- char delimiter;
- shellmatta_mode_t mode;
- shellmatta_write_t write;
- shellmatta_cmd_t helpCmd;
- shellmatta_cmd_t *cmdList;
- shellmatta_cmd_t *continuousCmd;
- shellmatta_cmd_t *busyCmd;
- bool cmdListIsConst;
- shellmatta_opt_t optionParser;
- uint32_t transportBusyMark;
- shellmatta_transport_layer_t transportLayer;
- } shellmatta_instance_t;
- #define SHELLMATTA_WRITE(data, length) inst->transportLayer.active == true ? \
- shellmatta_transport_write((shellmatta_transport_layer_t*)&inst->transportLayer, (data), (length)) : \
- inst->write((data), (length))
- shellmatta_retCode_t shellmatta_doInit( shellmatta_instance_t *inst,
- shellmatta_handle_t *handle,
- char *buffer,
- uint32_t bufferSize,
- char *historyBuffer,
- uint32_t historyBufferSize,
- const char *prompt,
- const shellmatta_cmd_t *cmdList,
- shellmatta_write_t writeFct);
- shellmatta_retCode_t shellmatta_resetShell( shellmatta_handle_t handle,
- bool printPrompt);
- shellmatta_retCode_t shellmatta_addCmd( shellmatta_handle_t handle,
- shellmatta_cmd_t *cmd);
- shellmatta_retCode_t shellmatta_removeCmd( shellmatta_handle_t handle,
- shellmatta_cmd_t *cmd);
- shellmatta_retCode_t shellmatta_configure( shellmatta_handle_t handle,
- shellmatta_mode_t mode,
- bool echoEnabled,
- char delimiter);
- shellmatta_retCode_t shellmatta_processData(shellmatta_handle_t handle,
- char *data,
- uint32_t size);
- shellmatta_retCode_t shellmatta_write( shellmatta_handle_t handle,
- char *data,
- uint32_t length);
- shellmatta_retCode_t shellmatta_read( shellmatta_handle_t handle,
- char **data,
- uint32_t *length);
- shellmatta_retCode_t shellmatta_opt( shellmatta_handle_t handle,
- const char *optionString,
- char *option,
- char **argument,
- uint32_t *argLen);
- shellmatta_retCode_t shellmatta_opt_long( shellmatta_handle_t handle,
- const shellmatta_opt_long_t *longOptions,
- char *option,
- char **argument,
- uint32_t *argLen);
- shellmatta_retCode_t shellmatta_transport_flush(shellmatta_transport_layer_t *transportLayer);
- #ifndef SHELLMATTA_STRIP_PRINTF
- shellmatta_retCode_t shellmatta_printf( shellmatta_handle_t handle,
- const char *fmt,
- ...);
- #endif
- #endif
|