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

Commit 03345e3

Browse files
committed
add badge.i2c_read_reg() and badge.i2c_write_reg()
badge.i2c_read_reg(i2c_addr, reg_idx, data_len) badge.i2c_write_reg(i2c_addr, reg_idx, bytestring)
1 parent d24e2d9 commit 03345e3

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));
@@ -628,6 +692,10 @@ STATIC const mp_rom_map_elem_t badge_module_globals_table[] = {
628692

629693
{MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&badge_init_obj)},
630694

695+
// I2C
696+
{MP_ROM_QSTR(MP_QSTR_i2c_read_reg), MP_ROM_PTR(&badge_i2c_read_reg_obj)},
697+
{MP_ROM_QSTR(MP_QSTR_i2c_write_reg), MP_ROM_PTR(&badge_i2c_write_reg_obj)},
698+
631699
// Mpr121
632700
#ifdef I2C_MPR121_ADDR
633701
{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