Berry `energy` module support for 8 phases and move to pseudo-arrays (#21887)

* Berry `energy` module support for 8 phases and move to pseudo-arrays

* add size()
This commit is contained in:
s-hadinger 2024-08-01 22:37:37 +02:00 committed by GitHub
parent 40ee4cc316
commit 010ca34622
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 744 additions and 47 deletions

View File

@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
- Berry add `solidify.nocompact()` and reduce size of Matter UI - Berry add `solidify.nocompact()` and reduce size of Matter UI
### Breaking Changed ### Breaking Changed
- Berry `energy` module support for 8 phases and move to pseudo-arrays
### Changed ### Changed
- Berry consolidated constants for solidified classes reduces Flash size (#2185) - Berry consolidated constants for solidified classes reduces Flash size (#2185)

View File

@ -9,6 +9,9 @@
#ifdef USE_ENERGY_SENSOR #ifdef USE_ENERGY_SENSOR
// unless we get it from an include
#define ENERGY_MAX_PHASES 8 // Support max eight phases/channels
extern struct ENERGY Energy; extern struct ENERGY Energy;
extern int module_energy_update_total(bvm *vm); extern int module_energy_update_total(bvm *vm);
@ -21,10 +24,17 @@ module energy (scope: global) {
init, closure(module_energy_init_closure) init, closure(module_energy_init_closure)
_ptr, comptr(&Energy) _ptr, comptr(&Energy)
_deref, closure(module_energy__deref_closure) _deref, closure(module_energy__deref_closure)
_phases, int(ENERGY_MAX_PHASES)
_phases_float, class(be_class_energy_phases_float)
_phases_int32, class(be_class_energy_phases_int32)
_phases_uint8, class(be_class_energy_phases_uint8)
_phases_uint16, class(be_class_energy_phases_uint16)
read, closure(module_energy_read_closure) read, closure(module_energy_read_closure)
member, closure(module_energy_member_closure) member, closure(module_energy_member_closure)
setmember, closure(module_energy_setmember_closure) setmember, closure(module_energy_setmember_closure)
tomap, closure(module_energy_tomap_closure)
update_total, func(module_energy_update_total) update_total, func(module_energy_update_total)
} }

View File

@ -2,8 +2,117 @@
_energy = nil # avoid compilation error _energy = nil # avoid compilation error
energy_struct = nil energy_struct = nil
#@ solidify:bytes_array
# implement an array of simple types
class bytes_array : bytes
var item_type # item_type number for each element
var sz # size (number of items in the array)
var item_size # size in bytes of each element (inferred from item_type)
def init(ptr, item_type, sz)
self.item_type = item_type
self.sz = sz
var item_size # size in bytes of each element
if (item_type >= -4) && (item_type <= 4) && (item_type != 0)
item_size = (item_type > 0) ? item_type : - item_type
elif (item_type == 5)
item_size = 4
else
raise "value error", "unsupported item_type number"
end
self.item_size = item_size
super(self).init(ptr, self.item_size * self.sz)
end
def item(idx)
if (idx < 0) idx += self.sz end
if (idx < 0) || (idx >= self.sz)
raise "index_error", "list index out of range"
end
if (self.item_type == 5)
return self.getfloat(idx * self.item_size)
else
return self.get(idx * self.item_size, self.item_type)
end
end
def setitem(idx, v)
if (idx < 0) idx += self.sz end
if (idx < 0) || (idx >= self.sz)
raise "index_error", "list assignment index out of range"
end
if (self.item_type == 5)
return self.setfloat(idx * self.item_size, v)
else
return self.set(idx * self.item_size, self.item_type, v)
end
end
def size()
return self.sz
end
def tostring()
var ret = '['
var idx = 0
while (idx < self.sz)
if idx > 0
ret += ','
end
#
if (self.item_type == 5)
ret += str(self.getfloat(idx * self.item_size))
else
ret += str(self.get(idx * self.item_size, self.item_type))
end
idx += 1
end
ret += ']'
return ret
end
end
#@ solidify:energy_phases_float
class energy_phases_float : bytes_array
def init(ptr)
import energy
super(self).init(ptr, 5 #-type float-#, energy._phases)
end
end
#@ solidify:energy_phases_int32
class energy_phases_int32 : bytes_array
def init(ptr)
import energy
super(self).init(ptr, 4 #-type int32-#, energy._phases)
end
end
#@ solidify:energy_phases_uint8
class energy_phases_uint8 : bytes_array
def init(ptr)
import energy
super(self).init(ptr, 1 #-type int32-#, energy._phases)
end
end
#@ solidify:energy_phases_uint16
class energy_phases_uint16 : bytes_array
def init(ptr)
import energy
super(self).init(ptr, 2 #-type uint16-#, energy._phases)
end
end
energy = module("energy") energy = module("energy")
energy._ptr = nil energy._ptr = nil # will be replaced by C code
energy._phases = 8 # will be replaced by C code
energy._phases_float = energy_phases_float
energy._phases_int32 = energy_phases_int32
energy._phases_uint8 = energy_phases_uint8
energy._phases_uint16 = energy_phases_uint16
def init(m) def init(m)
global._energy = nil global._energy = nil
@ -46,8 +155,17 @@ def setmember(k, v)
end end
energy.setmember = setmember energy.setmember = setmember
def tomap()
energy._deref()
if global._energy
return _energy.tomap()
end
end
energy.tomap = tomap
#@ solidify:energy.init #@ solidify:energy.init
#@ solidify:energy._deref #@ solidify:energy._deref
#@ solidify:energy.read #@ solidify:energy.read
#@ solidify:energy.member #@ solidify:energy.member
#@ solidify:energy.setmember #@ solidify:energy.setmember
#@ solidify:energy.tomap

View File

@ -3,6 +3,505 @@
* Generated code, don't edit * * Generated code, don't edit *
\********************************************************************/ \********************************************************************/
#include "be_constobj.h" #include "be_constobj.h"
// compact class 'bytes_array' ktab size: 18, total: 34 (saved 128 bytes)
static const bvalue be_ktab_class_bytes_array[18] = {
/* K0 */ be_nested_str(item_type),
/* K1 */ be_nested_str(sz),
/* K2 */ be_const_int(0),
/* K3 */ be_nested_str(value_X20error),
/* K4 */ be_nested_str(unsupported_X20item_type_X20number),
/* K5 */ be_nested_str(item_size),
/* K6 */ be_nested_str(init),
/* K7 */ be_nested_str(_X5B),
/* K8 */ be_nested_str(_X2C),
/* K9 */ be_nested_str(getfloat),
/* K10 */ be_nested_str(get),
/* K11 */ be_const_int(1),
/* K12 */ be_nested_str(_X5D),
/* K13 */ be_nested_str(index_error),
/* K14 */ be_nested_str(list_X20index_X20out_X20of_X20range),
/* K15 */ be_nested_str(list_X20assignment_X20index_X20out_X20of_X20range),
/* K16 */ be_nested_str(setfloat),
/* K17 */ be_nested_str(set),
};
extern const bclass be_class_bytes_array;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(class_bytes_array_init, /* name */
be_nested_proto(
10, /* nstack */
4, /* argc */
10, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
&be_ktab_class_bytes_array, /* shared constants */
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[35]) { /* code */
0x90020002, // 0000 SETMBR R0 K0 R2
0x90020203, // 0001 SETMBR R0 K1 R3
0x4C100000, // 0002 LDNIL R4
0x5415FFFB, // 0003 LDINT R5 -4
0x28140405, // 0004 GE R5 R2 R5
0x7816000B, // 0005 JMPF R5 #0012
0x54160003, // 0006 LDINT R5 4
0x18140405, // 0007 LE R5 R2 R5
0x78160008, // 0008 JMPF R5 #0012
0x20140502, // 0009 NE R5 R2 K2
0x78160006, // 000A JMPF R5 #0012
0x24140502, // 000B GT R5 R2 K2
0x78160001, // 000C JMPF R5 #000F
0x5C140400, // 000D MOVE R5 R2
0x70020000, // 000E JMP #0010
0x44140400, // 000F NEG R5 R2
0x5C100A00, // 0010 MOVE R4 R5
0x70020005, // 0011 JMP #0018
0x54160004, // 0012 LDINT R5 5
0x1C140405, // 0013 EQ R5 R2 R5
0x78160001, // 0014 JMPF R5 #0017
0x54120003, // 0015 LDINT R4 4
0x70020000, // 0016 JMP #0018
0xB0060704, // 0017 RAISE 1 K3 K4
0x90020A04, // 0018 SETMBR R0 K5 R4
0x60140003, // 0019 GETGBL R5 G3
0x5C180000, // 001A MOVE R6 R0
0x7C140200, // 001B CALL R5 1
0x8C140B06, // 001C GETMET R5 R5 K6
0x5C1C0200, // 001D MOVE R7 R1
0x88200105, // 001E GETMBR R8 R0 K5
0x88240101, // 001F GETMBR R9 R0 K1
0x08201009, // 0020 MUL R8 R8 R9
0x7C140600, // 0021 CALL R5 3
0x80000000, // 0022 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: size
********************************************************************/
be_local_closure(class_bytes_array_size, /* name */
be_nested_proto(
2, /* nstack */
1, /* argc */
10, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
&be_ktab_class_bytes_array, /* shared constants */
&be_const_str_size,
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x88040101, // 0000 GETMBR R1 R0 K1
0x80040200, // 0001 RET 1 R1
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: tostring
********************************************************************/
be_local_closure(class_bytes_array_tostring, /* name */
be_nested_proto(
8, /* nstack */
1, /* argc */
10, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
&be_ktab_class_bytes_array, /* shared constants */
&be_const_str_tostring,
&be_const_str_solidified,
( &(const binstruction[32]) { /* code */
0x58040007, // 0000 LDCONST R1 K7
0x58080002, // 0001 LDCONST R2 K2
0x880C0101, // 0002 GETMBR R3 R0 K1
0x140C0403, // 0003 LT R3 R2 R3
0x780E0018, // 0004 JMPF R3 #001E
0x240C0502, // 0005 GT R3 R2 K2
0x780E0000, // 0006 JMPF R3 #0008
0x00040308, // 0007 ADD R1 R1 K8
0x880C0100, // 0008 GETMBR R3 R0 K0
0x54120004, // 0009 LDINT R4 5
0x1C0C0604, // 000A EQ R3 R3 R4
0x780E0007, // 000B JMPF R3 #0014
0x600C0008, // 000C GETGBL R3 G8
0x8C100109, // 000D GETMET R4 R0 K9
0x88180105, // 000E GETMBR R6 R0 K5
0x08180406, // 000F MUL R6 R2 R6
0x7C100400, // 0010 CALL R4 2
0x7C0C0200, // 0011 CALL R3 1
0x00040203, // 0012 ADD R1 R1 R3
0x70020007, // 0013 JMP #001C
0x600C0008, // 0014 GETGBL R3 G8
0x8C10010A, // 0015 GETMET R4 R0 K10
0x88180105, // 0016 GETMBR R6 R0 K5
0x08180406, // 0017 MUL R6 R2 R6
0x881C0100, // 0018 GETMBR R7 R0 K0
0x7C100600, // 0019 CALL R4 3
0x7C0C0200, // 001A CALL R3 1
0x00040203, // 001B ADD R1 R1 R3
0x0008050B, // 001C ADD R2 R2 K11
0x7001FFE3, // 001D JMP #0002
0x0004030C, // 001E ADD R1 R1 K12
0x80040200, // 001F RET 1 R1
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: item
********************************************************************/
be_local_closure(class_bytes_array_item, /* name */
be_nested_proto(
6, /* nstack */
2, /* argc */
10, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
&be_ktab_class_bytes_array, /* shared constants */
&be_const_str_item,
&be_const_str_solidified,
( &(const binstruction[27]) { /* code */
0x14080302, // 0000 LT R2 R1 K2
0x780A0001, // 0001 JMPF R2 #0004
0x88080101, // 0002 GETMBR R2 R0 K1
0x00040202, // 0003 ADD R1 R1 R2
0x14080302, // 0004 LT R2 R1 K2
0x740A0002, // 0005 JMPT R2 #0009
0x88080101, // 0006 GETMBR R2 R0 K1
0x28080202, // 0007 GE R2 R1 R2
0x780A0000, // 0008 JMPF R2 #000A
0xB0061B0E, // 0009 RAISE 1 K13 K14
0x88080100, // 000A GETMBR R2 R0 K0
0x540E0004, // 000B LDINT R3 5
0x1C080403, // 000C EQ R2 R2 R3
0x780A0005, // 000D JMPF R2 #0014
0x8C080109, // 000E GETMET R2 R0 K9
0x88100105, // 000F GETMBR R4 R0 K5
0x08100204, // 0010 MUL R4 R1 R4
0x7C080400, // 0011 CALL R2 2
0x80040400, // 0012 RET 1 R2
0x70020005, // 0013 JMP #001A
0x8C08010A, // 0014 GETMET R2 R0 K10
0x88100105, // 0015 GETMBR R4 R0 K5
0x08100204, // 0016 MUL R4 R1 R4
0x88140100, // 0017 GETMBR R5 R0 K0
0x7C080600, // 0018 CALL R2 3
0x80040400, // 0019 RET 1 R2
0x80000000, // 001A RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: setitem
********************************************************************/
be_local_closure(class_bytes_array_setitem, /* name */
be_nested_proto(
8, /* nstack */
3, /* argc */
10, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
&be_ktab_class_bytes_array, /* shared constants */
&be_const_str_setitem,
&be_const_str_solidified,
( &(const binstruction[29]) { /* code */
0x140C0302, // 0000 LT R3 R1 K2
0x780E0001, // 0001 JMPF R3 #0004
0x880C0101, // 0002 GETMBR R3 R0 K1
0x00040203, // 0003 ADD R1 R1 R3
0x140C0302, // 0004 LT R3 R1 K2
0x740E0002, // 0005 JMPT R3 #0009
0x880C0101, // 0006 GETMBR R3 R0 K1
0x280C0203, // 0007 GE R3 R1 R3
0x780E0000, // 0008 JMPF R3 #000A
0xB0061B0F, // 0009 RAISE 1 K13 K15
0x880C0100, // 000A GETMBR R3 R0 K0
0x54120004, // 000B LDINT R4 5
0x1C0C0604, // 000C EQ R3 R3 R4
0x780E0006, // 000D JMPF R3 #0015
0x8C0C0110, // 000E GETMET R3 R0 K16
0x88140105, // 000F GETMBR R5 R0 K5
0x08140205, // 0010 MUL R5 R1 R5
0x5C180400, // 0011 MOVE R6 R2
0x7C0C0600, // 0012 CALL R3 3
0x80040600, // 0013 RET 1 R3
0x70020006, // 0014 JMP #001C
0x8C0C0111, // 0015 GETMET R3 R0 K17
0x88140105, // 0016 GETMBR R5 R0 K5
0x08140205, // 0017 MUL R5 R1 R5
0x88180100, // 0018 GETMBR R6 R0 K0
0x5C1C0400, // 0019 MOVE R7 R2
0x7C0C0800, // 001A CALL R3 4
0x80040600, // 001B RET 1 R3
0x80000000, // 001C RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: bytes_array
********************************************************************/
extern const bclass be_class_bytes;
be_local_class(bytes_array,
3,
&be_class_bytes,
be_nested_map(8,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(sz, -1), be_const_var(1) },
{ be_const_key(setitem, -1), be_const_closure(class_bytes_array_setitem_closure) },
{ be_const_key(item_size, -1), be_const_var(2) },
{ be_const_key(init, 7), be_const_closure(class_bytes_array_init_closure) },
{ be_const_key(size, 1), be_const_closure(class_bytes_array_size_closure) },
{ be_const_key(tostring, -1), be_const_closure(class_bytes_array_tostring_closure) },
{ be_const_key(item, -1), be_const_closure(class_bytes_array_item_closure) },
{ be_const_key(item_type, -1), be_const_var(0) },
})),
(bstring*) &be_const_str_bytes_array
);
extern const bclass be_class_energy_phases_float;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(class_energy_phases_float_init, /* name */
be_nested_proto(
8, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str(energy),
/* K1 */ be_nested_str(init),
/* K2 */ be_nested_str(_phases),
}),
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[10]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x600C0003, // 0001 GETGBL R3 G3
0x5C100000, // 0002 MOVE R4 R0
0x7C0C0200, // 0003 CALL R3 1
0x8C0C0701, // 0004 GETMET R3 R3 K1
0x5C140200, // 0005 MOVE R5 R1
0x541A0004, // 0006 LDINT R6 5
0x881C0502, // 0007 GETMBR R7 R2 K2
0x7C0C0800, // 0008 CALL R3 4
0x80000000, // 0009 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: energy_phases_float
********************************************************************/
extern const bclass be_class_bytes_array;
be_local_class(energy_phases_float,
0,
&be_class_bytes_array,
be_nested_map(1,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(init, -1), be_const_closure(class_energy_phases_float_init_closure) },
})),
(bstring*) &be_const_str_energy_phases_float
);
extern const bclass be_class_energy_phases_int32;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(class_energy_phases_int32_init, /* name */
be_nested_proto(
8, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str(energy),
/* K1 */ be_nested_str(init),
/* K2 */ be_nested_str(_phases),
}),
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[10]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x600C0003, // 0001 GETGBL R3 G3
0x5C100000, // 0002 MOVE R4 R0
0x7C0C0200, // 0003 CALL R3 1
0x8C0C0701, // 0004 GETMET R3 R3 K1
0x5C140200, // 0005 MOVE R5 R1
0x541A0003, // 0006 LDINT R6 4
0x881C0502, // 0007 GETMBR R7 R2 K2
0x7C0C0800, // 0008 CALL R3 4
0x80000000, // 0009 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: energy_phases_int32
********************************************************************/
extern const bclass be_class_bytes_array;
be_local_class(energy_phases_int32,
0,
&be_class_bytes_array,
be_nested_map(1,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(init, -1), be_const_closure(class_energy_phases_int32_init_closure) },
})),
(bstring*) &be_const_str_energy_phases_int32
);
extern const bclass be_class_energy_phases_uint8;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(class_energy_phases_uint8_init, /* name */
be_nested_proto(
8, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 4]) { /* constants */
/* K0 */ be_nested_str(energy),
/* K1 */ be_nested_str(init),
/* K2 */ be_const_int(1),
/* K3 */ be_nested_str(_phases),
}),
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[10]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x600C0003, // 0001 GETGBL R3 G3
0x5C100000, // 0002 MOVE R4 R0
0x7C0C0200, // 0003 CALL R3 1
0x8C0C0701, // 0004 GETMET R3 R3 K1
0x5C140200, // 0005 MOVE R5 R1
0x58180002, // 0006 LDCONST R6 K2
0x881C0503, // 0007 GETMBR R7 R2 K3
0x7C0C0800, // 0008 CALL R3 4
0x80000000, // 0009 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: energy_phases_uint8
********************************************************************/
extern const bclass be_class_bytes_array;
be_local_class(energy_phases_uint8,
0,
&be_class_bytes_array,
be_nested_map(1,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(init, -1), be_const_closure(class_energy_phases_uint8_init_closure) },
})),
(bstring*) &be_const_str_energy_phases_uint8
);
extern const bclass be_class_energy_phases_uint16;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(class_energy_phases_uint16_init, /* name */
be_nested_proto(
8, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 4]) { /* constants */
/* K0 */ be_nested_str(energy),
/* K1 */ be_nested_str(init),
/* K2 */ be_const_int(2),
/* K3 */ be_nested_str(_phases),
}),
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[10]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x600C0003, // 0001 GETGBL R3 G3
0x5C100000, // 0002 MOVE R4 R0
0x7C0C0200, // 0003 CALL R3 1
0x8C0C0701, // 0004 GETMET R3 R3 K1
0x5C140200, // 0005 MOVE R5 R1
0x58180002, // 0006 LDCONST R6 K2
0x881C0503, // 0007 GETMBR R7 R2 K3
0x7C0C0800, // 0008 CALL R3 4
0x80000000, // 0009 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: energy_phases_uint16
********************************************************************/
extern const bclass be_class_bytes_array;
be_local_class(energy_phases_uint16,
0,
&be_class_bytes_array,
be_nested_map(1,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(init, -1), be_const_closure(class_energy_phases_uint16_init_closure) },
})),
(bstring*) &be_const_str_energy_phases_uint16
);
/******************************************************************** /********************************************************************
** Solidified function: init ** Solidified function: init
@ -206,5 +705,45 @@ be_local_closure(module_energy_setmember, /* name */
); );
/*******************************************************************/ /*******************************************************************/
/********************************************************************
** Solidified function: tomap
********************************************************************/
be_local_closure(module_energy_tomap, /* name */
be_nested_proto(
2, /* nstack */
0, /* argc */
0, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 5]) { /* constants */
/* K0 */ be_nested_str(energy),
/* K1 */ be_nested_str(_deref),
/* K2 */ be_nested_str(global),
/* K3 */ be_nested_str(_energy),
/* K4 */ be_nested_str(tomap),
}),
&be_const_str_tomap,
&be_const_str_solidified,
( &(const binstruction[11]) { /* code */
0xB8020000, // 0000 GETNGBL R0 K0
0x8C000101, // 0001 GETMET R0 R0 K1
0x7C000200, // 0002 CALL R0 1
0xB8020400, // 0003 GETNGBL R0 K2
0x88000103, // 0004 GETMBR R0 R0 K3
0x78020003, // 0005 JMPF R0 #000A
0xB8020600, // 0006 GETNGBL R0 K3
0x8C000104, // 0007 GETMET R0 R0 K4
0x7C000200, // 0008 CALL R0 1
0x80040000, // 0009 RET 1 R0
0x80000000, // 000A RET 0
})
)
);
/*******************************************************************/
/********************************************************************/ /********************************************************************/
/* End of solidification */ /* End of solidification */

View File

@ -38,51 +38,68 @@ extern "C" {
be_return_nil(vm); be_return_nil(vm);
} }
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Winvalid-offsetof" // avoid warnings since we're using offsetof() in a risky way #pragma GCC diagnostic ignored "-Winvalid-offsetof" // avoid warnings since we're using offsetof() in a risky way
enum {
PHASES_ARRAY_FLOAT = 1,
PHASES_ARRAY_INT32,
PHASES_ARRAY_UINT8,
PHASES_ARRAY_UINT16,
};
static const char * be_ctypes_instance_mappings[] = { static const char * be_ctypes_instance_mappings[] = {
"energy._phases_float",
"energy._phases_int32",
"energy._phases_uint8",
"energy._phases_uint16",
NULL NULL
}; };
extern "C" const be_ctypes_structure_t be_energy_struct = { extern "C" const be_ctypes_structure_t be_energy_struct = {
sizeof(tEnergy), /* size in bytes */ sizeof(tEnergy), /* size in bytes */
88, /* number of elements */ 68, /* number of elements */
be_ctypes_instance_mappings, be_ctypes_instance_mappings,
(const be_ctypes_structure_item_t[88]) { (const be_ctypes_structure_item_t[68]) {
{ "active_power", offsetof(tEnergy, active_power[0]), 0, 0, ctypes_float, 0 }, { "active_power", offsetof(tEnergy, active_power[0]), 0, 0, ctypes_float, 0 },
{ "active_power_2", offsetof(tEnergy, active_power[1]), 0, 0, ctypes_float, 0 }, // { "active_power_2", offsetof(tEnergy, active_power[1]), 0, 0, ctypes_float, 0 },
{ "active_power_3", offsetof(tEnergy, active_power[2]), 0, 0, ctypes_float, 0 }, // { "active_power_3", offsetof(tEnergy, active_power[2]), 0, 0, ctypes_float, 0 },
{ "active_power_phases", offsetof(tEnergy, active_power[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "apparent_power", offsetof(tEnergy, apparent_power[0]), 0, 0, ctypes_float, 0 }, { "apparent_power", offsetof(tEnergy, apparent_power[0]), 0, 0, ctypes_float, 0 },
{ "apparent_power_2", offsetof(tEnergy, apparent_power[1]), 0, 0, ctypes_float, 0 }, // { "apparent_power_2", offsetof(tEnergy, apparent_power[1]), 0, 0, ctypes_float, 0 },
{ "apparent_power_3", offsetof(tEnergy, apparent_power[2]), 0, 0, ctypes_float, 0 }, // { "apparent_power_3", offsetof(tEnergy, apparent_power[2]), 0, 0, ctypes_float, 0 },
{ "apparent_power_phases", offsetof(tEnergy, apparent_power[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "command_code", offsetof(tEnergy, command_code), 0, 0, ctypes_u8, 0 }, { "command_code", offsetof(tEnergy, command_code), 0, 0, ctypes_u8, 0 },
{ "current", offsetof(tEnergy, current[0]), 0, 0, ctypes_float, 0 }, { "current", offsetof(tEnergy, current[0]), 0, 0, ctypes_float, 0 },
{ "current_2", offsetof(tEnergy, current[1]), 0, 0, ctypes_float, 0 }, // { "current_2", offsetof(tEnergy, current[1]), 0, 0, ctypes_float, 0 },
{ "current_3", offsetof(tEnergy, current[2]), 0, 0, ctypes_float, 0 }, // { "current_3", offsetof(tEnergy, current[2]), 0, 0, ctypes_float, 0 },
{ "current_available", offsetof(tEnergy, current_available), 0, 0, ctypes_u8, 0 }, { "current_available", offsetof(tEnergy, current_available), 0, 0, ctypes_u8, 0 },
{ "current_phases", offsetof(tEnergy, current[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "daily", offsetof(tEnergy, daily_kWh[0]), 0, 0, ctypes_float, 0 }, { "daily", offsetof(tEnergy, daily_kWh[0]), 0, 0, ctypes_float, 0 },
{ "daily_2", offsetof(tEnergy, daily_kWh[1]), 0, 0, ctypes_float, 0 }, // { "daily_2", offsetof(tEnergy, daily_kWh[1]), 0, 0, ctypes_float, 0 },
{ "daily_3", offsetof(tEnergy, daily_kWh[2]), 0, 0, ctypes_float, 0 }, // { "daily_3", offsetof(tEnergy, daily_kWh[2]), 0, 0, ctypes_float, 0 },
{ "daily_phases", offsetof(tEnergy, daily_kWh[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "daily_sum", offsetof(tEnergy, daily_sum), 0, 0, ctypes_float, 0 }, { "daily_sum", offsetof(tEnergy, daily_sum), 0, 0, ctypes_float, 0 },
{ "daily_sum_export_balanced", offsetof(tEnergy, daily_sum_export_balanced), 0, 0, ctypes_float, 0 }, { "daily_sum_export_balanced", offsetof(tEnergy, daily_sum_export_balanced), 0, 0, ctypes_float, 0 },
{ "daily_sum_import_balanced", offsetof(tEnergy, daily_sum_import_balanced), 0, 0, ctypes_float, 0 }, { "daily_sum_import_balanced", offsetof(tEnergy, daily_sum_import_balanced), 0, 0, ctypes_float, 0 },
{ "data_valid", offsetof(tEnergy, data_valid[0]), 0, 0, ctypes_u8, 0 }, { "data_valid", offsetof(tEnergy, data_valid[0]), 0, 0, ctypes_u8, 0 },
{ "data_valid_2", offsetof(tEnergy, data_valid[1]), 0, 0, ctypes_u8, 0 }, // { "data_valid_2", offsetof(tEnergy, data_valid[1]), 0, 0, ctypes_u8, 0 },
{ "data_valid_3", offsetof(tEnergy, data_valid[2]), 0, 0, ctypes_u8, 0 }, // { "data_valid_3", offsetof(tEnergy, data_valid[2]), 0, 0, ctypes_u8, 0 },
{ "data_valid_phases", offsetof(tEnergy, data_valid[0]), 0, 0, ctypes_addr, PHASES_ARRAY_UINT8 },
{ "energy_active_export", offsetof(tEnergy, local_energy_active_export), 0, 0, ctypes_u8, 0 }, { "energy_active_export", offsetof(tEnergy, local_energy_active_export), 0, 0, ctypes_u8, 0 },
{ "export_active", offsetof(tEnergy, export_active[0]), 0, 0, ctypes_float, 0 }, { "export_active", offsetof(tEnergy, export_active[0]), 0, 0, ctypes_float, 0 },
{ "export_active_2", offsetof(tEnergy, export_active[1]), 0, 0, ctypes_float, 0 }, // { "export_active_2", offsetof(tEnergy, export_active[1]), 0, 0, ctypes_float, 0 },
{ "export_active_3", offsetof(tEnergy, export_active[2]), 0, 0, ctypes_float, 0 }, // { "export_active_3", offsetof(tEnergy, export_active[2]), 0, 0, ctypes_float, 0 },
{ "export_active_phases", offsetof(tEnergy, export_active[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "fifth_second", offsetof(tEnergy, fifth_second), 0, 0, ctypes_u8, 0 }, { "fifth_second", offsetof(tEnergy, fifth_second), 0, 0, ctypes_u8, 0 },
{ "frequency", offsetof(tEnergy, frequency[0]), 0, 0, ctypes_float, 0 }, { "frequency", offsetof(tEnergy, frequency[0]), 0, 0, ctypes_float, 0 },
{ "frequency_2", offsetof(tEnergy, frequency[1]), 0, 0, ctypes_float, 0 }, // { "frequency_2", offsetof(tEnergy, frequency[1]), 0, 0, ctypes_float, 0 },
{ "frequency_3", offsetof(tEnergy, frequency[2]), 0, 0, ctypes_float, 0 }, // { "frequency_3", offsetof(tEnergy, frequency[2]), 0, 0, ctypes_float, 0 },
{ "frequency_common", offsetof(tEnergy, frequency_common), 0, 0, ctypes_u8, 0 }, { "frequency_common", offsetof(tEnergy, frequency_common), 0, 0, ctypes_u8, 0 },
{ "frequency_phases", offsetof(tEnergy, frequency[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "import_active", offsetof(tEnergy, import_active[0]), 0, 0, ctypes_float, 0 }, { "import_active", offsetof(tEnergy, import_active[0]), 0, 0, ctypes_float, 0 },
{ "import_active_2", offsetof(tEnergy, import_active[1]), 0, 0, ctypes_float, 0 }, // { "import_active_2", offsetof(tEnergy, import_active[1]), 0, 0, ctypes_float, 0 },
{ "import_active_3", offsetof(tEnergy, import_active[2]), 0, 0, ctypes_float, 0 }, // { "import_active_3", offsetof(tEnergy, import_active[2]), 0, 0, ctypes_float, 0 },
{ "import_active_phases", offsetof(tEnergy, import_active[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "max_current_flag", offsetof(tEnergy, max_current_flag[0]), 0, 0, ctypes_u8, 0 }, { "max_current_flag", offsetof(tEnergy, max_current_flag[0]), 0, 0, ctypes_u8, 0 },
{ "max_energy_state", offsetof(tEnergy, max_energy_state[0]), 0, 0, ctypes_u8, 0 }, { "max_energy_state", offsetof(tEnergy, max_energy_state[0]), 0, 0, ctypes_u8, 0 },
{ "max_power_flag", offsetof(tEnergy, max_power_flag[0]), 0, 0, ctypes_u8, 0 }, { "max_power_flag", offsetof(tEnergy, max_power_flag[0]), 0, 0, ctypes_u8, 0 },
@ -94,50 +111,62 @@ extern "C" {
{ "mpl_retry_counter", offsetof(tEnergy, mpl_retry_counter[0]), 0, 0, ctypes_u8, 0 }, { "mpl_retry_counter", offsetof(tEnergy, mpl_retry_counter[0]), 0, 0, ctypes_u8, 0 },
{ "mpl_window_counter", offsetof(tEnergy, mpl_window_counter[0]), 0, 0, ctypes_u16, 0 }, { "mpl_window_counter", offsetof(tEnergy, mpl_window_counter[0]), 0, 0, ctypes_u16, 0 },
{ "period", offsetof(tEnergy, period_kWh[0]), 0, 0, ctypes_float, 0 }, { "period", offsetof(tEnergy, period_kWh[0]), 0, 0, ctypes_float, 0 },
{ "period_2", offsetof(tEnergy, period_kWh[1]), 0, 0, ctypes_float, 0 }, // { "period_2", offsetof(tEnergy, period_kWh[1]), 0, 0, ctypes_float, 0 },
{ "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 }, // { "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 },
{ "period_phases", offsetof(tEnergy, period_kWh[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "phase_count", offsetof(tEnergy, phase_count), 0, 0, ctypes_u8, 0 }, { "phase_count", offsetof(tEnergy, phase_count), 0, 0, ctypes_u8, 0 },
{ "power_factor", offsetof(tEnergy, power_factor[0]), 0, 0, ctypes_float, 0 }, { "power_factor", offsetof(tEnergy, power_factor[0]), 0, 0, ctypes_float, 0 },
{ "power_factor_2", offsetof(tEnergy, power_factor[1]), 0, 0, ctypes_float, 0 }, // { "power_factor_2", offsetof(tEnergy, power_factor[1]), 0, 0, ctypes_float, 0 },
{ "power_factor_3", offsetof(tEnergy, power_factor[2]), 0, 0, ctypes_float, 0 }, // { "power_factor_3", offsetof(tEnergy, power_factor[2]), 0, 0, ctypes_float, 0 },
{ "power_factor_phases", offsetof(tEnergy, power_factor[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "power_history_0", offsetof(tEnergy, power_history[0][0]), 0, 0, ctypes_u16, 0 }, { "power_history_0", offsetof(tEnergy, power_history[0][0]), 0, 0, ctypes_u16, 0 },
{ "power_history_0_2", offsetof(tEnergy, power_history[0][1]), 0, 0, ctypes_u16, 0 }, // { "power_history_0_2", offsetof(tEnergy, power_history[0][1]), 0, 0, ctypes_u16, 0 },
{ "power_history_0_3", offsetof(tEnergy, power_history[0][2]), 0, 0, ctypes_u16, 0 }, // { "power_history_0_3", offsetof(tEnergy, power_history[0][2]), 0, 0, ctypes_u16, 0 },
{ "power_history_0_phases", offsetof(tEnergy, power_history[0][0]), 0, 0, ctypes_addr, PHASES_ARRAY_UINT16 },
{ "power_history_1", offsetof(tEnergy, power_history[1][0]), 0, 0, ctypes_u16, 0 }, { "power_history_1", offsetof(tEnergy, power_history[1][0]), 0, 0, ctypes_u16, 0 },
{ "power_history_1_2", offsetof(tEnergy, power_history[1][1]), 0, 0, ctypes_u16, 0 }, // { "power_history_1_2", offsetof(tEnergy, power_history[1][1]), 0, 0, ctypes_u16, 0 },
{ "power_history_1_3", offsetof(tEnergy, power_history[1][2]), 0, 0, ctypes_u16, 0 }, // { "power_history_1_3", offsetof(tEnergy, power_history[1][2]), 0, 0, ctypes_u16, 0 },
{ "power_history_1_phases", offsetof(tEnergy, power_history[1][0]), 0, 0, ctypes_addr, PHASES_ARRAY_UINT16 },
{ "power_history_2", offsetof(tEnergy, power_history[2][0]), 0, 0, ctypes_u16, 0 }, { "power_history_2", offsetof(tEnergy, power_history[2][0]), 0, 0, ctypes_u16, 0 },
{ "power_history_2_2", offsetof(tEnergy, power_history[2][1]), 0, 0, ctypes_u16, 0 }, // { "power_history_2_2", offsetof(tEnergy, power_history[2][1]), 0, 0, ctypes_u16, 0 },
{ "power_history_2_3", offsetof(tEnergy, power_history[2][2]), 0, 0, ctypes_u16, 0 }, // { "power_history_2_3", offsetof(tEnergy, power_history[2][2]), 0, 0, ctypes_u16, 0 },
{ "power_history_2_phases", offsetof(tEnergy, power_history[2][0]), 0, 0, ctypes_addr, PHASES_ARRAY_UINT16 },
{ "power_on", offsetof(tEnergy, power_on), 0, 0, ctypes_u8, 0 }, { "power_on", offsetof(tEnergy, power_on), 0, 0, ctypes_u8, 0 },
{ "power_steady_counter", offsetof(tEnergy, power_steady_counter), 0, 0, ctypes_u8, 0 }, { "power_steady_counter", offsetof(tEnergy, power_steady_counter), 0, 0, ctypes_u8, 0 },
{ "reactive_power", offsetof(tEnergy, reactive_power[0]), 0, 0, ctypes_float, 0 }, { "reactive_power", offsetof(tEnergy, reactive_power[0]), 0, 0, ctypes_float, 0 },
{ "reactive_power_2", offsetof(tEnergy, reactive_power[1]), 0, 0, ctypes_float, 0 }, // { "reactive_power_2", offsetof(tEnergy, reactive_power[1]), 0, 0, ctypes_float, 0 },
{ "reactive_power_3", offsetof(tEnergy, reactive_power[2]), 0, 0, ctypes_float, 0 }, // { "reactive_power_3", offsetof(tEnergy, reactive_power[2]), 0, 0, ctypes_float, 0 },
{ "reactive_power_phases", offsetof(tEnergy, reactive_power[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "start_energy", offsetof(tEnergy, start_energy[0]), 0, 0, ctypes_float, 0 }, { "start_energy", offsetof(tEnergy, start_energy[0]), 0, 0, ctypes_float, 0 },
{ "start_energy_2", offsetof(tEnergy, start_energy[1]), 0, 0, ctypes_float, 0 }, // { "start_energy_2", offsetof(tEnergy, start_energy[1]), 0, 0, ctypes_float, 0 },
{ "start_energy_3", offsetof(tEnergy, start_energy[2]), 0, 0, ctypes_float, 0 }, // { "start_energy_3", offsetof(tEnergy, start_energy[2]), 0, 0, ctypes_float, 0 },
{ "today_delta_kwh", offsetof(tEnergy, kWhtoday_delta[0]), 0, 0, ctypes_u32, 0 }, { "start_energy_phases", offsetof(tEnergy, start_energy[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "today_delta_kwh_2", offsetof(tEnergy, kWhtoday_delta[1]), 0, 0, ctypes_u32, 0 }, { "today_delta_kwh", offsetof(tEnergy, kWhtoday_delta[0]), 0, 0, ctypes_i32, 0 },
{ "today_delta_kwh_3", offsetof(tEnergy, kWhtoday_delta[2]), 0, 0, ctypes_u32, 0 }, // { "today_delta_kwh_2", offsetof(tEnergy, kWhtoday_delta[1]), 0, 0, ctypes_i32, 0 },
{ "today_kwh", offsetof(tEnergy, kWhtoday[0]), 0, 0, ctypes_u32, 0 }, // { "today_delta_kwh_3", offsetof(tEnergy, kWhtoday_delta[2]), 0, 0, ctypes_i32, 0 },
{ "today_kwh_2", offsetof(tEnergy, kWhtoday[1]), 0, 0, ctypes_u32, 0 }, { "today_delta_kwh_phases", offsetof(tEnergy, kWhtoday_delta[0]), 0, 0, ctypes_addr, PHASES_ARRAY_UINT8 },
{ "today_kwh_3", offsetof(tEnergy, kWhtoday[2]), 0, 0, ctypes_u32, 0 }, { "today_kwh", offsetof(tEnergy, kWhtoday[0]), 0, 0, ctypes_i32, 0 },
// { "today_kwh_2", offsetof(tEnergy, kWhtoday[1]), 0, 0, ctypes_i32, 0 },
// { "today_kwh_3", offsetof(tEnergy, kWhtoday[2]), 0, 0, ctypes_i32, 0 },
{ "today_kwh_phases", offsetof(tEnergy, kWhtoday[0]), 0, 0, ctypes_addr, PHASES_ARRAY_INT32 },
{ "today_offset_init_kwh", offsetof(tEnergy, kWhtoday_offset_init), 0, 0, ctypes_u8, 0 }, { "today_offset_init_kwh", offsetof(tEnergy, kWhtoday_offset_init), 0, 0, ctypes_u8, 0 },
{ "today_offset_kwh", offsetof(tEnergy, energy_today_offset_kWh[0]), 0, 0, ctypes_float, 0 }, { "today_offset_kwh", offsetof(tEnergy, energy_today_offset_kWh[0]), 0, 0, ctypes_float, 0 },
{ "today_offset_kwh_2", offsetof(tEnergy, energy_today_offset_kWh[1]), 0, 0, ctypes_float, 0 }, // { "today_offset_kwh_2", offsetof(tEnergy, energy_today_offset_kWh[1]), 0, 0, ctypes_float, 0 },
{ "today_offset_kwh_3", offsetof(tEnergy, energy_today_offset_kWh[2]), 0, 0, ctypes_float, 0 }, // { "today_offset_kwh_3", offsetof(tEnergy, energy_today_offset_kWh[2]), 0, 0, ctypes_float, 0 },
{ "today_offset_kwh_phases", offsetof(tEnergy, energy_today_offset_kWh[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "total", offsetof(tEnergy, total[0]), 0, 0, ctypes_float, 0 }, { "total", offsetof(tEnergy, total[0]), 0, 0, ctypes_float, 0 },
{ "total_2", offsetof(tEnergy, total[1]), 0, 0, ctypes_float, 0 }, // { "total_2", offsetof(tEnergy, total[1]), 0, 0, ctypes_float, 0 },
{ "total_3", offsetof(tEnergy, total[2]), 0, 0, ctypes_float, 0 }, // { "total_3", offsetof(tEnergy, total[2]), 0, 0, ctypes_float, 0 },
{ "total_phases", offsetof(tEnergy, total[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "total_sum", offsetof(tEnergy, total_sum), 0, 0, ctypes_float, 0 }, { "total_sum", offsetof(tEnergy, total_sum), 0, 0, ctypes_float, 0 },
{ "type_dc", offsetof(tEnergy, type_dc), 0, 0, ctypes_u8, 0 }, { "type_dc", offsetof(tEnergy, type_dc), 0, 0, ctypes_u8, 0 },
{ "use_overtemp", offsetof(tEnergy, use_overtemp), 0, 0, ctypes_u8, 0 }, { "use_overtemp", offsetof(tEnergy, use_overtemp), 0, 0, ctypes_u8, 0 },
{ "voltage", offsetof(tEnergy, voltage[0]), 0, 0, ctypes_float, 0 }, { "voltage", offsetof(tEnergy, voltage[0]), 0, 0, ctypes_float, 0 },
{ "voltage_2", offsetof(tEnergy, voltage[1]), 0, 0, ctypes_float, 0 }, // { "voltage_2", offsetof(tEnergy, voltage[1]), 0, 0, ctypes_float, 0 },
{ "voltage_3", offsetof(tEnergy, voltage[2]), 0, 0, ctypes_float, 0 }, // { "voltage_3", offsetof(tEnergy, voltage[2]), 0, 0, ctypes_float, 0 },
{ "voltage_available", offsetof(tEnergy, voltage_available), 0, 0, ctypes_u8, 0 }, { "voltage_available", offsetof(tEnergy, voltage_available), 0, 0, ctypes_u8, 0 },
{ "voltage_common", offsetof(tEnergy, voltage_common), 0, 0, ctypes_u8, 0 }, { "voltage_common", offsetof(tEnergy, voltage_common), 0, 0, ctypes_u8, 0 },
{ "voltage_phases", offsetof(tEnergy, voltage[0]), 0, 0, ctypes_addr, PHASES_ARRAY_FLOAT },
{ "yesterday_sum", offsetof(tEnergy, yesterday_sum), 0, 0, ctypes_float, 0 }, { "yesterday_sum", offsetof(tEnergy, yesterday_sum), 0, 0, ctypes_float, 0 },
}}; }};
// be_define_ctypes_class(energy_struct, &be_energy_struct, &be_class_ctypes_bytes, "energy_struct"); // be_define_ctypes_class(energy_struct, &be_energy_struct, &be_class_ctypes_bytes, "energy_struct");