diff --git a/.gitignore b/.gitignore index 5321bb1..c810e44 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ examples/.DS_Store bitlash.o .DS_Store Bitlash/ +.pioenvs +.piolibdeps +*~ diff --git a/bitlash.cpp b/bitlash.c similarity index 97% rename from bitlash.cpp rename to bitlash.c index a529a3f..403bc9d 100644 --- a/bitlash.cpp +++ b/bitlash.c @@ -34,6 +34,8 @@ ***/ +#ifndef ESP32 + #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else @@ -46,6 +48,7 @@ //#include "src/bitlash-arduino.c" #endif + #include "src/bitlash-cmdline.c" #include "src/bitlash-eeprom.c" #include "src/bitlash-error.c" @@ -58,3 +61,7 @@ #include "src/bitlash-taskmgr.c" #include "src/bitlash-api.c" #include "src/eeprom.c" + +#endif //ifndef ESP32 + + diff --git a/library.json b/library.json new file mode 100644 index 0000000..948f2b9 --- /dev/null +++ b/library.json @@ -0,0 +1,17 @@ +{ + "name": "bitlash", + "keywords": "console cli shell bitlash", + "description": "Bitlash is a tiny language interpreter that provides a serial port shell environment for bit banging and hardware hacking.", + "build": { + "flags": "", + "srcFilter": "+<*.cpp> - - -" + }, + "repository": + { + "type": "git", + "url": "https://github.com/billroy/bitlash.git" + }, + "frameworks": "arduino", + "platforms": "espressif32" + +} diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..7e5dd74 --- /dev/null +++ b/library.properties @@ -0,0 +1,10 @@ +name=bitlash +version=2.1 +author=Bill Roy +maintainer=Bill Roy +sentence=Bitlash is a tiny CLI. +paragraph=With builtin language interpreter that provides a serial port shell environment for bit banging and hardware hacking. +category=Other +url=bitlash.net +architectures=* + diff --git a/src/bitlash-api.c b/src/bitlash-api.cpp similarity index 94% rename from src/bitlash-api.c rename to src/bitlash-api.cpp index da829e0..46c11ec 100644 --- a/src/bitlash-api.c +++ b/src/bitlash-api.cpp @@ -51,16 +51,17 @@ numvar doCommand(char *cmd) { void initBitlash(unsigned long baud) { - #if defined(TINY_BUILD) beginSerial(9600); #else beginSerial(baud); #endif - #if defined(ARM_BUILD) eeinit(); #endif +#if defined(ESP32) + EEPROM.begin(E2END); +#endif initTaskList(); vinit(); diff --git a/src/bitlash-builtins.c b/src/bitlash-builtins.cpp similarity index 90% rename from src/bitlash-builtins.c rename to src/bitlash-builtins.cpp index 5c9c911..ae6c435 100644 --- a/src/bitlash-builtins.c +++ b/src/bitlash-builtins.cpp @@ -80,6 +80,19 @@ const prog_char builtin_table[] PROGMEM = { BUILT_IN("output", "return 1") BUILT_IN("digitalread", "return dr(arg(1))") #endif +#if defined(ESP32) + BUILT_IN("low", "return 0") + BUILT_IN("high", "return 1") + BUILT_IN("input", "return 1") + BUILT_IN("output", "return 2") + BUILT_IN("pullup", "return 4") + BUILT_IN("input_pullup","return 5") + BUILT_IN("pulldown", "return 8") + BUILT_IN("input_pulldown","return 9") + BUILT_IN("open_drain", "return 16") + BUILT_IN("output_open", "return 18") + BUILT_IN("analog", "return 12") +#endif // This sentinel must be last BUILT_IN("","") // guards end of table, must be last diff --git a/src/bitlash-cmdline.c b/src/bitlash-cmdline.cpp similarity index 93% rename from src/bitlash-cmdline.c rename to src/bitlash-cmdline.cpp index 45ac712..f22ad20 100644 --- a/src/bitlash-cmdline.c +++ b/src/bitlash-cmdline.cpp @@ -43,7 +43,9 @@ char lbuf[LBUFLEN]; // Help text // -#if !defined(TINY_BUILD) +#if defined(ESP32) +const prog_char helptext[] PROGMEM = { "http://bitlash.net\r\nSee LICENSE for license\r\nPins: d0-39,a0-39 Variables: a-z, 32 bit long integers\r\nOperators: + - * / ( ) < <= > >= == != << >> ! ^ & | ++ -- :=\r\nCommands: \0" }; +#elif !defined(TINY_BUILD) const prog_char helptext[] PROGMEM = { "http://bitlash.net\r\nSee LICENSE for license\r\nPins: d0-22,a0-22 Variables: a-z, 32 bit long integers\r\nOperators: + - * / ( ) < <= > >= == != << >> ! ^ & | ++ -- :=\r\nCommands: \0" }; #else const prog_char helptext[] PROGMEM = { "http://bitlash.net\r\n\0" }; @@ -176,7 +178,7 @@ void doCharacter(char c) { } #endif #if !defined(TINY_BUILD) - else if (c == 21) { // ^U to get last line + else if (c == 21 || c == 16) { // ^U or ^P to get last line msgpl(M_ctrlu); prompt(); sp(lbuf); diff --git a/src/bitlash-eeprom.c b/src/bitlash-eeprom.cpp similarity index 99% rename from src/bitlash-eeprom.c rename to src/bitlash-eeprom.cpp index 0283f41..6ca8c4a 100644 --- a/src/bitlash-eeprom.c +++ b/src/bitlash-eeprom.cpp @@ -199,6 +199,9 @@ char id[IDLEN+1]; // buffer for id eewrite(addr, 0); } +#if defined(ESP32) + EEPROM.commit(); +#endif msgpl(M_saved); } diff --git a/src/bitlash-error.c b/src/bitlash-error.cpp similarity index 100% rename from src/bitlash-error.c rename to src/bitlash-error.cpp diff --git a/src/bitlash-functions.c b/src/bitlash-functions.cpp similarity index 97% rename from src/bitlash-functions.c rename to src/bitlash-functions.cpp index 6c2074f..9a1cbbb 100644 --- a/src/bitlash-functions.c +++ b/src/bitlash-functions.cpp @@ -33,6 +33,14 @@ ***/ #include "bitlash.h" + + +#ifdef ESP32 + +// AS Of 2017-11 no analogWrite yet +void analogWrite(byte pin, int value) { sp("analogWrite() not supported yet!");oops('!'); } +#endif + // syntactic sugar for func_handlers() #if 0 // 15022 bytes #define arg1 getarg(1) @@ -90,6 +98,9 @@ numvar func_free(void) { return 1000L; #elif defined(ARM_BUILD) return 1000L; +#elif defined(ESP32) + + return (numvar)esp_get_free_heap_size(); #else numvar ret; // from http://forum.pololu.com/viewtopic.php?f=10&t=989&view=unread#p4218 @@ -487,14 +498,14 @@ bitlash_function fp; else #endif // built-in function -#ifdef UNIX_BUILD +#if defined(UNIX_BUILD) or defined(ESP32) fp = function_table[entry]; #else fp = (bitlash_function) pgm_read_word(&function_table[entry]); #endif parsearglist(); // parse the arguments - numvar ret = (*fp)(); // call the function + numvar ret = (*fp)(); // call the function releaseargblock(); // peel off the arguments vpush(ret); // and push the return value } diff --git a/src/bitlash-instream.c b/src/bitlash-instream.cpp similarity index 100% rename from src/bitlash-instream.c rename to src/bitlash-instream.cpp diff --git a/src/bitlash-interpreter.c b/src/bitlash-interpreter.cpp similarity index 98% rename from src/bitlash-interpreter.c rename to src/bitlash-interpreter.cpp index 49abcbe..7a3b911 100644 --- a/src/bitlash-interpreter.c +++ b/src/bitlash-interpreter.cpp @@ -62,7 +62,7 @@ void nukeeeprom(void) { } -#if defined(AVR_BUILD) +#if defined(AVR_BUILD) && !defined(ESP32) void cmd_boot(void) { // This is recommended but does not work on Arduino // Reset_AVR(); @@ -95,7 +95,12 @@ void cmd_boot(void) { SCB_AIRCR = 0x05FA0000 | SCB_AIRCR_SYSRESETREQ_MASK; while(1); } -#endif +#endif // if ARM_BUILD==1 +#elif defined(ESP32) + +void cmd_boot(void) {esp_restart();} + + #else void cmd_boot(void) {oops('boot');} #endif diff --git a/src/bitlash-parser.c b/src/bitlash-parser.cpp similarity index 99% rename from src/bitlash-parser.c rename to src/bitlash-parser.cpp index 30d20a5..3bc6845 100644 --- a/src/bitlash-parser.c +++ b/src/bitlash-parser.cpp @@ -35,7 +35,7 @@ ***/ #include "bitlash.h" -#if defined(AVR_BUILD) +#if defined(AVR_BUILD) && ! defined(ESP32) #include "avr/eeprom.h" #endif @@ -421,7 +421,7 @@ byte pinnum(char id[]) { // > d13=1 ... and similarly for analog pinvars like a5 // // -//#define PIN_ALIASES 1 +#define PIN_ALIASES 1 #ifdef PIN_ALIASES @@ -430,10 +430,10 @@ byte pinnum(char id[]) { #define PV_MASK 0x3f const prog_char pinnames[] PROGMEM = { - "tx\0rx\0led\0vin\0zed\0" + "tx\0rx\0led\0vin\0zed\0therm1\0therm2\0" }; const prog_uchar pinvalues[] PROGMEM = { - 0, 1, 13, (PV_ANALOG | 1), (PV_VAR | 25) + 0, 1, 2, (PV_ANALOG | 1), (PV_VAR | 25), (PV_ANALOG |22), (PV_ANALOG |23) }; byte findpinname(char *alias) { diff --git a/src/bitlash-serial.c b/src/bitlash-serial.cpp similarity index 100% rename from src/bitlash-serial.c rename to src/bitlash-serial.cpp diff --git a/src/bitlash-taskmgr.c b/src/bitlash-taskmgr.cpp similarity index 100% rename from src/bitlash-taskmgr.c rename to src/bitlash-taskmgr.cpp diff --git a/src/bitlash-unix-file.c b/src/bitlash-unix-file.cpp similarity index 100% rename from src/bitlash-unix-file.c rename to src/bitlash-unix-file.cpp diff --git a/src/bitlash-unix.c b/src/bitlash-unix.cpp similarity index 99% rename from src/bitlash-unix.c rename to src/bitlash-unix.cpp index 4262e39..3d22b15 100644 --- a/src/bitlash-unix.c +++ b/src/bitlash-unix.cpp @@ -26,6 +26,9 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined (UNIX_BUILD) + #include "bitlash.h" /* @@ -365,3 +368,5 @@ int main () { #endif } + +#endif //if defined (UNIX_BUILD) diff --git a/src/bitlash.h b/src/bitlash.h index 3616d23..107b8d1 100644 --- a/src/bitlash.h +++ b/src/bitlash.h @@ -36,21 +36,23 @@ #ifndef _BITLASH_H #define _BITLASH_H + #if defined(__x86_64__) || defined(__i386__) #define UNIX_BUILD 1 #elif defined(__SAM3X8E__) #define ARM_BUILD 1 -#elif (defined(__MK20DX128__) || defined(__MK20DX256__)) && defined (CORE_TEENSY) +#elif (defined(__MK20DX128__) || defined(__MK20DX256__)) && (defined (CORE_TEENSY) || defined (TEENSYDUINO)) // Teensy 3 #define ARM_BUILD 2 #elif defined(PART_LM4F120H5QR) //support Energia.nu - Stellaris Launchpad / Tiva C Series #define ARM_BUILD 4 //support Energia.nu - Stellaris Launchpad / Tiva C Series +#elif defined(ESP32) +#define XTENSA_BUILD 1 #else #define AVR_BUILD 1 #endif - -#if defined(AVR_BUILD) +#if defined(AVR_BUILD) && !defined(ESP32) #include "avr/io.h" #include "avr/pgmspace.h" #include "avr/interrupt.h" @@ -132,8 +134,10 @@ #include "Arduino.h" #define prog_char char PROGMEM #define prog_uchar char PROGMEM + #include #else - #include "WProgram.h" + + #include "WProgram.h" #include "WConstants.h" #endif @@ -424,14 +428,62 @@ unsigned long millis(void); #define strcmp_P strcmp #define strlen_P strlen #if ARM_BUILD==1 - #define E2END 4096 -#else - // Teensy 3 - #define E2END 2048 + #define E2END 4095 +#elif ARM_BUILD==2 // Teensy 3 // + #define E2END 2047 #endif #endif +extern void displayBanner(void); +extern void initlbuf(void); +extern void pointToError(void); +extern void cmd_function(void); +extern void eraseentry(char *id); +extern void cmd_ls(void); +extern void cmd_peep(void); +extern void cmd_help(void); +extern char find_user_function(char *id); +extern byte findbuiltin(char *name); +extern void analogWrite(byte pin, int value); +extern void oops(int errcode); + +/////////////////////////////////// ESP32 +// +// ESP32 BUILD +#if defined(ESP32) + +#include +#include +#include +#include +#include + +extern void displayBanner(void); +extern void initlbuf(void); +extern void pointToError(void); +extern void cmd_function(void); +extern void eraseentry(char *id); +extern void cmd_ls(void); +extern void cmd_peep(void); +extern void cmd_help(void); +extern char find_user_function(char *id); +extern byte findbuiltin(char *name); +extern void analogWrite(byte pin, int value); +extern void oops(int errcode); + + +#define NUMPINS 39 + +#define E2END SPI_FLASH_SEC_SIZE - 1 // 4096 +extern void eeinit(void); +extern void eewrite(int addr, uint8_t value); +extern uint8_t eeread(int addr); + +#endif // ESP32 + +////////////////////////////////// ESP32 END + // numvar is 32 bits on Arduino and 16 bits elsewhere #if (defined(ARDUINO_BUILD) || defined(UNIX_BUILD)) && !defined(TINY_BUILD) @@ -519,7 +571,8 @@ int findend(int); void eeputs(int); #define EMPTY ((uint8_t)255) -#define STARTDB 0 +#define STARTDB 0 // the space to reserve at the begining of EEPROM +//#define ENDDB (E2END - xx) // where xx is the space to reserve at the end of EEPROM #define FAIL ((int)-1) ///////////////////////////////////////////// @@ -720,7 +773,7 @@ extern numvar symval; // value of current numeric expression #define USE_GPIORS defined(AVR_BUILD) -#ifndef GPIOR0 || GPIOR1 +#if !defined(GPIOR0) || !defined(GPIOR1) #undef USE_GPIORS #endif #if (defined USE_GPIORS) diff --git a/src/eeprom.c b/src/eeprom.cpp similarity index 83% rename from src/eeprom.c rename to src/eeprom.cpp index 4b43fa4..c11766d 100644 --- a/src/eeprom.c +++ b/src/eeprom.cpp @@ -81,7 +81,7 @@ uint8_t eeread(int addr) { return cache_eeprom[addr]; } -#elif (defined(AVR_BUILD)) || ( (defined(ARM_BUILD)) && (ARM_BUILD==2)) +#elif ((defined(AVR_BUILD)) || ( (defined(ARM_BUILD)) && (ARM_BUILD==2))) && ! defined(ESP32) // AVR or Teensy 3 #include "avr/eeprom.h" void eewrite(int addr, uint8_t value) { eeprom_write_byte((unsigned char *) addr, value); } @@ -102,4 +102,33 @@ void eewrite(int addr, uint8_t value) { virtual_eeprom[addr] = value; } uint8_t eeread(int addr) { return virtual_eeprom[addr]; } #endif +#elif defined(ESP32) + + +#if 0 + // A little fake eeprom for ARM testing + char virtual_eeprom[E2END]; + + void eeinit(void) { + for (int i=0; i #include #include @@ -57,3 +59,6 @@ int mygetch() { return (error == 1 ? (int) ch : -1 ); } + + +#endif // #if defined(UNIX_BUILD)