Skip to content
This repository was archived by the owner on Oct 28, 2023. It is now read-only.

Commit c4a5ad1

Browse files
authored
Merge pull request SHA2017-badge#226 from SHA2017-badge/basvs-badge-i2c
add badge.i2c_read_reg() and badge.i2c_write_reg()
2 parents fd150f0 + 03345e3 commit c4a5ad1

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

esp32/modbadge.c

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939
#include "bpp_init.h"
4040

41+
#include "badge_i2c.h"
4142
#include "badge_mpr121.h"
4243

4344
#include "py/mperrno.h"
@@ -213,6 +214,69 @@ STATIC mp_obj_t badge_nvs_set_u16_(mp_obj_t _namespace, mp_obj_t _key, mp_obj_t
213214
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u16_obj, badge_nvs_set_u16_);
214215

215216

217+
// I2C (badge_i2c.h)
218+
STATIC mp_obj_t badge_i2c_read_reg_(mp_obj_t _addr, mp_obj_t _reg, mp_obj_t _len) {
219+
int addr = mp_obj_get_int(_addr);
220+
int reg = mp_obj_get_int(_reg);
221+
int len = mp_obj_get_int(_len);
222+
223+
if (addr < 0 || addr > 127) {
224+
mp_raise_msg(&mp_type_AttributeError, "I2C address out of range");
225+
}
226+
227+
if (reg < 0 || reg > 255) {
228+
mp_raise_msg(&mp_type_AttributeError, "I2C register out of range");
229+
}
230+
231+
if (len < 0) {
232+
mp_raise_msg(&mp_type_AttributeError, "requested negative amount of bytes");
233+
}
234+
235+
vstr_t vstr;
236+
vstr_init_len(&vstr, len);
237+
238+
esp_err_t res = badge_i2c_read_reg(addr, reg, (uint8_t *) vstr.buf, len);
239+
if (res != ESP_OK) {
240+
mp_raise_OSError(MP_EIO);
241+
}
242+
243+
return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
244+
}
245+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_i2c_read_reg_obj, badge_i2c_read_reg_);
246+
247+
STATIC mp_obj_t badge_i2c_write_reg_(mp_obj_t _addr, mp_obj_t _reg, mp_obj_t _data) {
248+
int addr = mp_obj_get_int(_addr);
249+
int reg = mp_obj_get_int(_reg);
250+
mp_uint_t data_len;
251+
uint8_t *data = (uint8_t *) mp_obj_str_get_data(_data, &data_len);
252+
253+
if (addr < 0 || addr > 127) {
254+
mp_raise_msg(&mp_type_AttributeError, "I2C address out of range");
255+
}
256+
257+
if (reg < 0 || reg > 255) {
258+
mp_raise_msg(&mp_type_AttributeError, "I2C register out of range");
259+
}
260+
261+
bool is_bytes = MP_OBJ_IS_TYPE(_data, &mp_type_bytes);
262+
if (!is_bytes) {
263+
mp_raise_msg(&mp_type_AttributeError, "Data should be a bytestring");
264+
}
265+
266+
if (data_len != 1) {
267+
mp_raise_msg(&mp_type_AttributeError, "Data-lengths other than 1 byte are not supported");
268+
}
269+
270+
esp_err_t res = badge_i2c_write_reg(addr, reg, data[0]);
271+
if (res != ESP_OK) {
272+
mp_raise_OSError(MP_EIO);
273+
}
274+
275+
return mp_const_none;
276+
}
277+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_i2c_write_reg_obj, badge_i2c_write_reg_);
278+
279+
216280
// Mpr121 (badge_mpr121.h)
217281
#ifdef I2C_MPR121_ADDR
218282
#define store_dict_int(dict, field, contents) mp_obj_dict_store(dict, mp_obj_new_str(field, strlen(field), false), mp_obj_new_int(contents));
@@ -697,6 +761,10 @@ STATIC const mp_rom_map_elem_t badge_module_globals_table[] = {
697761

698762
{MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&badge_init_obj)},
699763

764+
// I2C
765+
{MP_ROM_QSTR(MP_QSTR_i2c_read_reg), MP_ROM_PTR(&badge_i2c_read_reg_obj)},
766+
{MP_ROM_QSTR(MP_QSTR_i2c_write_reg), MP_ROM_PTR(&badge_i2c_write_reg_obj)},
767+
700768
// Mpr121
701769
#ifdef I2C_MPR121_ADDR
702770
{MP_ROM_QSTR(MP_QSTR_mpr121_get_touch_info), MP_ROM_PTR(&badge_mpr121_get_touch_info_obj)},

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy