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)