37 #if __has_include ("Commander-API.hpp")
38 #include "Commander-API.hpp"
44#ifdef SHELLMINATOR_USE_ARDUINO_SERIAL
48 arduinoSerialChannel.
select( serialPort_p );
49 channel = &arduinoSerialChannel;
59 cmd_buff[ 0 ][ 0 ] =
'\0';
70 arduinoSerialChannel.
select( serialPort_p );
71 channel = &arduinoSerialChannel;
81 cmd_buff[ 0 ][ 0 ] =
'\0';
84 execution_fn = execution_fn_p;
90#ifdef SHELLMINATOR_USE_ARDUINO_32U4_SERIAL
94 arduino32U4SerialChannel.
select( serialPort_p );
95 channel = &arduino32U4SerialChannel;
105 cmd_buff[ 0 ][ 0 ] =
'\0';
116 arduino32U4SerialChannel.
select( serialPort_p );
117 channel = &arduino32U4SerialChannel;
127 cmd_buff[ 0 ][ 0 ] =
'\0';
130 execution_fn = execution_fn_p;
136#ifdef SHELLMINATOR_USE_WIFI_CLIENT
140 wifiChannel.
select( resp );
141 channel = &wifiChannel;
151 cmd_buff[ 0 ][ 0 ] =
'\0';
162 wifiChannel.
select( resp );
163 channel = &wifiChannel;
173 cmd_buff[ 0 ][ 0 ] =
'\0';
176 execution_fn = execution_fn_p;
191 logo = (
char*)logo_p;
198 execution_fn = execution_fn_p;
205 channel -> write( 27 );
206 channel -> print( (
const char*)
"[H" );
207 channel -> write( 27 );
208 channel -> print( (
const char*)
"[J" );
212void Shellminator::printBanner() {
220 channel -> print( banner );
227 channel -> print( (
const char*)
":~$ " );
272 channel -> print( (
const char*)
"\b \b" );
276void Shellminator::redrawLine(){
282 channel -> write( 27 );
283 channel -> print(
"[2K\r" );
287 #ifdef COMMANDER_API_VERSION
306 for( i = 0; i < cmd_buff_cntr; i++ ){
308 #ifdef COMMANDER_API_VERSION
311 if( cmd_buff[ 0 ][ i ] ==
' ' ){
318 channel -> print( cmd_buff[ 0 ][ i ] );
324 for( i = cmd_buff_cntr; i > cursor; i-- ){
326 channel -> write( 27 );
327 channel -> print(
'[' );
328 channel -> print(
'1' );
329 channel -> print(
'D' );
335 #ifdef COMMANDER_API_VERSION
341void Shellminator::process(
char new_char ) {
348 if ( ( new_char ==
'\b' ) || ( new_char == 127 ) ) {
357 for( i = (cursor - 1); i < ( cmd_buff_cntr - 1 ); i++ ){
359 cmd_buff[ 0 ][ i ] = cmd_buff[ 0 ][ i + 1 ];
380 else if ( new_char ==
'\r' ) {
388 cmd_buff[ 0 ][ cmd_buff_cntr ] =
'\0';
391 channel -> print(
'\r' );
392 channel -> print(
'\n' );
395 if ( cmd_buff_cntr > 0 ) {
398 if( execution_fn != NULL ){
401 execution_fn( cmd_buff[ 0 ] );
405 #ifdef COMMANDER_API_VERSION
409 else if( commander != NULL ){
412 #ifdef SHELLMINATOR_USE_ARDUINO_SERIAL
413 if( channel == &arduinoSerialChannel ){
415 commander -> execute( cmd_buff[ 0 ], arduinoSerialChannel.
getSerialObject() );
420 #ifdef SHELLMINATOR_USE_ARDUINO_32U4_SERIAL
421 if( channel == &arduino32U4SerialChannel ){
423 commander -> execute( cmd_buff[ 0 ], arduino32U4SerialChannel.
getSerialObject() );
428 #ifdef SHELLMINATOR_USE_WIFI_CLIENT
429 if( channel == &wifiChannel ){
442 channel -> print( (
const char*)
"cmd: " );
443 channel -> print( cmd_buff[ 0 ] );
444 channel -> print(
'\r' );
445 channel -> print(
'\n' );
476 else if ( new_char == 27 ) {
487 else if ( escape_state == 1 ) {
490 if ( new_char ==
'[' ) {
519 else if ( escape_state == 2 ) {
522 switch ( new_char ) {
528 if( upArrowOverrideFunc ){
530 upArrowOverrideFunc();
542 if ( cmd_buff[ cmd_buff_dim ][0] ==
'\0' ) {
557 cmd_buff_cntr = strlen( cmd_buff[ 0 ] );
558 cursor = cmd_buff_cntr;
578 if( downArrowOverrideFunc ){
580 downArrowOverrideFunc();
589 if ( cmd_buff_dim > 2 ) {
603 cmd_buff_cntr = strlen( cmd_buff[ 0 ] );
604 cursor = cmd_buff_cntr;
613 else if ( cmd_buff_dim == 2 ) {
618 for ( i = 0; i < cmd_buff_cntr; i++ ) {
642 if( rightArrowOverrideFunc ){
644 rightArrowOverrideFunc();
650 if( cursor < cmd_buff_cntr ){
652 channel -> write( 27 );
653 channel -> print(
'[' );
654 channel -> print(
'1' );
655 channel -> print(
'C' );
673 if( leftArrowOverrideFunc ){
675 leftArrowOverrideFunc();
683 channel -> write( 27 );
684 channel -> print(
'[' );
685 channel -> print(
'1' );
686 channel -> print(
'D' );
721 else if ( escape_state == 3 ) {
723 if( new_char ==
'~' ){
731 if ( cursor != cmd_buff_cntr ) {
733 for( i = cursor; i < ( cmd_buff_cntr - 1 ); i++ ){
735 cmd_buff[ 0 ][ i ] = cmd_buff[ 0 ][ i + 1 ];
756 else if( new_char ==
'\t' ){
759 #ifdef COMMANDER_API_VERSION
764 cursor = cmd_buff_cntr;
767 Commander::API_t *commandAddress;
777 bool conflict =
false;
789 commandAddress = commander -> operator[]( (
int)i );
795 while( commandAddress ){
798 if( strncmp( (
const char*)cmd_buff[ 0 ], commandAddress -> name, cmd_buff_cntr ) == 0 ){
801 if( ( nextChar ==
'\0' ) && ( cmd_buff_cntr < COMMANDER_MAX_COMMAND_SIZE ) && ( commandAddress -> name[ cmd_buff_cntr ] !=
'\0' ) ){
804 nextChar = commandAddress -> name[ cmd_buff_cntr ];
812 if( commandAddress -> name[ cmd_buff_cntr ] != nextChar ){
827 commandAddress = commander -> operator[]( (
int)i );
833 if( nextChar ==
'\0' ){
859 else if( new_char == 0x03 ){
871 channel -> print(
'\r' );
872 channel -> print(
'\n' );
888 if( cursor == cmd_buff_cntr ){
890 cmd_buff[ 0 ][ cmd_buff_cntr ] = new_char;
899 for( i = cmd_buff_cntr; i > cursor; i-- ){
900 cmd_buff[ 0 ][ i ] = cmd_buff[ 0 ][ i - 1 ];
904 cmd_buff[ 0 ][ cursor ] = new_char;
931 if( cursor == cmd_buff_cntr ){
935 channel -> print( new_char );
958 upArrowOverrideFunc = func;
964 downArrowOverrideFunc = func;
970 leftArrowOverrideFunc = func;
976 rightArrowOverrideFunc = func;
988 upArrowOverrideFunc = NULL;
994 downArrowOverrideFunc = NULL;
1000 leftArrowOverrideFunc = NULL;
1006 rightArrowOverrideFunc = NULL;
1012 abortKeyFunc = NULL;
1024 while ( channel -> available() ) {
1027 c = (char)channel -> read();
1032 #ifdef COMMANDER_API_VERSION
1033 commandCheckTimerStart = millis();
1034 commandChecked =
false;
1039 #ifdef COMMANDER_API_VERSION
1042 Commander::API_t *commandAddress;
1046 if( commander && !commandChecked ){
1049 if( ( millis() - commandCheckTimerStart ) > 100 ){
1063 for( i = 0; i <= cmd_buff_cntr; i++ ){
1065 if( ( cmd_buff[ 0 ][ i ] ==
' ' ) || ( i == cmd_buff_cntr ) ){
1067 charCopy = cmd_buff[ 0 ][ i ];
1068 cmd_buff[ 0 ][ i ] =
'\0';
1076 commandAddress = commander -> operator[]( cmd_buff[0] );
1080 if( commandAddress ){
1082 commandFound =
true;
1088 commandFound =
false;
1093 cmd_buff[ 0 ][ i ] = charCopy;
1096 commandChecked =
true;
1116 channel -> write( 27 );
1117 channel -> print(
'[' );
1118 channel -> print( style );
1119 channel -> print(
';' );
1120 channel -> print( color );
1121 channel -> print(
'm' );
1128 serialPort -> write( 27 );
1129 serialPort -> print(
'[' );
1130 serialPort -> print( style );
1131 serialPort -> print(
';' );
1132 serialPort -> print( color );
1133 serialPort -> print(
'm' );
1140 channel -> print( logo );
1144#ifdef COMMANDER_API_VERSION
1146void Shellminator::attachCommander( Commander* commander_p ){
1148 commander = commander_p;
1155#ifdef SHELLMINATOR_ENABLE_QR_SUPPORT
1157void Shellminator::generateQRText(
char* text,
enum qrcodegen_Ecc ecc ){
1179 result = qrcodegen_encodeText( text,
1183 qrcodegen_VERSION_MIN,
1184 qrcodegen_VERSION_MAX,
1185 qrcodegen_Mask_AUTO,
1198 qr_size = qrcodegen_getSize( qr_data );
1209 for( y = 0; y < ( qr_size / 2 ); y++ ){
1212 channel -> println();
1215 for( x = 0; x < qr_size; x++ ){
1218 upper_pixel = qrcodegen_getModule( qr_data, x, ( y * 2 ) );
1221 lower_pixel = qrcodegen_getModule( qr_data, x, ( ( y * 2 ) + 1 ) );
1226 if( upper_pixel && lower_pixel ){
1228 channel -> print(
"\u2588" );
1234 if( upper_pixel && ( !lower_pixel ) ){
1236 channel -> print(
"\u2580" );
1242 if( ( !upper_pixel ) && lower_pixel ){
1244 channel -> print(
"\u2584" );
1251 channel -> print(
" " );
1259 if( ( qr_size % 2 ) != 0 ){
1262 channel -> println();
1265 for( x = 0; x < qr_size; x++ ){
1269 upper_pixel = qrcodegen_getModule( qr_data, x, ( qr_size - 1 ) );
1274 channel -> print(
"\u2580" );
1281 channel -> print(
" " );
1288 channel -> println();
1292void Shellminator::generateQRText(
const char* text,
enum qrcodegen_Ecc ecc ){
1294 generateQRText( (
char*)text, ecc );
1298void Shellminator::generateQRText(
const char* text ){
1300 generateQRText( (
char*)text, qrcodegen_Ecc_MEDIUM );
1304void Shellminator::generateQRText(
char* text ){
1306 generateQRText( text, qrcodegen_Ecc_MEDIUM );
#define SHELLMINATOR_BUFF_LEN
+---— Costum configuration ---—+ | | | This is where you have to config | | your defines!...
#define SHELLMINATOR_VERSION
Version of the module.
#define SHELLMINATOR_BANNER_LEN
Maximum length of the banner text.
#define SHELLMINATOR_LOGO_COLOR
#define SHELLMINATOR_BUFF_DIM
Definition of the maximum length of the previous command memory.
#define SHELLMINATOR_LOGO_FONT_STYLE
Color and style of the startup logo.
void begin(char *banner_p)
Shellminator initialization function.
void clear()
Clear screen.
void freeLeftArrow()
Reset left arrow key functionality to default.
void overrideUpArrow(void(*func)(void))
Override up arrow key behaviour.
void update()
Update function.
void addExecFunc(void(*execution_fn_p)(char *))
Execution function adder function.
bool enableFormatting
This flag enables or disables character formatting.
void overrideRightArrow(void(*func)(void))
Override right arrow key behaviour.
void freeAbortKey()
Reset abort key functionality to default.
void sendBackspace()
Sends a backspace.
void freeUpArrow()
Reset up arrow key functionality to default.
void overrideDownArrow(void(*func)(void))
Override down arrow key behaviour.
Shellminator(HardwareSerial *serialPort_p)
Shellminator Constructor.
void overrideAbortKey(void(*func)(void))
Override abort key behaviour.
void attachLogo(char *logo_p)
This function attaches a logo to the terminal.
void overrideLeftArrow(void(*func)(void))
Override left arrow key behaviour.
void setTerminalCharacterColor(uint8_t style, uint8_t color)
Bring some color into your code.
void freeRightArrow()
Reset right arrow key functionality to default.
void drawLogo()
Draws the startup logo.
void freeDownArrow()
Reset down arrow key functionality to default.
static const char * version
String that holds the version information.
void select(Serial_ *serialPort_p)
Select Serial Port.
Serial_ * getSerialObject()
Get the address of the chosen Serial Port.
void select(HardwareSerial *serialPort_p)
Select Serial Port.
HardwareSerial * getSerialObject()
Get the address of the chosen Serial Port.
void select(WiFiClient *client_p)
Select WiFi Client.
WiFiClient * getClientObject()
Get the address of the chosen WiFi Client.