sync with arduino/dev

This commit is contained in:
liquidraver
2026-03-24 20:36:36 +01:00
parent e2f13e2292
commit 8dd6f149f8
8 changed files with 159 additions and 22 deletions
+54 -6
View File
@@ -388,12 +388,28 @@ int BaseChatMesh::searchChannelsByHash(const uint8_t *hash, mesh::GroupChannel d
void BaseChatMesh::onGroupDataRecv(mesh::Packet *packet, uint8_t type, const mesh::GroupChannel &channel,
uint8_t *data, size_t len)
{
uint8_t txt_type = data[4];
if (type == PAYLOAD_TYPE_GRP_TXT && len > 5 && (txt_type >> 2) == 0) {
uint32_t timestamp;
memcpy(&timestamp, data, 4);
data[len] = 0;
onChannelMessageRecv(channel, packet, timestamp, (const char *)&data[5]);
if (type == PAYLOAD_TYPE_GRP_TXT) {
uint8_t txt_type = data[4];
if (len > 5 && (txt_type >> 2) == 0) {
uint32_t timestamp;
memcpy(&timestamp, data, 4);
data[len] = 0;
onChannelMessageRecv(channel, packet, timestamp, (const char *)&data[5]);
}
} else if (type == PAYLOAD_TYPE_GRP_DATA) {
if (len < 3) {
LOG_DBG("onGroupDataRecv: dropping short group data payload len=%d", (int)len);
return;
}
uint16_t data_type = ((uint16_t)data[0]) | (((uint16_t)data[1]) << 8);
uint8_t data_len = data[2];
size_t available_len = len - 3;
if (data_len > available_len) {
LOG_DBG("onGroupDataRecv: dropping malformed group data type=%d len=%d available=%d",
(int)data_type, (int)data_len, (int)available_len);
return;
}
onChannelDataRecv(channel, packet, data_type, &data[3], data_len);
}
}
@@ -505,6 +521,38 @@ bool BaseChatMesh::sendGroupMessage(uint32_t timestamp, mesh::GroupChannel &chan
return false;
}
bool BaseChatMesh::sendGroupData(mesh::GroupChannel &channel, uint8_t *path, uint8_t path_len,
uint16_t data_type, const uint8_t *data, int data_len)
{
if (data_len < 0) {
LOG_DBG("sendGroupData: invalid negative data_len=%d", data_len);
return false;
}
if (data_len > MAX_GROUP_DATA_LENGTH) {
LOG_DBG("sendGroupData: data_len=%d exceeds max=%d", data_len, MAX_GROUP_DATA_LENGTH);
return false;
}
uint8_t temp[3 + MAX_GROUP_DATA_LENGTH];
temp[0] = (uint8_t)(data_type & 0xFF);
temp[1] = (uint8_t)(data_type >> 8);
temp[2] = (uint8_t)data_len;
if (data_len > 0) memcpy(&temp[3], data, data_len);
mesh::Packet *pkt = createGroupDatagram(PAYLOAD_TYPE_GRP_DATA, channel, temp, 3 + data_len);
if (pkt == nullptr) {
LOG_DBG("sendGroupData: unable to create group datagram, data_len=%d", data_len);
return false;
}
if (path_len == OUT_PATH_UNKNOWN) {
sendFloodScoped(channel, pkt);
} else {
sendDirect(pkt, path, path_len);
}
return true;
}
bool BaseChatMesh::shareContactZeroHop(const ContactInfo &contact)
{
int plen = getBlobByKey(contact.id.pub_key, PUB_KEY_SIZE, temp_buf);