diff --git a/lib/libesp32/Berry-0.1.10/src/port/be_tasmotalib.c b/lib/libesp32/Berry-0.1.10/src/port/be_tasmotalib.c index 95eab5c34..8fa2f551c 100644 --- a/lib/libesp32/Berry-0.1.10/src/port/be_tasmotalib.c +++ b/lib/libesp32/Berry-0.1.10/src/port/be_tasmotalib.c @@ -1843,6 +1843,104 @@ const bclosure load_closure = { /*******************************************************************/ +/******************************************************************** + // tasmota.wire_scan(addr:int [, index:int]) -> wire1 or wire2 or nil + // scan for the first occurrence of the addr, starting with bus1 then bus2 + // optional: skip if index is disabled via I2CEnable + "def wire_scan(addr,idx) " + // skip if the I2C index is disabled + "if idx != nil && !self.i2c_enabled(idx) return nil end " + "if self.wire1.detect(addr) return self.wire1 end " + "if self.wire2.detect(addr) return self.wire2 end " + "return nil " + "end " +********************************************************************/ +/******************************************************************** +** Solidified function: wire_scan +********************************************************************/ + +be_define_local_const_str(wire_scan_str_name, "wire_scan", -1623691416, 0, 9, 0); +be_define_local_const_str(wire_scan_str_source, "string", 398550328, 0, 6, 0); +be_define_local_const_str(wire_scan_str_0, "i2c_enabled", 218388101, 0, 11, 0); +be_define_local_const_str(wire_scan_str_1, "wire1", -1082245877, 0, 5, 0); +be_define_local_const_str(wire_scan_str_2, "detect", 8884370, 0, 6, 0); +be_define_local_const_str(wire_scan_str_3, "wire2", -1065468258, 0, 5, 0); + +static const bvalue wire_scan_ktab[4] = { + { { .s=be_local_const_str(wire_scan_str_0) }, BE_STRING}, + { { .s=be_local_const_str(wire_scan_str_1) }, BE_STRING}, + { { .s=be_local_const_str(wire_scan_str_2) }, BE_STRING}, + { { .s=be_local_const_str(wire_scan_str_3) }, BE_STRING}, +}; + +static const uint32_t wire_scan_code[25] = { + 0x4C0C0000, // 0000 LDNIL 3 + 0x200C0403, // 0001 NE R3 R2 R3 + 0x780E0005, // 0002 JMPF R3 #0009 + 0x8C0C0100, // 0003 GETMET R3 R0 R256 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x740E0001, // 0006 JMPT R3 #0009 + 0x4C0C0000, // 0007 LDNIL 3 + 0x80040600, // 0008 RET 1 R3 + 0x880C0101, // 0009 GETMBR R3 R0 R257 + 0x8C0C0702, // 000A GETMET R3 R3 R258 + 0x5C140200, // 000B MOVE R5 R1 + 0x7C0C0400, // 000C CALL R3 2 + 0x780E0001, // 000D JMPF R3 #0010 + 0x880C0101, // 000E GETMBR R3 R0 R257 + 0x80040600, // 000F RET 1 R3 + 0x880C0103, // 0010 GETMBR R3 R0 R259 + 0x8C0C0702, // 0011 GETMET R3 R3 R258 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C0C0400, // 0013 CALL R3 2 + 0x780E0001, // 0014 JMPF R3 #0017 + 0x880C0103, // 0015 GETMBR R3 R0 R259 + 0x80040600, // 0016 RET 1 R3 + 0x4C0C0000, // 0017 LDNIL 3 + 0x80040600, // 0018 RET 1 R3 +}; + +static const bproto wire_scan_proto = { + NULL, // bgcobject *next + 8, // type + GC_CONST, // marked + 6, // nstack + 0, // nupvals + 3, // argc + 0, // varg + NULL, // bgcobject *gray + NULL, // bupvaldesc *upvals + (bvalue*) &wire_scan_ktab, // ktab + NULL, // bproto **ptab + (binstruction*) &wire_scan_code, // code + be_local_const_str(wire_scan_str_name), // name + 25, // codesize + 4, // nconst + 0, // nproto + be_local_const_str(wire_scan_str_source), // source +#if BE_DEBUG_RUNTIME_INFO /* debug information */ + NULL, // lineinfo + 0, // nlineinfo +#endif +#if BE_DEBUG_VAR_INFO + NULL, // varinfo + 0, // nvarinfo +#endif +}; + +static const bclosure wire_scan_closure = { + NULL, // bgcobject *next + 36, // type + GC_CONST, // marked + 0, // nupvals + NULL, // bgcobject *gray + (bproto*) &wire_scan_proto, // proto + { NULL } // upvals +}; + +/*******************************************************************/ + /******************************************************************** @@ -1858,6 +1956,8 @@ void be_load_tasmota_ntvlib(bvm *vm) { "_timers", NULL }, { "_cmd", NULL }, { "_drivers", NULL }, + { "wire1", NULL }, + { "wire2", NULL }, { "get_free_heap", l_getFreeHeap }, { "publish", l_publish }, { "cmd", l_cmd }, @@ -1902,6 +2002,7 @@ void be_load_tasmota_ntvlib(bvm *vm) { "event", (bntvfunc) &event_closure }, { "add_driver", (bntvfunc) &add_driver_closure }, { "load", (bntvfunc) &load_closure }, + { "wire_scan", (bntvfunc) &wire_scan_closure }, { NULL, NULL } }; diff --git a/lib/libesp32/Berry-0.1.10/src/port/be_wirelib.c b/lib/libesp32/Berry-0.1.10/src/port/be_wirelib.c index 2c9dcdd9e..1ac65dd82 100644 --- a/lib/libesp32/Berry-0.1.10/src/port/be_wirelib.c +++ b/lib/libesp32/Berry-0.1.10/src/port/be_wirelib.c @@ -212,7 +212,7 @@ const bclosure write_bytes_closure = { void be_load_wirelib(bvm *vm) { static const bnfuncinfo members[] = { - { "_bus", NULL }, // bus number + { "bus", NULL }, // bus number { "init", b_wire_init }, { "_begin_transmission", b_wire_begintransmission }, { "_end_transmission", b_wire_endtransmission }, diff --git a/tasmota/berry/mpu6886.be b/tasmota/berry/mpu6886.be index d02dac9e4..934d8db7f 100644 --- a/tasmota/berry/mpu6886.be +++ b/tasmota/berry/mpu6886.be @@ -6,62 +6,53 @@ -# class MPU6886 : Driver - var enabled, wire + var wire #- if wire == nil then the module is not initialized -# var gres, ares var accel, gyro def init() - self.enabled = false - if tasmota.i2c_enabled(58) || 1 - var bus = 1 - if wire1.detect(0x68) - self.wire = wire1 - elif wire2.detect(0x68) - self.wire = wire2 - bus = 2 - end + self.wire = tasmota.wire_scan(0x68, 58) - if self.wire - var v = self.wire.read(0x68,0x75,1) - if v != 0x19 return end #- wrong device -# + if self.wire + var v = self.wire.read(0x68,0x75,1) + if v != 0x19 return end #- wrong device -# - self.wire.write(0x68, 0x6B, 0, 1) - tasmota.delay(10) - self.wire.write(0x68, 0x6B, 1<<7, 1) # MPU6886_PWR_MGMT_1 - tasmota.delay(10) - self.wire.write(0x68, 0x6B, 1<<0, 1) # MPU6886_PWR_MGMT_1 - tasmota.delay(10) - self.wire.write(0x68, 0x1C, 0x10, 1) # MPU6886_ACCEL_CONFIG - AFS_8G - tasmota.delay(1) - self.wire.write(0x68, 0x1B, 0x18, 1) # MPU6886_GYRO_CONFIG - GFS_2000DPS - tasmota.delay(1) - self.wire.write(0x68, 0x1A, 0x01, 1) # MPU6886_CONFIG - tasmota.delay(1) - self.wire.write(0x68, 0x19, 0x05, 1) # MPU6886_SMPLRT_DIV - tasmota.delay(1) - self.wire.write(0x68, 0x38, 0x00, 1) # MPU6886_INT_ENABLE - tasmota.delay(1) - self.wire.write(0x68, 0x1D, 0x00, 1) # MPU6886_ACCEL_CONFIG2 - tasmota.delay(1) - self.wire.write(0x68, 0x6A, 0x00, 1) # MPU6886_USER_CTRL - tasmota.delay(1) - self.wire.write(0x68, 0x23, 0x00, 1) # MPU6886_FIFO_EN - tasmota.delay(1) - self.wire.write(0x68, 0x37, 0x22, 1) # MPU6886_INT_PIN_CFG - tasmota.delay(1) - self.wire.write(0x68, 0x38, 0x01, 1) # MPU6886_INT_ENABLE - tasmota.delay(100) + self.wire.write(0x68, 0x6B, 0, 1) + tasmota.delay(10) + self.wire.write(0x68, 0x6B, 1<<7, 1) # MPU6886_PWR_MGMT_1 + tasmota.delay(10) + self.wire.write(0x68, 0x6B, 1<<0, 1) # MPU6886_PWR_MGMT_1 + tasmota.delay(10) + self.wire.write(0x68, 0x1C, 0x10, 1) # MPU6886_ACCEL_CONFIG - AFS_8G + tasmota.delay(1) + self.wire.write(0x68, 0x1B, 0x18, 1) # MPU6886_GYRO_CONFIG - GFS_2000DPS + tasmota.delay(1) + self.wire.write(0x68, 0x1A, 0x01, 1) # MPU6886_CONFIG + tasmota.delay(1) + self.wire.write(0x68, 0x19, 0x05, 1) # MPU6886_SMPLRT_DIV + tasmota.delay(1) + self.wire.write(0x68, 0x38, 0x00, 1) # MPU6886_INT_ENABLE + tasmota.delay(1) + self.wire.write(0x68, 0x1D, 0x00, 1) # MPU6886_ACCEL_CONFIG2 + tasmota.delay(1) + self.wire.write(0x68, 0x6A, 0x00, 1) # MPU6886_USER_CTRL + tasmota.delay(1) + self.wire.write(0x68, 0x23, 0x00, 1) # MPU6886_FIFO_EN + tasmota.delay(1) + self.wire.write(0x68, 0x37, 0x22, 1) # MPU6886_INT_PIN_CFG + tasmota.delay(1) + self.wire.write(0x68, 0x38, 0x01, 1) # MPU6886_INT_ENABLE + tasmota.delay(100) - self.enabled = true - self.gres = 2000.0/32768.0 - self.ares = 8.0/32678.0 - print("I2C: MPU6886 detected on bus "+str(bus)) - end + self.gres = 2000.0/32768.0 + self.ares = 8.0/32678.0 + print("I2C: MPU6886 detected on bus "+str(self.wire.bus)) end end #- returns a list of 3 axis, float as g acceleration -# def read_accel() + if !self.wire return nil end #- exit if not initialized -# var b = self.wire.read_bytes(0x68,0x3B,6) var a1 = b.get(0,-2) if a1 >= 0x8000 a1 -= 0x10000 end @@ -75,6 +66,7 @@ class MPU6886 : Driver #- returns a list of 3 gyroscopes, int as dps (degree per second) -# def read_gyro() + if !self.wire return nil end #- exit if not initialized -# var b = self.wire.read_bytes(0x68,0x43,6) var g1 = b.get(0,-2) if g1 >= 0x8000 g1 -= 0x10000 end @@ -88,17 +80,19 @@ class MPU6886 : Driver #- trigger a read every second -# def every_second() + if !self.wire return nil end #- exit if not initialized -# self.read_accel() self.read_gyro() end #- display sensor value in the web UI -# def web_sensor() + if !self.wire return nil end #- exit if not initialized -# import string var msg = string.format( - "{s}MPU6886 acc_x{m}%f G{e}".. - "{s}MPU6886 acc_y{m}%f G{e}".. - "{s}MPU6886 acc_z{m}%f G{e}".. + "{s}MPU6886 acc_x{m}%.3f G{e}".. + "{s}MPU6886 acc_y{m}%.3f G{e}".. + "{s}MPU6886 acc_z{m}%.3f G{e}".. "{s}MPU6886 gyr_x{m}%i dps{e}".. "{s}MPU6886 gyr_y{m}%i dps{e}".. "{s}MPU6886 gyr_z{m}%i dps{e}", @@ -108,6 +102,7 @@ class MPU6886 : Driver #- add sensor value to teleperiod -# def json_append() + if !self.wire return nil end #- exit if not initialized -# import string var ax = int(self.accel[0] * 1000) var ay = int(self.accel[1] * 1000) @@ -118,5 +113,5 @@ class MPU6886 : Driver end end -mpu = MPU6886() -tasmota.add_driver(mpu) \ No newline at end of file +mpu6886 = MPU6886() +tasmota.add_driver(mpu6886) \ No newline at end of file diff --git a/tasmota/xdrv_52_3_berry_wire.ino b/tasmota/xdrv_52_3_berry_wire.ino index 1c5c56473..f288d188a 100644 --- a/tasmota/xdrv_52_3_berry_wire.ino +++ b/tasmota/xdrv_52_3_berry_wire.ino @@ -23,21 +23,21 @@ #include #include -// read the `_bus` attribute and return `Wire` or `Wire1` +// read the `bus` attribute and return `Wire` or `Wire1` TwoWire & getWire(bvm *vm); TwoWire & getWire(bvm *vm) { - be_getmember(vm, 1, "_bus"); - int32_t bus = be_toint(vm, -1); + be_getmember(vm, 1, "bus"); + int32_t bus = be_toint(vm, -1); // bus is 1 or 2 be_pop(vm, 1); - if (0 == bus) { + if (2 != bus) { return Wire; } else { return Wire1; } } -int32_t getBus(bvm *vm); +int32_t getBus(bvm *vm); // 1 or 2 int32_t getBus(bvm *vm) { - be_getmember(vm, 1, "_bus"); + be_getmember(vm, 1, "bus"); int32_t bus = be_toint(vm, -1); be_pop(vm, 1); return bus; @@ -57,15 +57,15 @@ extern "C" { int32_t b_wire_init(struct bvm *vm); int32_t b_wire_init(struct bvm *vm) { int32_t top = be_top(vm); // Get the number of arguments - int32_t bus = 0; + int32_t bus = 1; if (top > 1 && be_isint(vm, 2)) { bus = be_toint(vm, 2); - if (bus < 0) { bus = 0; } - if (bus > 1) { bus = 1; } + if (bus < 1) { bus = 1; } + if (bus > 2) { bus = 2; } } // store bus in instance be_pushint(vm, bus); - be_setmember(vm, 1, "_bus"); + be_setmember(vm, 1, "bus"); be_return_nil(vm); } @@ -193,7 +193,7 @@ extern "C" { int32_t b_wire_validwrite(struct bvm *vm); int32_t b_wire_validwrite(struct bvm *vm) { int32_t top = be_top(vm); // Get the number of arguments - int32_t bus = getBus(vm); + int32_t bus = getBus(vm) - 1; // 0 or 1 if (top == 5 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) && be_isint(vm, 5)) { uint8_t addr = be_toint(vm, 2); uint8_t reg = be_toint(vm, 3); @@ -210,7 +210,7 @@ extern "C" { int32_t b_wire_validread(struct bvm *vm); int32_t b_wire_validread(struct bvm *vm) { int32_t top = be_top(vm); // Get the number of arguments - int32_t bus = getBus(vm); + int32_t bus = getBus(vm) - 1; // 0 or 1 if (top == 4 && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4)) { uint8_t addr = be_toint(vm, 2); uint8_t reg = be_toint(vm, 3); diff --git a/tasmota/xdrv_52_7_berry_embedded.ino b/tasmota/xdrv_52_7_berry_embedded.ino index 051d28024..ba8e687d8 100644 --- a/tasmota/xdrv_52_7_berry_embedded.ino +++ b/tasmota/xdrv_52_7_berry_embedded.ino @@ -284,6 +284,17 @@ const char berry_prog[] = // "end " // "end " + // // tasmota.wire_scan(addr:int [, index:int]) -> wire1 or wire2 or nil + // // scan for the first occurrence of the addr, starting with bus1 then bus2 + // // optional: skip if index is disabled via I2CEnable + // "def wire_scan(addr,idx) " + // // skip if the I2C index is disabled + // "if idx != nil && !self.i2c_enabled(idx) return nil end " + // "if self.wire1.detect(addr) return self.wire1 end " + // "if self.wire2.detect(addr) return self.wire2 end " + // "return nil " + // "end " + "end " // Instantiate tasmota object @@ -314,12 +325,10 @@ const char berry_prog[] = // "end " // "end " - "wire = Wire(0) " - "wire1 = wire " - "wire2 = Wire(1) " - - // try to load "/autoexec.be" - // "try compile('/autoexec.be','file')() except .. log('BRY: no /autoexec.bat file') end " + "tasmota.wire1 = Wire(1) " + "tasmota.wire2 = Wire(2) " + "wire1 = tasmota.wire1 " + "wire2 = tasmota.wire2 " ; const char berry_autoexec[] =