From 3d6b0cf1a3bd7bc19a74e621363ea0850c0c549b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 30 Jul 2023 19:55:00 +0200 Subject: [PATCH 1/2] Berry bytes `get` and `set` work for 3 bytes values --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_byteslib.c | 42 ++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef78d526ea1a..5b5aa73e68c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) - Support for multiple PCA9685 with extended functionality (#18805) - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature +- Berry bytes `get` and `set` work for 3 bytes values ### Breaking Changed diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index 665d630f3a3e..af284983627a 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -356,6 +356,40 @@ static uint16_t buf_get2_be(buf_impl* attr, size_t offset) return 0; } +static uint32_t buf_get3_le(buf_impl* attr, size_t offset) +{ + if ((int32_t)offset + 2 < attr->len) { + return attr->bufptr[offset] | (attr->bufptr[offset+1] << 8) | (attr->bufptr[offset+2] << 16); + } + return 0; +} + +static uint16_t buf_get3_be(buf_impl* attr, size_t offset) +{ + if ((int32_t)offset + 2 < attr->len) { + return attr->bufptr[offset+2] | (attr->bufptr[offset+1] << 8) | (attr->bufptr[offset] << 16); + } + return 0; +} + +static void buf_set3_le(buf_impl* attr, size_t offset, uint32_t data) +{ + if ((int32_t)offset + 2 < attr->len) { + attr->bufptr[offset] = data & 0xFF; + attr->bufptr[offset+1] = (data >> 8) & 0xFF; + attr->bufptr[offset+2] = (data >> 16) & 0xFF; + } +} + +static void buf_set3_be(buf_impl* attr, size_t offset, uint32_t data) +{ + if ((int32_t)offset + 2 < attr->len) { + attr->bufptr[offset+2] = data & 0xFF; + attr->bufptr[offset+1] = (data >> 8) & 0xFF; + attr->bufptr[offset] = (data >> 16) & 0xFF; + } +} + static void buf_set4_le(buf_impl* attr, size_t offset, uint32_t data) { if ((int32_t)offset + 3 < attr->len) { @@ -832,10 +866,16 @@ static int m_get(bvm *vm, bbool sign) case 2: ret = buf_get2_le(&attr, idx); if (sign) { ret = (int16_t)(uint16_t) ret; } break; + case 3: ret = buf_get3_le(&attr, idx); + if (sign & (ret & 0x800000)) { ret = ret | 0xFF000000; } + break; case 4: ret = buf_get4_le(&attr, idx); break; case -2: ret = buf_get2_be(&attr, idx); if (sign) { ret = (int16_t)(uint16_t) ret; } break; + case -3: ret = buf_get3_be(&attr, idx); + if (sign & (ret & 0x800000)) { ret = ret | 0xFF000000; } + break; case -4: ret = buf_get4_be(&attr, idx); break; default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); } @@ -911,8 +951,10 @@ static int m_set(bvm *vm) case -1: /* fallback below */ case 1: buf_set1(&attr, idx, value); break; case 2: buf_set2_le(&attr, idx, value); break; + case 3: buf_set3_le(&attr, idx, value); break; case 4: buf_set4_le(&attr, idx, value); break; case -2: buf_set2_be(&attr, idx, value); break; + case -3: buf_set3_be(&attr, idx, value); break; case -4: buf_set4_be(&attr, idx, value); break; default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); } From 08a999493ddf4a04398b61fab86edd3e75dfe023 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 30 Jul 2023 19:57:18 +0200 Subject: [PATCH 2/2] Fix error message --- lib/libesp32/berry/src/be_byteslib.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index af284983627a..0a5c1747e6ea 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -877,7 +877,7 @@ static int m_get(bvm *vm, bbool sign) if (sign & (ret & 0x800000)) { ret = ret | 0xFF000000; } break; case -4: ret = buf_get4_be(&attr, idx); break; - default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); + default: be_raise(vm, "type_error", "size must be -4, -3, -2, -1, 0, 1, 2, 3 or 4."); } be_pop(vm, argc - 1); if (vsize != 0) { @@ -956,7 +956,7 @@ static int m_set(bvm *vm) case -2: buf_set2_be(&attr, idx, value); break; case -3: buf_set3_be(&attr, idx, value); break; case -4: buf_set4_be(&attr, idx, value); break; - default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); + default: be_raise(vm, "type_error", "size must be -4, -3, -2, -1, 0, 1, 2, 3 or 4."); } be_pop(vm, argc - 1); m_write_attributes(vm, 1, &attr); /* update attributes */