From 15ccd8f00129bf5d2e5be3fcf4976c094549592c Mon Sep 17 00:00:00 2001 From: ZodiusInfuser Date: Mon, 19 Apr 2021 16:44:11 +0100 Subject: [PATCH] Added digital_read and analog_read functions --- drivers/esp32spi/esp32spi.cpp | 65 +++++++++++++++-- drivers/esp32spi/esp32spi.hpp | 21 +++--- libraries/pico_wireless/pico_wireless.cpp | 6 ++ libraries/pico_wireless/pico_wireless.hpp | 3 + .../modules/pico_wireless/pico_wireless.c | 7 +- .../modules/pico_wireless/pico_wireless.cpp | 73 ++++++++++++++++++- .../modules/pico_wireless/pico_wireless.h | 5 +- 7 files changed, 155 insertions(+), 25 deletions(-) diff --git a/drivers/esp32spi/esp32spi.cpp b/drivers/esp32spi/esp32spi.cpp index ffbc3f87..46925617 100644 --- a/drivers/esp32spi/esp32spi.cpp +++ b/drivers/esp32spi/esp32spi.cpp @@ -73,8 +73,8 @@ namespace pimoroni { SET_PIN_MODE = 0x50, SET_DIGITAL_WRITE = 0x51, SET_ANALOG_WRITE = 0x52, - SET_DIGITAL_READ = 0x53, //TODO No Matching Function //NOTE Exposed in CPy - SET_ANALOG_READ = 0x54, //TODO No Matching Function //NOTE Exposed in CPy + SET_DIGITAL_READ = 0x53, + SET_ANALOG_READ = 0x54, }; bool Esp32Spi::init() { @@ -803,7 +803,7 @@ namespace pimoroni { float data = 0; uint8_t data_len = 0; if(!driver.wait_response_cmd(GET_TEMPERATURE, SpiDrv::PARAM_NUMS_1, (uint8_t*)&data, &data_len)) { - printf("error get_temperature\n"); + WARN("Response Err: GET_TEMPERATURE\n"); } driver.esp_deselect(); @@ -827,7 +827,7 @@ namespace pimoroni { // Wait for reply uint8_t data = 0, data_len = 0; if(!driver.wait_response_cmd(SET_PIN_MODE, SpiDrv::PARAM_NUMS_1, &data, &data_len)) { - WARN("Response Err: WL_FAILURE\n"); + WARN("Response Err: SET_PIN_MODE\n"); data = WL_FAILURE; } driver.esp_deselect(); @@ -850,7 +850,7 @@ namespace pimoroni { // Wait for reply uint8_t data = 0, data_len = 0; if(!driver.wait_response_cmd(SET_DIGITAL_WRITE, SpiDrv::PARAM_NUMS_1, &data, &data_len)) { - printf("error digital_write\n"); + WARN("Response Err: SET_DIGITAL_WRITE\n"); data = WL_FAILURE; } driver.esp_deselect(); @@ -873,12 +873,61 @@ namespace pimoroni { // Wait for reply uint8_t data = 0, data_len = 0; if(!driver.wait_response_cmd(SET_ANALOG_WRITE, SpiDrv::PARAM_NUMS_1, &data, &data_len)) { - printf("error analog_write\n"); + WARN("Response Err: SET_ANALOG_WRITE\n"); data = WL_FAILURE; } driver.esp_deselect(); } + bool Esp32Spi::digital_read(uint8_t pin) { + driver.wait_for_esp_select(); + + // Send Command + driver.send_cmd(SET_DIGITAL_READ, SpiDrv::PARAM_NUMS_1); + driver.send_param(&pin, 1, SpiDrv::LAST_PARAM); + + // Pad to multiple of 4 + driver.read_byte(); + driver.read_byte(); + + driver.esp_deselect(); + driver.wait_for_esp_select(); + + // Wait for reply + uint8_t data = 0, data_len = 0; + if(!driver.wait_response_cmd(SET_DIGITAL_READ, SpiDrv::PARAM_NUMS_1, &data, &data_len)) { + WARN("Response Err: SET_DIGITAL_READ\n"); + } + driver.esp_deselect(); + + return (data == 1); + } + + uint16_t Esp32Spi::analog_read(uint8_t pin, uint8_t atten) { + driver.wait_for_esp_select(); + + // Send Command + driver.send_cmd(SET_ANALOG_READ, SpiDrv::PARAM_NUMS_2); + driver.send_param(&pin, 1, SpiDrv::NO_LAST_PARAM); + driver.send_param(&atten, 1, SpiDrv::LAST_PARAM); + + // Pad to multiple of 4 + driver.read_byte(); + + driver.esp_deselect(); + driver.wait_for_esp_select(); + + // Wait for reply + uint32_t data = 0; + uint8_t data_len = 0; + if(!driver.wait_response_cmd(SET_ANALOG_READ, SpiDrv::PARAM_NUMS_1, (uint8_t*)&data, &data_len)) { + WARN("Response Err: SET_ANALOG_READ\n"); + } + driver.esp_deselect(); + + return (uint16_t)data; //ESP only has a 12-bit ADC + } + void Esp32Spi::start_server(uint16_t port, uint8_t sock, uint8_t protocol_mode) { driver.wait_for_esp_select(); @@ -897,7 +946,7 @@ namespace pimoroni { // Wait for reply uint8_t data = 0, data_len = 0; if(!driver.wait_response_cmd(START_SERVER_TCP, SpiDrv::PARAM_NUMS_1, &data, &data_len)) { - printf("No response to server start/n"); + WARN("Response Err: START_SERVER_TCP\n"); } driver.esp_deselect(); } @@ -1255,7 +1304,7 @@ namespace pimoroni { sleep_ms(100); } - } while((data==0) && (timeout < TIMEOUT_DATA_SENT)); + } while((data == 0) && (timeout < TIMEOUT_DATA_SENT)); return (timeout == TIMEOUT_DATA_SENT) ? 0 : 1; } diff --git a/drivers/esp32spi/esp32spi.hpp b/drivers/esp32spi/esp32spi.hpp index 5ff777dc..c3163f86 100644 --- a/drivers/esp32spi/esp32spi.hpp +++ b/drivers/esp32spi/esp32spi.hpp @@ -96,6 +96,9 @@ namespace pimoroni { // Constants //-------------------------------------------------- public: + static const uint8_t INPUT = 0; + static const uint8_t OUTPUT = 1; + static const uint8_t INPUT_PULLUP = 2; //-------------------------------------------------- @@ -116,8 +119,6 @@ namespace pimoroni { uint8_t local_ip[WL_IPV4_LENGTH]; uint8_t subnet_mask[WL_IPV4_LENGTH]; uint8_t gateway_ip[WL_IPV4_LENGTH]; - public: - //Esp32Spi(); //-------------------------------------------------- @@ -183,16 +184,17 @@ namespace pimoroni { void digital_write(uint8_t pin, uint8_t value); void analog_write(uint8_t pin, uint8_t value); - + bool digital_read(uint8_t pin); + uint16_t analog_read(uint8_t pin, uint8_t atten = 3); //-------------------------------------------------- //From https://github.com/adafruit/WiFiNINA/blob/master/src/utility/server_drv.cpp //-------------------------------------------------- - void start_server(uint16_t port, uint8_t sock, uint8_t protocol_mode=TCP_MODE); - void start_server(uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode=TCP_MODE); - void start_client(uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode=TCP_MODE); - void start_client(const std::string host, uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode=TCP_MODE); + void start_server(uint16_t port, uint8_t sock, uint8_t protocol_mode = TCP_MODE); + void start_server(uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode = TCP_MODE); + void start_client(uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode = TCP_MODE); + void start_client(const std::string host, uint32_t ip_address, uint16_t port, uint8_t sock, uint8_t protocol_mode = TCP_MODE); void stop_client(uint8_t sock); uint8_t get_server_state(uint8_t sock); @@ -213,11 +215,6 @@ namespace pimoroni { // TODO Sort below ones out, particularly wpa2s from CPy //-------------------------------------------------- - //Unknown how to implement these - // uint8_t digital_read(uint8_t pin); - // uint8_t analog_read(uint8_t pin); - - // void wifi_set_entidentity(); //SET_ENT_IDENT // void wifi_set_entusername(); //SET_ENT_UNAME // void wifi_set_entpassword(); //SET_ENT_PASSWD diff --git a/libraries/pico_wireless/pico_wireless.cpp b/libraries/pico_wireless/pico_wireless.cpp index bb709cd6..4c6df7da 100644 --- a/libraries/pico_wireless/pico_wireless.cpp +++ b/libraries/pico_wireless/pico_wireless.cpp @@ -13,6 +13,8 @@ namespace pimoroni { set_led(0, 0, 0); + pin_mode(ESP_SD_DETECT, Esp32Spi::INPUT_PULLUP); + return success; } @@ -26,4 +28,8 @@ namespace pimoroni { return !gpio_get(button); } + bool PicoWireless::is_sdcard_detected() { + return digital_read(ESP_SD_DETECT); + } + } \ No newline at end of file diff --git a/libraries/pico_wireless/pico_wireless.hpp b/libraries/pico_wireless/pico_wireless.hpp index 75c15f94..387e5527 100644 --- a/libraries/pico_wireless/pico_wireless.hpp +++ b/libraries/pico_wireless/pico_wireless.hpp @@ -18,6 +18,8 @@ namespace pimoroni { static const uint8_t ESP_LED_G = 26; static const uint8_t ESP_LED_B = 27; + static const uint8_t ESP_SD_DETECT = 15; + //-------------------------------------------------- // Variables @@ -37,6 +39,7 @@ namespace pimoroni { void set_led(uint8_t r, uint8_t g, uint8_t b); bool is_pressed(uint8_t button); + bool is_sdcard_detected(); }; } \ No newline at end of file diff --git a/micropython/modules/pico_wireless/pico_wireless.c b/micropython/modules/pico_wireless/pico_wireless.c index fcc013d7..22d42886 100644 --- a/micropython/modules/pico_wireless/pico_wireless.c +++ b/micropython/modules/pico_wireless/pico_wireless.c @@ -58,6 +58,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_pin_mode_obj, 2, picowireless_pin STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_digital_write_obj, 2, picowireless_digital_write); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_analog_write_obj, 2, picowireless_analog_write); +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_digital_read_obj, 1, picowireless_digital_read); +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_analog_read_obj, 1, picowireless_analog_read); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_server_start_obj, 3, picowireless_server_start); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_client_start_obj, 4, picowireless_client_start); @@ -79,6 +81,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(picowireless_get_socket_obj, picowireless_get_s STATIC MP_DEFINE_CONST_FUN_OBJ_KW(picowireless_set_led_obj, 3, picowireless_set_led); STATIC MP_DEFINE_CONST_FUN_OBJ_0(picowireless_is_pressed_obj, picowireless_is_pressed); +STATIC MP_DEFINE_CONST_FUN_OBJ_0(picowireless_is_sdcard_detected_obj, picowireless_is_sdcard_detected); /***** Globals Table *****/ @@ -131,6 +134,8 @@ STATIC const mp_map_elem_t picowireless_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_digital_write), MP_ROM_PTR(&picowireless_digital_write_obj) }, { MP_ROM_QSTR(MP_QSTR_analog_write), MP_ROM_PTR(&picowireless_analog_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_digital_read), MP_ROM_PTR(&picowireless_digital_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_analog_read), MP_ROM_PTR(&picowireless_analog_read_obj) }, { MP_ROM_QSTR(MP_QSTR_server_start), MP_ROM_PTR(&picowireless_server_start_obj) }, { MP_ROM_QSTR(MP_QSTR_client_start), MP_ROM_PTR(&picowireless_client_start_obj) }, @@ -151,7 +156,7 @@ STATIC const mp_map_elem_t picowireless_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_set_led), MP_ROM_PTR(&picowireless_set_led_obj) }, { MP_ROM_QSTR(MP_QSTR_is_pressed), MP_ROM_PTR(&picowireless_is_pressed_obj) }, - //TODO Add function for SD card detect + { MP_ROM_QSTR(MP_QSTR_is_sdcard_detected), MP_ROM_PTR(&picowireless_is_sdcard_detected_obj) }, }; STATIC MP_DEFINE_CONST_DICT(mp_module_picowireless_globals, picowireless_globals_table); diff --git a/micropython/modules/pico_wireless/pico_wireless.cpp b/micropython/modules/pico_wireless/pico_wireless.cpp index 45839177..507c7596 100644 --- a/micropython/modules/pico_wireless/pico_wireless.cpp +++ b/micropython/modules/pico_wireless/pico_wireless.cpp @@ -713,6 +713,61 @@ mp_obj_t picowireless_analog_write(size_t n_args, const mp_obj_t *pos_args, mp_m return mp_const_none; } +mp_obj_t picowireless_digital_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + if(wireless != nullptr) { + enum { ARG_pin, ARG_value }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_esp_pin, MP_ARG_REQUIRED | MP_ARG_INT }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + uint8_t pin = args[ARG_pin].u_int; + return mp_obj_new_bool(wireless->digital_read(pin)); + } + else + mp_raise_msg(&mp_type_RuntimeError, NOT_INITIALISED_MSG); + + return mp_const_none; +} + +mp_obj_t picowireless_analog_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + if(wireless != nullptr) { + if(n_args == 1) { + enum { ARG_pin }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_esp_pin, MP_ARG_REQUIRED | MP_ARG_INT }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + uint8_t pin = args[ARG_pin].u_int; + return mp_obj_new_int(wireless->analog_read(pin) * 16); //Returns a 16 bit-ish* number as per CircuitPython + } + else { + enum { ARG_pin, ARG_atten }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_esp_pin, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_atten, MP_ARG_REQUIRED | MP_ARG_INT }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + uint8_t pin = args[ARG_pin].u_int; + uint8_t atten = args[ARG_atten].u_int; + return mp_obj_new_int(wireless->analog_read(pin, atten) * 16); //Returns a 16 bit-ish* number as per CircuitPython + } + //NOTE *better way would be to mult by 65535 then div by 4095 + } + else + mp_raise_msg(&mp_type_RuntimeError, NOT_INITIALISED_MSG); + + return mp_const_none; +} + mp_obj_t picowireless_server_start(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { if(wireless != nullptr) { if(n_args == 3) { @@ -1069,14 +1124,26 @@ mp_obj_t picowireless_set_led(size_t n_args, const mp_obj_t *pos_args, mp_map_t } mp_obj_t picowireless_is_pressed() { - bool buttonPressed = false; + bool pressed = false; if(wireless != nullptr) { - buttonPressed = wireless->is_pressed(PicoWireless::A); + pressed = wireless->is_pressed(PicoWireless::A); } else mp_raise_msg(&mp_type_RuntimeError, NOT_INITIALISED_MSG); - return buttonPressed ? mp_const_true : mp_const_false; + return pressed ? mp_const_true : mp_const_false; +} + +mp_obj_t picowireless_is_sdcard_detected() { + bool detected = false; + + if(wireless != nullptr) { + detected = wireless->is_sdcard_detected(); + } + else + mp_raise_msg(&mp_type_RuntimeError, NOT_INITIALISED_MSG); + + return detected ? mp_const_true : mp_const_false; } } \ No newline at end of file diff --git a/micropython/modules/pico_wireless/pico_wireless.h b/micropython/modules/pico_wireless/pico_wireless.h index 5f7e0e49..66768ff8 100644 --- a/micropython/modules/pico_wireless/pico_wireless.h +++ b/micropython/modules/pico_wireless/pico_wireless.h @@ -56,6 +56,8 @@ extern mp_obj_t picowireless_pin_mode(size_t n_args, const mp_obj_t *pos_args, m extern mp_obj_t picowireless_digital_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); extern mp_obj_t picowireless_analog_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +extern mp_obj_t picowireless_digital_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +extern mp_obj_t picowireless_analog_read(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); extern mp_obj_t picowireless_server_start(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); extern mp_obj_t picowireless_client_start(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); @@ -76,4 +78,5 @@ extern mp_obj_t picowireless_check_data_sent(size_t n_args, const mp_obj_t *pos_ extern mp_obj_t picowireless_get_socket(); extern mp_obj_t picowireless_set_led(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); -extern mp_obj_t picowireless_is_pressed(); \ No newline at end of file +extern mp_obj_t picowireless_is_pressed(); +extern mp_obj_t picowireless_is_sdcard_detected(); \ No newline at end of file