/* xdrv_52_3_berry_MI32.ino - Berry scripting language, native functions Copyright (C) 2021 Christian Baars & Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef USE_BERRY #include #if defined(USE_MI_ESP32) && !defined(USE_BLE_ESP32) /*********************************************************************************************\ * Native functions mapped to Berry functions * * \*********************************************************************************************/ extern "C" { /******************************************************************** ** MI32 - sensor specific functions ********************************************************************/ extern uint32_t MI32numberOfDevices(); extern const char * MI32getDeviceName(uint32_t slot); extern void MI32setBatteryForSlot(uint32_t slot, uint8_t value); extern void MI32setHumidityForSlot(uint32_t slot, float value); extern void MI32setTemperatureForSlot(uint32_t slot, float value); extern uint8_t * MI32getDeviceMAC(uint32_t slot); int be_MI32_devices(bvm *vm); int be_MI32_devices(bvm *vm) { uint32_t devices = MI32numberOfDevices(); be_pushint(vm, devices); be_return(vm); } int be_MI32_set_bat(bvm *vm); int be_MI32_set_bat(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 3 && be_isint(vm, 2) && be_isint(vm, 3)) { uint32_t slot = be_toint(vm, 2); int32_t bat_val = be_toint(vm, 3); MI32setBatteryForSlot(slot,bat_val); be_return(vm); // Return } be_raise(vm, kTypeError, nullptr); } int be_MI32_get_name(bvm *vm); int be_MI32_get_name(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 2 && be_isint(vm, 2)) { uint32_t slot = be_toint(vm, 2); const char * name = MI32getDeviceName(slot); be_pushstring(vm,name); be_return(vm); // Return } be_raise(vm, kTypeError, nullptr); } int be_MI32_get_MAC(bvm *vm); int be_MI32_get_MAC(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 2 && be_isint(vm, 2)) { uint32_t slot = be_toint(vm, 2); uint8_t *buffer = MI32getDeviceMAC(slot); size_t len = 6; if(buffer != NULL) { be_pushbytes(vm,buffer,len); be_return(vm); // Return } } be_raise(vm, kTypeError, nullptr); } int be_MI32_set_hum(bvm *vm); int be_MI32_set_hum(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 3 && be_isint(vm, 2) && be_isreal(vm, 3)) { uint32_t slot = be_toint(vm, 2); float hum_val = be_toreal(vm, 3); MI32setHumidityForSlot(slot,hum_val); be_return(vm); // Return } be_raise(vm, kTypeError, nullptr); } int be_MI32_set_temp(bvm *vm); int be_MI32_set_temp(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 3 && be_isint(vm, 2) && be_isreal(vm, 3)) { uint32_t slot = be_toint(vm, 2); float temp_val = be_toreal(vm, 3); MI32setTemperatureForSlot(slot,temp_val); be_return(vm); // Return } be_raise(vm, kTypeError, nullptr); } /******************************************************************** ** BLE - generic BLE functions ********************************************************************/ extern void MI32setBerryAdvCB(void* function, uint8_t *buffer); extern void MI32setBerryConnCB(void* function, uint8_t *buffer); extern bool MI32runBerryConnection(uint8_t operation, bool response); extern bool MI32setBerryCtxSvc(const char *Svc); extern bool MI32setBerryCtxChr(const char *Chr); extern bool MI32setBerryCtxMAC(uint8_t *MAC, uint8_t type); extern bool MI32addMACtoBlockList(uint8_t *MAC, uint8_t type); extern bool MI32addMACtoWatchList(uint8_t *MAC, uint8_t type); int be_BLE_reg_conn_cb(bvm *vm); int be_BLE_reg_conn_cb(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 3 && be_iscomptr(vm, 2)) { void* cb = be_tocomptr(vm, 2); size_t len; uint8_t * buf = (uint8_t*)be_tobytes(vm, 3, &len); MI32setBerryConnCB(cb,buf); be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_reg_adv_cb(bvm *vm); int be_BLE_reg_adv_cb(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 3 && be_iscomptr(vm, 2)) { void* cb = be_tocomptr(vm, 2); size_t len; uint8_t * buf = (uint8_t*)be_tobytes(vm, 3, &len); MI32setBerryAdvCB(cb,buf); be_return(vm); // Return } else if(argc == 2 && be_isint(vm, 2)){ if(be_toint(vm, 2) == 0){ MI32setBerryAdvCB(NULL,NULL); be_return(vm); // Return } } be_raise(vm, kTypeError, nullptr); } int be_BLE_set_MAC(bvm *vm); int be_BLE_set_MAC(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc > 1 && be_isbytes(vm, 2)) { size_t len = 6; uint8_t type = 0; if(argc == 3 && be_isint(vm, 3)){ type = be_toint(vm,3); } if (MI32setBerryCtxMAC((uint8_t*)be_tobytes(vm, 2, &len),type)) be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_set_service(bvm *vm); int be_BLE_set_service(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 2 && be_isstring(vm, 2)) { if (MI32setBerryCtxSvc(be_tostring(vm, 2))) be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_set_characteristic(bvm *vm); int be_BLE_set_characteristic(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc == 2 && be_isstring(vm, 2)) { if (MI32setBerryCtxChr(be_tostring(vm, 2))) be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_run(bvm *vm); int be_BLE_run(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if ((argc > 1) && be_isint(vm, 2)) { bool response = false; if(argc == 3 && be_isint(vm, 3)){ response = be_toint(vm,3)>0; } if (MI32runBerryConnection(be_toint(vm, 2),response)) be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_adv_block(bvm *vm); int be_BLE_adv_block(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc > 1 && be_isbytes(vm, 2)) { size_t len = 6; uint8_t type = 0; if(argc == 3 && be_isint(vm, 3)){ type = be_toint(vm,3); } if(MI32addMACtoBlockList((uint8_t*)be_tobytes(vm, 2, &len),type)) be_return(vm); } be_raise(vm, kTypeError, nullptr); } int be_BLE_adv_watch(bvm *vm); int be_BLE_adv_watch(bvm *vm){ int32_t argc = be_top(vm); // Get the number of arguments if (argc > 1 && be_isbytes(vm, 2)) { size_t len = 6; uint8_t type = 0; if(argc == 3 && be_isint(vm, 3)){ type = be_toint(vm,3); } if (MI32addMACtoWatchList((uint8_t*)be_tobytes(vm, 2, &len),type)) be_return(vm); } be_raise(vm, kTypeError, nullptr); } } //extern "C" #endif // USE_MI_ESP32 #endif // USE_BERRY /* BLE.set_svc BLE.set_chr BLE.set_MAC BLE.run(op) be_BLE_op: 1 read 2 write 3 subscribe 4 unsubscribe - maybe later 5 disconnect 11 read once, then disconnect 12 write once, then disconnect 13 subscribe once, then disconnect 14 unsubscribe once, then disconnect - maybe later BLE.conn_cb(cb,buffer) BLE.adv_cb(cb,buffer) BLE.adv_watch(MAC) BLE.adv_block(MAC) MI32.devices() MI32.get_name(slot) MI32.get_MAC(slot) MI32.set_bat(slot,int) MI32.set_hum(slot,float) MI32.set_temp(slot,float) */