|
38 | 38 |
|
39 | 39 | #include "bpp_init.h"
|
40 | 40 |
|
| 41 | +#include "badge_i2c.h" |
41 | 42 | #include "badge_mpr121.h"
|
42 | 43 |
|
43 | 44 | #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
|
213 | 214 | STATIC MP_DEFINE_CONST_FUN_OBJ_3(badge_nvs_set_u16_obj, badge_nvs_set_u16_);
|
214 | 215 |
|
215 | 216 |
|
| 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 | + |
216 | 280 | // Mpr121 (badge_mpr121.h)
|
217 | 281 | #ifdef I2C_MPR121_ADDR
|
218 | 282 | #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[] = {
|
697 | 761 |
|
698 | 762 | {MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&badge_init_obj)},
|
699 | 763 |
|
| 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 | + |
700 | 768 | // Mpr121
|
701 | 769 | #ifdef I2C_MPR121_ADDR
|
702 | 770 | {MP_ROM_QSTR(MP_QSTR_mpr121_get_touch_info), MP_ROM_PTR(&badge_mpr121_get_touch_info_obj)},
|
|
0 commit comments