mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-23 18:56:38 +00:00
Berry add new type "addr" to ctypes mapping (#21883)
This commit is contained in:
parent
a3ed99e549
commit
836ce9ef9b
@ -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)
|
- 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 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 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
|
### Breaking Changed
|
||||||
|
|
||||||
|
@ -33,6 +33,10 @@ enum {
|
|||||||
ctypes_ptr32 = 9,
|
ctypes_ptr32 = 9,
|
||||||
ctypes_ptr64 = -9,
|
ctypes_ptr64 = -9,
|
||||||
|
|
||||||
|
// address (no acces to the value)
|
||||||
|
ctypes_addr = 15,
|
||||||
|
|
||||||
|
// special
|
||||||
ctypes_bf = 0, //bif-field
|
ctypes_bf = 0, //bif-field
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -52,17 +56,6 @@ typedef struct be_ctypes_structure_t {
|
|||||||
const be_ctypes_structure_item_t * items;
|
const be_ctypes_structure_item_t * items;
|
||||||
} be_ctypes_structure_t;
|
} 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
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
#include "be_constobj.h"
|
#include "be_constobj.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "be_ctypes.h"
|
||||||
|
|
||||||
extern __attribute__((noreturn)) void be_raisef(bvm *vm, const char *except, const char *msg, ...);
|
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
|
// Constructor for ctypes structure
|
||||||
//
|
//
|
||||||
@ -232,6 +174,15 @@ int be_ctypes_member(bvm *vm) {
|
|||||||
int32_t val = be_toint(vm, -1);
|
int32_t val = be_toint(vm, -1);
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
be_pushcomptr(vm, (void*) val);
|
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 {
|
} else {
|
||||||
// general int support
|
// general int support
|
||||||
int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian
|
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);
|
be_pop(vm, 3);
|
||||||
// int result at top of stack
|
// 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
|
// check if we need an instance mapping
|
||||||
if (member->mapping > 0 && definitions->instance_mapping) {
|
if (member->mapping > 0 && definitions->instance_mapping) {
|
||||||
const char * mapping_name = definitions->instance_mapping[member->mapping - 1];
|
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_call(vm, 4);
|
||||||
be_pop(vm, 5);
|
be_pop(vm, 5);
|
||||||
be_return_nil(vm);
|
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 {
|
} else {
|
||||||
// general int support
|
// general int support
|
||||||
int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian
|
int size = member->type; // eventually 1/2/4, positive if little endian, negative if big endian
|
||||||
|
Loading…
x
Reference in New Issue
Block a user