Berry add new type "addr" to ctypes mapping (#21883)

This commit is contained in:
s-hadinger 2024-08-01 10:29:49 +02:00 committed by GitHub
parent a3ed99e549
commit 836ce9ef9b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 20 additions and 72 deletions

View File

@ -12,7 +12,8 @@ All notable changes to this project will be documented in this file.
- NeoPool command `NPSetOption<x>` to enabled/disable data validation/connection statistics (#21850)
- Analog GPIO ``ADC Input`` with ``AdcParam<x> 1,<start_range>,<end_range>,<margin>,1`` provide direct light control
- Analog GPIO ``ADC Voltage`` with ``AdcParam<x> 11,<start_range>,<end_range>,<lowest_voltage>,<highest_voltage>`` provide energy monitoring with dc voltage
- Analog GPIO ``ADC Current`` with ``AdcParam<x> 12,<start_range>,<end_range>,<lowest_current>,<highest_current>`` provide energy monitoring with dc voltage
- Analog GPIO ``ADC Current`` with ``AdcParam<x> 12,<start_range>,<end_range>,<lowest_current>,<highest_current>`` provide energy monitoring with dc voltage
- Berry add new type "addr" to ctypes mapping
### Breaking Changed

View File

@ -33,6 +33,10 @@ enum {
ctypes_ptr32 = 9,
ctypes_ptr64 = -9,
// address (no acces to the value)
ctypes_addr = 15,
// special
ctypes_bf = 0, //bif-field
};
@ -52,17 +56,6 @@ typedef struct be_ctypes_structure_t {
const be_ctypes_structure_item_t * items;
} be_ctypes_structure_t;
typedef struct be_ctypes_class_t {
const char * name;
const be_ctypes_structure_t * definitions;
} be_ctypes_class_t;
typedef struct be_ctypes_classes_t {
uint16_t size;
const char **instance_mapping; /* array of instance class names for automatic instanciation of class */
const be_ctypes_class_t * classes;
} be_ctypes_classes_t;
#ifdef __cplusplus
extern "C" {
#endif

View File

@ -3,6 +3,7 @@
*******************************************************************/
#include "be_constobj.h"
#include <string.h>
#include "be_ctypes.h"
extern __attribute__((noreturn)) void be_raisef(bvm *vm, const char *except, const char *msg, ...);
@ -34,65 +35,6 @@ int32_t bin_search_ctypes(const char * needle, const void * table, size_t elt_si
}
}
enum {
ctypes_i32 = 14,
ctypes_i24 = 13,
ctypes_i16 = 12,
ctypes_i8 = 11,
ctypes_u32 = 4,
ctypes_u24 = 3,
ctypes_u16 = 2,
ctypes_u8 = 1,
// big endian
ctypes_be_i32 = -14,
ctypes_be_i24 = -13,
ctypes_be_i16 = -12,
ctypes_be_i8 = -11,
ctypes_be_u32 = -4,
ctypes_be_u16 = -2,
ctypes_be_u8 = -1,
// floating point
ctypes_float = 5,
ctypes_double = 10,
// pointer
ctypes_ptr32 = 9,
ctypes_ptr64 = -9,
ctypes_bf = 0, //bif-field
};
typedef struct be_ctypes_structure_item_t {
const char * name;
uint16_t offset_bytes;
uint8_t offset_bits : 3;
uint8_t len_bits : 5;
int8_t type : 5;
uint8_t mapping : 3;
} be_ctypes_structure_item_t;
typedef struct be_ctypes_structure_t {
uint16_t size_bytes; /* size in bytes */
uint16_t size_elt; /* number of elements */
const char **instance_mapping; /* array of instance class names for automatic instanciation of class */
const be_ctypes_structure_item_t * items;
} be_ctypes_structure_t;
typedef struct be_ctypes_class_t {
const char * name;
const be_ctypes_structure_t * definitions;
} be_ctypes_class_t;
typedef struct be_ctypes_classes_t {
uint16_t size;
const char **instance_mapping; /* array of instance class names for automatic instanciation of class */
const be_ctypes_class_t * classes;
} be_ctypes_classes_t;
// const be_ctypes_class_t * g_ctypes_classes = NULL;
//
// Constructor for ctypes structure
//
@ -232,6 +174,15 @@ int be_ctypes_member(bvm *vm) {
int32_t val = be_toint(vm, -1);
be_pop(vm, 1);
be_pushcomptr(vm, (void*) val);
} else if (ctypes_addr == member->type) {
be_getmember(vm, 1, "_buffer"); // self.get or self.geti
be_pushvalue(vm, 1); // push self
be_call(vm, 1);
be_pop(vm, 1);
uint8_t *addr = (uint8_t*) be_tocomptr(vm, -1);
be_pop(vm, 1);
addr += member->offset_bytes;
be_pushcomptr(vm, addr);
} else {
// general int support
int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian
@ -253,7 +204,7 @@ int be_ctypes_member(bvm *vm) {
be_pop(vm, 3);
// int result at top of stack
}
// the int result is at top of the stack
// the int or comptr result is at top of the stack
// check if we need an instance mapping
if (member->mapping > 0 && definitions->instance_mapping) {
const char * mapping_name = definitions->instance_mapping[member->mapping - 1];
@ -362,6 +313,9 @@ int be_ctypes_setmember(bvm *vm) {
be_call(vm, 4);
be_pop(vm, 5);
be_return_nil(vm);
} else if (ctypes_addr == member->type) {
be_raisef(vm, "attribute_error", "class '%s' cannot assign to attribute '%s'",
be_classname(vm, 1), be_tostring(vm, 2));
} else {
// general int support
int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian