mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-24 22:02:30 +00:00
Merge branch 'master' of https://github.com/HarukiToreda/ESP32-CardKB-Fix
This commit is contained in:
commit
d2390cb98a
@ -2,6 +2,17 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
platformioFailed() {
|
||||||
|
[[ $VIRTUAL_ENV != "" ]] && exit 1 # don't hint at virtualenv if it's already in use
|
||||||
|
echo -e "\nThere were issues running platformio and you are not using a virtual environment." \
|
||||||
|
"\nYou may try setting up virtualenv and downloading the latest platformio from pip:" \
|
||||||
|
"\n\tvirtualenv venv" \
|
||||||
|
"\n\tsource venv/bin/activate" \
|
||||||
|
"\n\tpip install platformio" \
|
||||||
|
"\n\t./bin/build-native.sh # retry building"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
VERSION=$(bin/buildinfo.py long)
|
VERSION=$(bin/buildinfo.py long)
|
||||||
SHORT_VERSION=$(bin/buildinfo.py short)
|
SHORT_VERSION=$(bin/buildinfo.py short)
|
||||||
|
|
||||||
@ -13,8 +24,8 @@ mkdir -p $OUTDIR/
|
|||||||
rm -r $OUTDIR/* || true
|
rm -r $OUTDIR/* || true
|
||||||
|
|
||||||
# Important to pull latest version of libs into all device flavors, otherwise some devices might be stale
|
# Important to pull latest version of libs into all device flavors, otherwise some devices might be stale
|
||||||
platformio pkg update --environment native
|
platformio pkg update --environment native || platformioFailed
|
||||||
pio run --environment native
|
pio run --environment native || platformioFailed
|
||||||
cp .pio/build/native/program "$OUTDIR/meshtasticd_linux_$(uname -m)"
|
cp .pio/build/native/program "$OUTDIR/meshtasticd_linux_$(uname -m)"
|
||||||
cp bin/device-install.* $OUTDIR
|
cp bin/device-install.* $OUTDIR
|
||||||
cp bin/device-update.* $OUTDIR
|
cp bin/device-update.* $OUTDIR
|
||||||
|
@ -8,6 +8,7 @@ const ScanI2C::FoundDevice ScanI2C::DEVICE_NONE = ScanI2C::FoundDevice(ScanI2C::
|
|||||||
ScanI2C::ScanI2C() = default;
|
ScanI2C::ScanI2C() = default;
|
||||||
|
|
||||||
void ScanI2C::scanPort(ScanI2C::I2CPort port) {}
|
void ScanI2C::scanPort(ScanI2C::I2CPort port) {}
|
||||||
|
void ScanI2C::scanPort(ScanI2C::I2CPort port, int *address) {}
|
||||||
|
|
||||||
void ScanI2C::setSuppressScreen()
|
void ScanI2C::setSuppressScreen()
|
||||||
{
|
{
|
||||||
|
@ -82,6 +82,7 @@ class ScanI2C
|
|||||||
ScanI2C();
|
ScanI2C();
|
||||||
|
|
||||||
virtual void scanPort(ScanI2C::I2CPort);
|
virtual void scanPort(ScanI2C::I2CPort);
|
||||||
|
virtual void scanPort(ScanI2C::I2CPort, int *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A bit of a hack, this tells the scanner not to tell later systems there is a screen to avoid enabling it.
|
* A bit of a hack, this tells the scanner not to tell later systems there is a screen to avoid enabling it.
|
||||||
|
@ -135,7 +135,7 @@ uint16_t ScanI2CTwoWire::getRegisterValue(const ScanI2CTwoWire::RegisterLocation
|
|||||||
type = T; \
|
type = T; \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
void ScanI2CTwoWire::scanPort(I2CPort port)
|
void ScanI2CTwoWire::scanPort(I2CPort port, int *address)
|
||||||
{
|
{
|
||||||
concurrency::LockGuard guard((concurrency::Lock *)&lock);
|
concurrency::LockGuard guard((concurrency::Lock *)&lock);
|
||||||
|
|
||||||
@ -163,6 +163,10 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (addr.address = 1; addr.address < 127; addr.address++) {
|
for (addr.address = 1; addr.address < 127; addr.address++) {
|
||||||
|
// Skip the address if it is not requested oon a partial scan
|
||||||
|
if (sizeof(address) > 0 && addr.address != *address) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
i2cBus->beginTransmission(addr.address);
|
i2cBus->beginTransmission(addr.address);
|
||||||
#ifdef ARCH_PORTDUINO
|
#ifdef ARCH_PORTDUINO
|
||||||
if (i2cBus->read() != -1)
|
if (i2cBus->read() != -1)
|
||||||
@ -353,6 +357,11 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScanI2CTwoWire::scanPort(I2CPort port)
|
||||||
|
{
|
||||||
|
scanPort(port, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address) const
|
TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address) const
|
||||||
{
|
{
|
||||||
if (address.port == ScanI2C::I2CPort::WIRE) {
|
if (address.port == ScanI2C::I2CPort::WIRE) {
|
||||||
@ -369,4 +378,4 @@ TwoWire *ScanI2CTwoWire::fetchI2CBus(ScanI2C::DeviceAddress address) const
|
|||||||
size_t ScanI2CTwoWire::countDevices() const
|
size_t ScanI2CTwoWire::countDevices() const
|
||||||
{
|
{
|
||||||
return foundDevices.size();
|
return foundDevices.size();
|
||||||
}
|
}
|
@ -16,6 +16,8 @@ class ScanI2CTwoWire : public ScanI2C
|
|||||||
public:
|
public:
|
||||||
void scanPort(ScanI2C::I2CPort) override;
|
void scanPort(ScanI2C::I2CPort) override;
|
||||||
|
|
||||||
|
void scanPort(ScanI2C::I2CPort, int *) override;
|
||||||
|
|
||||||
ScanI2C::FoundDevice find(ScanI2C::DeviceType) const override;
|
ScanI2C::FoundDevice find(ScanI2C::DeviceType) const override;
|
||||||
|
|
||||||
TwoWire *fetchI2CBus(ScanI2C::DeviceAddress) const;
|
TwoWire *fetchI2CBus(ScanI2C::DeviceAddress) const;
|
||||||
@ -53,4 +55,4 @@ class ScanI2CTwoWire : public ScanI2C
|
|||||||
uint16_t getRegisterValue(const RegisterLocation &, ResponseWidth) const;
|
uint16_t getRegisterValue(const RegisterLocation &, ResponseWidth) const;
|
||||||
|
|
||||||
DeviceType probeOLED(ScanI2C::DeviceAddress) const;
|
DeviceType probeOLED(ScanI2C::DeviceAddress) const;
|
||||||
};
|
};
|
@ -1,6 +1,7 @@
|
|||||||
#include "kbI2cBase.h"
|
#include "kbI2cBase.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "detect/ScanI2C.h"
|
#include "detect/ScanI2C.h"
|
||||||
|
#include "detect/ScanI2CTwoWire.h"
|
||||||
|
|
||||||
extern ScanI2C::DeviceAddress cardkb_found;
|
extern ScanI2C::DeviceAddress cardkb_found;
|
||||||
extern uint8_t kb_model;
|
extern uint8_t kb_model;
|
||||||
@ -30,8 +31,40 @@ uint8_t read_from_14004(TwoWire *i2cBus, uint8_t reg, uint8_t *data, uint8_t len
|
|||||||
int32_t KbI2cBase::runOnce()
|
int32_t KbI2cBase::runOnce()
|
||||||
{
|
{
|
||||||
if (cardkb_found.address == 0x00) {
|
if (cardkb_found.address == 0x00) {
|
||||||
// Input device is not detected.
|
// Input device is not detected. Rescan now.
|
||||||
return INT32_MAX;
|
auto i2cScanner = std::unique_ptr<ScanI2CTwoWire>(new ScanI2CTwoWire());
|
||||||
|
int i2caddr_scan[] = {CARDKB_ADDR, TDECK_KB_ADDR, BBQ10_KB_ADDR};
|
||||||
|
#if defined(I2C_SDA1)
|
||||||
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1, i2caddr_scan);
|
||||||
|
#endif
|
||||||
|
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE, i2caddr_scan);
|
||||||
|
auto kb_info = i2cScanner->firstKeyboard();
|
||||||
|
|
||||||
|
if (kb_info.type != ScanI2C::DeviceType::NONE) {
|
||||||
|
cardkb_found = kb_info.address;
|
||||||
|
switch (kb_info.type) {
|
||||||
|
case ScanI2C::DeviceType::RAK14004:
|
||||||
|
kb_model = 0x02;
|
||||||
|
break;
|
||||||
|
case ScanI2C::DeviceType::CARDKB:
|
||||||
|
kb_model = 0x00;
|
||||||
|
break;
|
||||||
|
case ScanI2C::DeviceType::TDECKKB:
|
||||||
|
// assign an arbitrary value to distinguish from other models
|
||||||
|
kb_model = 0x10;
|
||||||
|
break;
|
||||||
|
case ScanI2C::DeviceType::BBQ10KB:
|
||||||
|
// assign an arbitrary value to distinguish from other models
|
||||||
|
kb_model = 0x11;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// use this as default since it's also just zero
|
||||||
|
LOG_WARN("kb_info.type is unknown(0x%02x), setting kb_model=0x00\n", kb_info.type);
|
||||||
|
kb_model = 0x00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cardkb_found.address == 0x00)
|
||||||
|
return INT32_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!i2cBus) {
|
if (!i2cBus) {
|
||||||
|
@ -311,7 +311,10 @@ bool perhapsDecode(meshtastic_MeshPacket *p)
|
|||||||
if (channels.decryptForHash(chIndex, p->channel)) {
|
if (channels.decryptForHash(chIndex, p->channel)) {
|
||||||
// Try to decrypt the packet if we can
|
// Try to decrypt the packet if we can
|
||||||
size_t rawSize = p->encrypted.size;
|
size_t rawSize = p->encrypted.size;
|
||||||
assert(rawSize <= sizeof(bytes));
|
if (rawSize > sizeof(bytes)) {
|
||||||
|
LOG_ERROR("Packet too large to attempt decription! (rawSize=%d > 256)\n", rawSize);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
memcpy(bytes, p->encrypted.bytes,
|
memcpy(bytes, p->encrypted.bytes,
|
||||||
rawSize); // we have to copy into a scratch buffer, because these bytes are a union with the decoded protobuf
|
rawSize); // we have to copy into a scratch buffer, because these bytes are a union with the decoded protobuf
|
||||||
crypto->decrypt(p->from, p->id, rawSize, bytes);
|
crypto->decrypt(p->from, p->id, rawSize, bytes);
|
||||||
|
@ -64,40 +64,33 @@ void AtakPluginModule::alterReceivedProtobuf(meshtastic_MeshPacket &mp, meshtast
|
|||||||
{
|
{
|
||||||
// From Phone (EUD)
|
// From Phone (EUD)
|
||||||
if (mp.from == 0) {
|
if (mp.from == 0) {
|
||||||
LOG_DEBUG("Received uncompressed TAK payload from phone with %d bytes\n", mp.decoded.payload.size);
|
LOG_DEBUG("Received uncompressed TAK payload from phone: %d bytes\n", mp.decoded.payload.size);
|
||||||
// Compress for LoRA transport
|
// Compress for LoRA transport
|
||||||
auto compressed = cloneTAKPacketData(t);
|
auto compressed = cloneTAKPacketData(t);
|
||||||
compressed.is_compressed = true;
|
compressed.is_compressed = true;
|
||||||
if (t->has_contact) {
|
if (t->has_contact) {
|
||||||
auto length = unishox2_compress_simple(t->contact.callsign, strlen(t->contact.callsign), compressed.contact.callsign);
|
auto length = unishox2_compress_simple(t->contact.callsign, strlen(t->contact.callsign), compressed.contact.callsign);
|
||||||
LOG_DEBUG("Uncompressed callsign '%s' - %d bytes\n", t->contact.callsign, strlen(t->contact.callsign));
|
LOG_DEBUG("Compressed callsign: %d bytes\n", length);
|
||||||
LOG_DEBUG("Compressed callsign '%s' - %d bytes\n", t->contact.callsign, length);
|
|
||||||
|
|
||||||
length = unishox2_compress_simple(t->contact.device_callsign, strlen(t->contact.device_callsign),
|
length = unishox2_compress_simple(t->contact.device_callsign, strlen(t->contact.device_callsign),
|
||||||
compressed.contact.device_callsign);
|
compressed.contact.device_callsign);
|
||||||
LOG_DEBUG("Uncompressed device_callsign '%s' - %d bytes\n", t->contact.device_callsign,
|
LOG_DEBUG("Compressed device_callsign: %d bytes\n", length);
|
||||||
strlen(t->contact.device_callsign));
|
|
||||||
LOG_DEBUG("Compressed device_callsign '%s' - %d bytes\n", compressed.contact.device_callsign, length);
|
|
||||||
}
|
}
|
||||||
if (t->which_payload_variant == meshtastic_TAKPacket_chat_tag) {
|
if (t->which_payload_variant == meshtastic_TAKPacket_chat_tag) {
|
||||||
auto length = unishox2_compress_simple(t->payload_variant.chat.message, strlen(t->payload_variant.chat.message),
|
auto length = unishox2_compress_simple(t->payload_variant.chat.message, strlen(t->payload_variant.chat.message),
|
||||||
compressed.payload_variant.chat.message);
|
compressed.payload_variant.chat.message);
|
||||||
LOG_DEBUG("Uncompressed chat message '%s' - %d bytes\n", t->payload_variant.chat.message,
|
LOG_DEBUG("Compressed chat message: %d bytes\n", length);
|
||||||
strlen(t->payload_variant.chat.message));
|
|
||||||
LOG_DEBUG("Compressed chat message '%s' - %d bytes\n", compressed.payload_variant.chat.message, length);
|
|
||||||
|
|
||||||
if (t->payload_variant.chat.has_to) {
|
if (t->payload_variant.chat.has_to) {
|
||||||
compressed.payload_variant.chat.has_to = true;
|
compressed.payload_variant.chat.has_to = true;
|
||||||
length = unishox2_compress_simple(t->payload_variant.chat.to, strlen(t->payload_variant.chat.to),
|
length = unishox2_compress_simple(t->payload_variant.chat.to, strlen(t->payload_variant.chat.to),
|
||||||
compressed.payload_variant.chat.to);
|
compressed.payload_variant.chat.to);
|
||||||
LOG_DEBUG("Uncompressed chat to '%s' - %d bytes\n", t->payload_variant.chat.to,
|
LOG_DEBUG("Compressed chat to: %d bytes\n", length);
|
||||||
strlen(t->payload_variant.chat.to));
|
|
||||||
LOG_DEBUG("Compressed chat to '%s' - %d bytes\n", compressed.payload_variant.chat.to, length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mp.decoded.payload.size = pb_encode_to_bytes(mp.decoded.payload.bytes, sizeof(mp.decoded.payload.bytes),
|
mp.decoded.payload.size = pb_encode_to_bytes(mp.decoded.payload.bytes, sizeof(mp.decoded.payload.bytes),
|
||||||
meshtastic_TAKPacket_fields, &compressed);
|
meshtastic_TAKPacket_fields, &compressed);
|
||||||
LOG_DEBUG("Final payload size of %d bytes\n", mp.decoded.payload.size);
|
LOG_DEBUG("Final payload: %d bytes\n", mp.decoded.payload.size);
|
||||||
} else {
|
} else {
|
||||||
if (!t->is_compressed) {
|
if (!t->is_compressed) {
|
||||||
// Not compressed. Something is wrong
|
// Not compressed. Something is wrong
|
||||||
@ -113,27 +106,23 @@ void AtakPluginModule::alterReceivedProtobuf(meshtastic_MeshPacket &mp, meshtast
|
|||||||
auto length =
|
auto length =
|
||||||
unishox2_decompress_simple(t->contact.callsign, strlen(t->contact.callsign), uncompressed.contact.callsign);
|
unishox2_decompress_simple(t->contact.callsign, strlen(t->contact.callsign), uncompressed.contact.callsign);
|
||||||
|
|
||||||
LOG_DEBUG("Compressed callsign: %d bytes\n", strlen(t->contact.callsign));
|
LOG_DEBUG("Decompressed callsign: %d bytes\n", length);
|
||||||
LOG_DEBUG("Decompressed callsign: '%s' @ %d bytes\n", uncompressed.contact.callsign, length);
|
|
||||||
|
|
||||||
length = unishox2_decompress_simple(t->contact.device_callsign, strlen(t->contact.device_callsign),
|
length = unishox2_decompress_simple(t->contact.device_callsign, strlen(t->contact.device_callsign),
|
||||||
uncompressed.contact.device_callsign);
|
uncompressed.contact.device_callsign);
|
||||||
|
|
||||||
LOG_DEBUG("Compressed device_callsign: %d bytes\n", strlen(t->contact.device_callsign));
|
LOG_DEBUG("Decompressed device_callsign: %d bytes\n", length);
|
||||||
LOG_DEBUG("Decompressed device_callsign: '%s' @ %d bytes\n", uncompressed.contact.device_callsign, length);
|
|
||||||
}
|
}
|
||||||
if (uncompressed.which_payload_variant == meshtastic_TAKPacket_chat_tag) {
|
if (uncompressed.which_payload_variant == meshtastic_TAKPacket_chat_tag) {
|
||||||
auto length = unishox2_decompress_simple(t->payload_variant.chat.message, strlen(t->payload_variant.chat.message),
|
auto length = unishox2_decompress_simple(t->payload_variant.chat.message, strlen(t->payload_variant.chat.message),
|
||||||
uncompressed.payload_variant.chat.message);
|
uncompressed.payload_variant.chat.message);
|
||||||
LOG_DEBUG("Compressed chat message: %d bytes\n", strlen(t->payload_variant.chat.message));
|
LOG_DEBUG("Decompressed chat message: %d bytes\n", length);
|
||||||
LOG_DEBUG("Decompressed chat message: '%s' @ %d bytes\n", uncompressed.payload_variant.chat.message, length);
|
|
||||||
|
|
||||||
if (t->payload_variant.chat.has_to) {
|
if (t->payload_variant.chat.has_to) {
|
||||||
uncompressed.payload_variant.chat.has_to = true;
|
uncompressed.payload_variant.chat.has_to = true;
|
||||||
length = unishox2_decompress_simple(t->payload_variant.chat.to, strlen(t->payload_variant.chat.to),
|
length = unishox2_decompress_simple(t->payload_variant.chat.to, strlen(t->payload_variant.chat.to),
|
||||||
uncompressed.payload_variant.chat.to);
|
uncompressed.payload_variant.chat.to);
|
||||||
LOG_DEBUG("Compressed chat to: %d bytes\n", strlen(t->payload_variant.chat.to));
|
LOG_DEBUG("Decompressed chat to: %d bytes\n", length);
|
||||||
LOG_DEBUG("Decompressed chat to: '%s' @ %d bytes\n", uncompressed.payload_variant.chat.to, length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
decompressedCopy->decoded.payload.size =
|
decompressedCopy->decoded.payload.size =
|
||||||
|
Loading…
Reference in New Issue
Block a user