Finished micropython bindings for AS7262, and added example

pull/142/head
ZodiusInfuser 2021-05-10 17:22:36 +01:00 zatwierdzone przez Phil Howard
rodzic 5af43311f4
commit a6c738d018
8 zmienionych plików z 184 dodań i 106 usunięć

Wyświetl plik

@ -85,6 +85,37 @@ namespace pimoroni {
return interrupt;
}
uint8_t AS7262::device_type() {
return i2c_reg_read_uint8(reg::DEVICE);
}
uint8_t AS7262::hardware_version() {
return i2c_reg_read_uint8(reg::HW_VERSION);
}
void AS7262::firmware_version(uint8_t &major_out, uint8_t &minor_out, uint8_t &sub_out) {
uint16_t fw_version = i2c_reg_read_uint16(reg::FW_VERSION);
major_out = (fw_version & 0x00F0) >> 4;
minor_out = ((fw_version & 0x000F) << 2) | ((fw_version & 0xC000) >> 14);
sub_out = (fw_version & 0x3F00) >> 8;
}
AS7262::reading AS7262::read() {
while(!data_ready()) {}
return AS7262::reading {
i2c_reg_read_float(reg::R_CAL_F),
i2c_reg_read_float(reg::O_CAL_F),
i2c_reg_read_float(reg::Y_CAL_F),
i2c_reg_read_float(reg::G_CAL_F),
i2c_reg_read_float(reg::B_CAL_F),
i2c_reg_read_float(reg::V_CAL_F)
};
}
uint8_t AS7262::temperature() {
return i2c_reg_read_uint8(reg::TEMP);
}
void AS7262::set_gain(gain gain) {
uint8_t temp = i2c_reg_read_uint8(reg::CONTROL) & ~0b00110000;
temp |= (uint8_t)gain << 4;
@ -116,58 +147,58 @@ namespace pimoroni {
i2c_reg_write_uint8(reg::LED_CONTROL, temp);
}
std::string AS7262::firmware_version() {
std::string buf;
uint16_t fw_version = i2c_reg_read_uint16(reg::FW_VERSION);
buf += std::to_string(fw_version);
return buf;
}
bool AS7262::data_ready() {
return i2c_reg_read_uint8(reg::CONTROL) & 0b00000010;
}
AS7262::reading AS7262::read() {
while(!data_ready()) {}
return AS7262::reading {
i2c_reg_read_float(reg::R_CAL_F),
i2c_reg_read_float(reg::O_CAL_F),
i2c_reg_read_float(reg::Y_CAL_F),
i2c_reg_read_float(reg::G_CAL_F),
i2c_reg_read_float(reg::B_CAL_F),
i2c_reg_read_float(reg::V_CAL_F)
};
}
uint8_t AS7262::temperature() {
return i2c_reg_read_uint8(reg::TEMP);
}
// i2c IO wrappers around the weird virtual i2c nonsense
void AS7262::i2c_reg_write_uint8(uint8_t reg, uint8_t value) {
_i2c_write(reg, &value, 1);
i2c_write(reg, &value, 1);
}
float AS7262::i2c_reg_read_float(uint8_t reg) {
float value;
_i2c_read(reg, (uint8_t *)&value, 4);
i2c_read(reg, (uint8_t *)&value, 4);
return __builtin_bswap32(value);
}
uint8_t AS7262::i2c_reg_read_uint8(uint8_t reg) {
uint8_t value;
_i2c_read(reg, &value, 1);
i2c_read(reg, &value, 1);
return value;
}
uint16_t AS7262::i2c_reg_read_uint16(uint8_t reg) {
uint16_t value;
_i2c_read(reg, (uint8_t *)&value, 2);
i2c_read(reg, (uint8_t *)&value, 2);
return value;
}
// Plumbing for virtual i2c
uint8_t AS7262::i2c_status() {
return _i2c_reg_read_uint8(0x00);
}
uint8_t AS7262::i2c_read(uint8_t reg, uint8_t *values, uint8_t len) {
for(uint8_t i = 0; i < len; i++){
while((i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, reg + i); // Set address pointer
while((i2c_status() & 0b01) != 1) {}; // Wait for read-ready
values[i] = _i2c_reg_read_uint8(0x02); // Read *one* byte :|
}
return 0;
}
uint8_t AS7262::i2c_write(uint8_t reg, uint8_t *values, uint8_t len) {
for(uint8_t i = 0; i < len; i++){
while((i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, reg | 0x80); // Set address pointer
while((i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, values[i]); // Write *one* byte :|
}
return 0;
}
// Plumbing for virtual i2c
void AS7262::_i2c_reg_write_uint8(uint8_t reg, uint8_t value) {
uint8_t buffer[2] = {reg, value};
i2c_write_blocking(i2c, address, buffer, 2, false);
@ -179,28 +210,4 @@ namespace pimoroni {
i2c_read_blocking(i2c, address, (uint8_t *)&value, 1, false);
return value;
}
uint8_t AS7262::_i2c_status() {
return _i2c_reg_read_uint8(0x00);
}
uint8_t AS7262::_i2c_read(uint8_t reg, uint8_t *values, uint8_t len) {
for(uint8_t i = 0; i < len; i++){
while((_i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, reg + i); // Set address pointer
while((_i2c_status() & 0b01) != 1) {}; // Wait for read-ready
values[i] = _i2c_reg_read_uint8(0x02); // Read *one* byte :|
}
return 0;
}
uint8_t AS7262::_i2c_write(uint8_t reg, uint8_t *values, uint8_t len) {
for(uint8_t i = 0; i < len; i++){
while((_i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, reg | 0x80); // Set address pointer
while((_i2c_status() & 0b10) != 0) {}; // Wait for write-ready
_i2c_reg_write_uint8(0x01, values[i]); // Write *one* byte :|
}
return 0;
}
}

Wyświetl plik

@ -102,9 +102,9 @@ namespace pimoroni {
int get_scl() const;
int get_int() const;
uint8_t device_type(); //TODO implement
uint8_t hardware_version(); //TODO implement
std::string firmware_version();
uint8_t device_type();
uint8_t hardware_version();
void firmware_version(uint8_t &major_out, uint8_t &minor_out, uint8_t &sub_out);
reading read();
uint8_t temperature();
@ -114,17 +114,18 @@ namespace pimoroni {
void set_illumination_current(illumination_current current);
void set_leds(bool illumination, bool indicator);
//TODO make these below functions private
private:
bool data_ready();
// Virtual i2c transfers, routed through read/write/status regs
uint8_t i2c_reg_read_uint8(uint8_t reg);
void i2c_reg_write_uint8(uint8_t reg, uint8_t value);
uint16_t i2c_reg_read_uint16(uint8_t reg);
float i2c_reg_read_float(uint8_t reg);
private:
bool data_ready();
uint8_t _i2c_status();
uint8_t _i2c_read(uint8_t reg, uint8_t *values, uint8_t len);
uint8_t _i2c_write(uint8_t reg, uint8_t *values, uint8_t len);
uint8_t i2c_status();
uint8_t i2c_read(uint8_t reg, uint8_t *values, uint8_t len);
uint8_t i2c_write(uint8_t reg, uint8_t *values, uint8_t len);
// *Real* single-byte i2c transfers
uint8_t _i2c_reg_read_uint8(uint8_t reg);

Wyświetl plik

@ -5,6 +5,10 @@ add_executable(
demo.cpp
)
# enable usb output, disable uart output
pico_enable_stdio_usb(${OUTPUT_NAME} 1)
pico_enable_stdio_uart(${OUTPUT_NAME} 0)
# Pull in pico libraries that we need
target_link_libraries(${OUTPUT_NAME} pico_stdlib breakout_as7262)

Wyświetl plik

@ -1,6 +1,3 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "pico/stdlib.h"
#include "breakout_as7262.hpp"
@ -10,14 +7,16 @@ using namespace pimoroni;
BreakoutAS7262 as7262;
int main() {
setup_default_uart();
stdio_init_all();
as7262.init();
//TODO replace with nice accessors
int16_t hw_version = as7262.i2c_reg_read_uint16(0x00);
int16_t fw_version = as7262.i2c_reg_read_uint16(0x02);
printf("%04x %04x \n", hw_version, fw_version);
uint8_t dev_type = as7262.device_type();
uint8_t hw_version = as7262.hardware_version();
uint8_t major, minor, sub;
as7262.firmware_version(major, minor, sub);
printf("Device: %d, HW: %d, FW: %d.%d.%d\n", dev_type, hw_version, major, minor, sub);
as7262.set_gain(AS7262::gain::X16);
as7262.set_measurement_mode(AS7262::measurement_mode::cont_roygbr);

Wyświetl plik

@ -0,0 +1,28 @@
import time
from breakout_as7262 import BreakoutAS7262
as7262 = BreakoutAS7262()
dev_type = as7262.device_type();
hw_version = as7262.hardware_version();
fw_version = as7262.firmware_version();
print("Device: ", dev_type, "HW: ", hw_version, sep="", end=", ")
print("FW: ", fw_version[0], ".", fw_version[1], ".", fw_version[2])
as7262.set_gain(BreakoutAS7262.X16)
as7262.set_measurement_mode(BreakoutAS7262.CONT_ROYGBR)
as7262.set_illumination_current(BreakoutAS7262.MA12)
as7262.set_indicator_current(BreakoutAS7262.MA4)
#as7262.set_leds(False, False)
while True:
reading = as7262.read()
print("R:", reading[0], end=" ")
print("O:", reading[1], end=" ")
print("Y:", reading[2], end=" ")
print("G:", reading[3], end=" ")
print("B:", reading[4], end=" ")
print("V:", reading[5])
time.sleep(1.0)

Wyświetl plik

@ -6,8 +6,8 @@
/***** Methods *****/
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_reset_obj, BreakoutAS7262_reset);
//MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_device_type_obj, BreakoutAS7262_device_type); //TODO
//MP_DEFINE_CONST_FUN_OBJ_KW(BreakoutAS7262_hardware_version_obj, 2, BreakoutAS7262_hardware_version); //TODO
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_device_type_obj, BreakoutAS7262_device_type);
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_hardware_version_obj, BreakoutAS7262_hardware_version);
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_firmware_version_obj, BreakoutAS7262_firmware_version);
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_read_obj, BreakoutAS7262_read);
MP_DEFINE_CONST_FUN_OBJ_1(BreakoutAS7262_temperature_obj, BreakoutAS7262_temperature);
@ -20,8 +20,8 @@ MP_DEFINE_CONST_FUN_OBJ_KW(BreakoutAS7262_set_leds_obj, 1, BreakoutAS7262_set_le
/***** Binding of Methods *****/
STATIC const mp_rom_map_elem_t BreakoutAS7262_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&BreakoutAS7262_reset_obj) },
//{ MP_ROM_QSTR(MP_QSTR_device_type), MP_ROM_PTR(&BreakoutAS7262_device_type_obj) },
//{ MP_ROM_QSTR(MP_QSTR_hardware_version), MP_ROM_PTR(&BreakoutAS7262_hardware_version_obj) },
{ MP_ROM_QSTR(MP_QSTR_device_type), MP_ROM_PTR(&BreakoutAS7262_device_type_obj) },
{ MP_ROM_QSTR(MP_QSTR_hardware_version), MP_ROM_PTR(&BreakoutAS7262_hardware_version_obj) },
{ MP_ROM_QSTR(MP_QSTR_firmware_version), MP_ROM_PTR(&BreakoutAS7262_firmware_version_obj) },
{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&BreakoutAS7262_read_obj) },
{ MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&BreakoutAS7262_temperature_obj) },
@ -30,6 +30,22 @@ STATIC const mp_rom_map_elem_t BreakoutAS7262_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_set_indicator_current), MP_ROM_PTR(&BreakoutAS7262_set_indicator_current_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_illumination_current), MP_ROM_PTR(&BreakoutAS7262_set_illumination_current_obj) },
{ MP_ROM_QSTR(MP_QSTR_set_leds), MP_ROM_PTR(&BreakoutAS7262_set_leds_obj) },
{ MP_ROM_QSTR(MP_QSTR_X1), MP_ROM_INT(MP_X1) },
{ MP_ROM_QSTR(MP_QSTR_X3_7), MP_ROM_INT(MP_X3_7) },
{ MP_ROM_QSTR(MP_QSTR_X16), MP_ROM_INT(MP_X16) },
{ MP_ROM_QSTR(MP_QSTR_X64), MP_ROM_INT(MP_X64) },
{ MP_ROM_QSTR(MP_QSTR_MA12), MP_ROM_INT(MP_MA12) },
{ MP_ROM_QSTR(MP_QSTR_MA25), MP_ROM_INT(MP_MA25) },
{ MP_ROM_QSTR(MP_QSTR_MA50), MP_ROM_INT(MP_MA50) },
{ MP_ROM_QSTR(MP_QSTR_MA100), MP_ROM_INT(MP_MA100) },
{ MP_ROM_QSTR(MP_QSTR_MA1), MP_ROM_INT(MP_MA1) },
{ MP_ROM_QSTR(MP_QSTR_MA2), MP_ROM_INT(MP_MA2) },
{ MP_ROM_QSTR(MP_QSTR_MA4), MP_ROM_INT(MP_MA4) },
{ MP_ROM_QSTR(MP_QSTR_MA8), MP_ROM_INT(MP_MA8) },
{ MP_ROM_QSTR(MP_QSTR_CONT_YGNV), MP_ROM_INT(MP_CONT_YGNV) },
{ MP_ROM_QSTR(MP_QSTR_CONT_ROYG), MP_ROM_INT(MP_CONT_ROYG) },
{ MP_ROM_QSTR(MP_QSTR_CONT_ROYGBR), MP_ROM_INT(MP_CONT_ROYGBR) },
{ MP_ROM_QSTR(MP_QSTR_ONESHOT), MP_ROM_INT(MP_ONESHOT) },
};
STATIC MP_DEFINE_CONST_DICT(BreakoutAS7262_locals_dict, BreakoutAS7262_locals_dict_table);
@ -49,7 +65,7 @@ const mp_obj_type_t breakout_as7262_BreakoutAS7262_type = {
/***** Globals Table *****/
STATIC const mp_map_elem_t breakout_as7262_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_breakout_as7262) },
{ MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_breakout_as7262) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_BreakoutAS7262), (mp_obj_t)&breakout_as7262_BreakoutAS7262_type },
};
STATIC MP_DEFINE_CONST_DICT(mp_module_breakout_as7262_globals, breakout_as7262_globals_table);

Wyświetl plik

@ -48,7 +48,7 @@ mp_obj_t BreakoutAS7262_make_new(const mp_obj_type_t *type, size_t n_args, size_
mp_arg_check_num(n_args, n_kw, 0, 0, true);
self = m_new_obj(breakout_as7262_BreakoutAS7262_obj_t);
self->base.type = &breakout_as7262_BreakoutAS7262_type;
self->breakout = new BreakoutAS7262();
self->breakout = new BreakoutAS7262();
}
else {
enum { ARG_i2c, ARG_sda, ARG_scl, ARG_int };
@ -70,14 +70,14 @@ mp_obj_t BreakoutAS7262_make_new(const mp_obj_type_t *type, size_t n_args, size_
}
int sda = args[ARG_sda].u_int;
if (!IS_VALID_SDA(i2c_id, sda)) {
if(!IS_VALID_SDA(i2c_id, sda)) {
mp_raise_ValueError(MP_ERROR_TEXT("bad SDA pin"));
}
int scl = args[ARG_scl].u_int;
if (!IS_VALID_SCL(i2c_id, scl)) {
if(!IS_VALID_SCL(i2c_id, scl)) {
mp_raise_ValueError(MP_ERROR_TEXT("bad SCL pin"));
}
}
self = m_new_obj(breakout_as7262_BreakoutAS7262_obj_t);
self->base.type = &breakout_as7262_BreakoutAS7262_type;
@ -99,26 +99,27 @@ mp_obj_t BreakoutAS7262_reset(mp_obj_t self_in) {
return mp_const_none;
}
//TODO
/*mp_obj_t BreakoutAS7262_device_type(mp_obj_t self_in) {
mp_obj_t BreakoutAS7262_device_type(mp_obj_t self_in) {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_as7262_BreakoutAS7262_obj_t);
self->breakout->reset();
return mp_obj_new_int(self->breakout->device_type());
}
return mp_const_none;
}*/
//TODO
/*mp_obj_t BreakoutAS7262_hardware_version(mp_obj_t self_in) {
mp_obj_t BreakoutAS7262_hardware_version(mp_obj_t self_in) {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_as7262_BreakoutAS7262_obj_t);
self->breakout->reset();
return mp_const_none;
}*/
return mp_obj_new_int(self->breakout->hardware_version());
}
mp_obj_t BreakoutAS7262_firmware_version(mp_obj_t self_in) {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(self_in, breakout_as7262_BreakoutAS7262_obj_t);
std::string fw = self->breakout->firmware_version();
return mp_obj_new_str(fw.c_str(), fw.length());
uint8_t major, minor, sub;
self->breakout->firmware_version(major, minor, sub);
mp_obj_t tuple[3];
tuple[0] = mp_obj_new_int(major);
tuple[1] = mp_obj_new_float(minor);
tuple[2] = mp_obj_new_float(sub);
return mp_obj_new_tuple(3, tuple);
}
mp_obj_t BreakoutAS7262_read(mp_obj_t self_in) {
@ -150,10 +151,9 @@ mp_obj_t BreakoutAS7262_set_gain(size_t n_args, const mp_obj_t *pos_args, mp_map
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);
//TODO expose values as constants
int gain = args[ARG_gain].u_int;
if(gain < 0 || gain > 3) {
mp_raise_ValueError("mode not a valid value. Expected 0 to 3");
mp_raise_ValueError("mode not a valid value. Expected 0 to 3 (X1, X3_7, X16, X64)");
}
else {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, breakout_as7262_BreakoutAS7262_obj_t);
@ -173,10 +173,9 @@ mp_obj_t BreakoutAS7262_set_measurement_mode(size_t n_args, const mp_obj_t *pos_
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);
//TODO expose values as constants
int mode = args[ARG_mode].u_int;
if(mode < 0 || mode > 3) {
mp_raise_ValueError("mode not a valid value. Expected 0 to 3");
mp_raise_ValueError("mode not a valid value. Expected 0 to 3 (CONT_YGNV, CONT_ROYG, CONT_ROYGBR, ONESHOT)");
}
else {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, breakout_as7262_BreakoutAS7262_obj_t);
@ -196,10 +195,9 @@ mp_obj_t BreakoutAS7262_set_indicator_current(size_t n_args, const mp_obj_t *pos
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);
//TODO expose values as constants
int current = args[ARG_current].u_int;
if(current < 0 || current > 3) {
mp_raise_ValueError("current not a valid value. Expected 0 to 3");
mp_raise_ValueError("current not a valid value. Expected 0 to 3 (MA1, MA2, MA4, MA8)");
}
else {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, breakout_as7262_BreakoutAS7262_obj_t);
@ -219,10 +217,9 @@ mp_obj_t BreakoutAS7262_set_illumination_current(size_t n_args, const mp_obj_t *
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);
//TODO expose values as constants
int current = args[ARG_current].u_int;
if(current < 0 || current > 3) {
mp_raise_ValueError("current not a valid value. Expected 0 to 3");
mp_raise_ValueError("current not a valid value. Expected 0 to 3 (MA12, MA25, MA50, MA100)");
}
else {
breakout_as7262_BreakoutAS7262_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, breakout_as7262_BreakoutAS7262_obj_t);

Wyświetl plik

@ -1,7 +1,35 @@
// Include MicroPython API.
#include "py/runtime.h"
/***** Constants *****/
enum {
MP_X1 = 0b00,
MP_X3_7 = 0b01,
MP_X16 = 0b10,
MP_X64 = 0b11
};
enum {
MP_MA12 = 0b00,
MP_MA25 = 0b01,
MP_MA50 = 0b10,
MP_MA100 = 0b11
};
enum {
MP_MA1 = 0b00,
MP_MA2 = 0b01,
MP_MA4 = 0b10,
MP_MA8 = 0b11
};
enum {
MP_CONT_YGNV = 0b00, // yellow, green, blue, violet - continuous
MP_CONT_ROYG = 0b01, // red, orange, yellow, green - continuous
MP_CONT_ROYGBR = 0b10, // red, orange, yellow, green, violet - continuous
MP_ONESHOT = 0b11 // everything - one-shot
};
/***** Extern of Class Definition *****/
extern const mp_obj_type_t breakout_as7262_BreakoutAS7262_type;
@ -9,13 +37,11 @@ extern const mp_obj_type_t breakout_as7262_BreakoutAS7262_type;
extern void BreakoutAS7262_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
extern mp_obj_t BreakoutAS7262_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args);
extern mp_obj_t BreakoutAS7262_reset(mp_obj_t self_in);
//extern mp_obj_t BreakoutAS7262_device_type(mp_obj_t self_in); //TODO needs C implementation
//extern mp_obj_t BreakoutAS7262_hardware_version(mp_obj_t self_in); //TODO needs C implementation
extern mp_obj_t BreakoutAS7262_device_type(mp_obj_t self_in);
extern mp_obj_t BreakoutAS7262_hardware_version(mp_obj_t self_in);
extern mp_obj_t BreakoutAS7262_firmware_version(mp_obj_t self_in);
extern mp_obj_t BreakoutAS7262_read(mp_obj_t self_in);
extern mp_obj_t BreakoutAS7262_temperature(mp_obj_t self_in);
extern mp_obj_t BreakoutAS7262_set_gain(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutAS7262_set_measurement_mode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
extern mp_obj_t BreakoutAS7262_set_indicator_current(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);