Giter Site home page Giter Site logo

playableelectronics / microshell Goto Github PK

View Code? Open in Web Editor NEW

This project forked from marcinbor85/microshell

0.0 0.0 0.0 619 KB

MicroShell is a lightweight pure C implementation of shell emulator dedicated for embedded bare-metal systems.

Home Page: https://microshell.pl

License: MIT License

JavaScript 0.35% C 97.30% CSS 0.10% HTML 0.55% CMake 1.61% Dockerfile 0.08%

microshell's Introduction

Build Status codecov

MicroShell

Lightweight pure C implementation of virtual shell, compatible with VT100 terminal. Support root tree, run-time mounting paths, global commands, and much more. Works out-of-the-box on Arduino-compatible boards. Dedicated for bare-metal embedded systems. Thanks to the asynchronous architecture it does not block operations and can be easily implemented even on small microcontrollers with relatively small resources.

Project Homepage
LIVE DEMO <- needs PC web browser (not mobile)

alt text

Features

  • names autocompletation (do You like a TAB-functionality on You favorite bash shell?)
  • no dynamic allocations (no memory leaks - no problem)
  • hardware independent (works just as well on AVR, PIC, STM32, ESP32 as it on x86 or RPI)
  • rich set of examples (available in the Arduino Library Manager)
  • pure C source code (works on rich set of compilers)
  • backspace key feature (simply works)
  • compatible vith VT100 standard (works out of the box with default putty configuration)
  • easy to extend (adding more "weird" features it has never been easier)
  • buildin commands (must-have, basic support of LS, CAT, PWD, HELP, XXD, ECHO)
  • scalable (configuration allows You to exclude unnecessary modules from building)
  • translation-ready (do You want Hindi translation? no problem!)
  • no internal buffers (support unlimited data stream lengths)
  • no static variables (possibility to use multiple independent shells in single system)
  • object oriented architecture (pointers attack!)
  • support root tree with static virtual files with callbacks (full customization)
  • extremely simple to integrate (only 1 simple interface with IO operations)
  • asynchronous architecture (static callbacks is not a problem)
  • non-blocking api (You just need to call one non-blocking function on main loop)
  • unit and functional tests (for greater certainty that nothing will break down)

Build

In case you didn't use git clone --recursive you'll need to manually pull in additional submodules with:

git submodule update --init

Build, test and run DEMO:

cmake -Bbuild .
cd build
make
make test
make coverage
./bin/demo

Usage

Define I/O interface:

// non-blocking read interface
static int ush_read(struct ush_object *self, char *ch)
{
    // should be implemented as a FIFO
    if (Serial.available() > 0) {
        *ch = Serial.read();
        return 1;
    }
    return 0;
}

// non-blocking write interface
static int ush_write(struct ush_object *self, char ch)
{
    // should be implemented as a FIFO
    return (Serial.write(ch) == 1);
}

// I/O interface descriptor
static const struct ush_io_interface ush_iface = {
    .read = ush_read,
    .write = ush_write,
};

Define shell descriptor and shell instance:

// working buffers allocations (size could be customized)
#define BUF_IN_SIZE    32
#define BUF_OUT_SIZE   32
#define PATH_MAX_SIZE  32

static char ush_in_buf[BUF_IN_SIZE];
static char ush_out_buf[BUF_OUT_SIZE];

// microshell instance handler
static struct ush_object ush;

// microshell descriptor
static const struct ush_descriptor ush_desc = {
    .io = &ush_iface,                           // I/O interface pointer
    .input_buffer = ush_in_buf,                 // working input buffer
    .input_buffer_size = sizeof(ush_in_buf),    // working input buffer size
    .output_buffer = ush_out_buf,               // working output buffer
    .output_buffer_size = sizeof(ush_out_buf),  // working output buffer size
    .path_max_length = PATH_MAX_SIZE,           // path maximum length (stack)
    .hostname = "arduino",                      // hostname (in prompt)
};

// root directory handler
static struct ush_node_object root;

Setup and run:

void setup()
{
    // initialize I/O interface
    Serial.begin(115200UL);

    // initialize microshell instance
    ush_init(&ush, &ush_desc);

    // mount root directory (root must be first)
    ush_node_mount(&ush, "/", &root, NULL, 0);

    // mount other directories here
    // ...
}

void loop()
{
    // non-blocking microshell service
    ush_service(&ush);

    // do other non-blocking stuff here
    // ...
}

Contribution

If You want to contribute this project - excellent! Fork it, make bugs, and send a PR :)
If You want to support me in developing this project - please donate!
paypal

microshell's People

Contributors

marcinbor85 avatar rostcode avatar ghostfire90 avatar synco avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.