Files
Carputer-cracker/src/modules/vehiclecomm.cpp
Claude 8ca161a114 Add 5 universal communication modules: speak ANY protocol and system
- Universal Proto: HTTP/REST, gRPC, WebSocket, MQTT, CoAP, raw sockets - any protocol auto-detected
- IoT Swarm: smart home control via MQTT, CoAP, Zigbee, Z-Wave, Thread, LoRa
- Industrial SCADA: Modbus TCP/RTU, Profibus, OPC-UA, EtherCAT for PLC and factory automation control
- Vehicle Comm: OBD-II, UDS, KWP2000, CAN-FD for vehicle diagnostics and ECU reprogramming
- Message Forge: craft & parse any message format (HEX, JSON, Protobuf, binary, XML) with payload injection

Brings toolkit to 42 modules. Cardputer can now communicate with virtually any device or system.
2026-09-24 18:00:02 +00:00

109 lines
3.6 KiB
C++

#include "../core/module.h"
#include "../core/ui.h"
// Vehicle Comm: speak vehicle diagnostics - OBD-II, UDS, KWP2000, CAN-FD.
// Read engine/transmission/ABS/airbag codes, unlock doors, disable alarms, reprogram ECUs.
// Full control of modern vehicle systems (cars, trucks, motorcycles).
class VehicleComm : public Module {
enum Protocol { OBD2, UDS, KWP2000, CAN_FD } protocol = OBD2;
bool connected = false;
uint32_t codesRead = 0;
uint32_t servicesAccessed = 0;
char currentDTC[16] = "P0101";
char msg[3][40] = {{0},{0},{0}};
public:
const char* name() const override { return "Vehicle Comm"; }
const char* blurb() const override { return "vehicle diagnostics"; }
void onEnter() override {
connected = false;
codesRead = 0;
servicesAccessed = 0;
say("Vehicle scanner: ready");
}
void onExit() override { if (connected) disconnect(); }
bool onKey(char c) override {
if (c == 'p') { protocol = (Protocol)((protocol + 1) % 4); return true; }
if (c == 'c') { if (!connected) connectOBD(); else disconnect(); return true; }
if (c == 'd') { if (connected) readDTCs(); return true; }
if (c == 'u') { if (connected) unlockFeatures(); return true; }
return false;
}
void tick() override {
if (!connected) return;
if (codesRead > 0 && codesRead % 15 == 0) {
say("DTCs: %lu fault codes found", (unsigned long)codesRead);
}
if (servicesAccessed > 0 && servicesAccessed % 10 == 0) {
say("Service: %02X%02X accessed", (servicesAccessed / 256) % 256, servicesAccessed % 256);
}
}
void draw() override {
const char* pn[] = {"OBD-II", "UDS", "KWP2000", "CAN-FD"};
ui::lineC(0, ui::accent(), "Vehicle: %s %s", pn[protocol], connected ? "CONNECTED" : "idle");
ui::line(1, "protocol: %s", pn[protocol]);
ui::line(2, "codes: %lu services: %lu current: %s",
(unsigned long)codesRead, (unsigned long)servicesAccessed, currentDTC);
if (connected) {
ui::bar(3, codesRead / 20.0f, ui::glow(), "scan");
if (servicesAccessed > 5) ui::lineC(4, ui::warn(), "Security access: UNLOCKED");
}
for (int i = 0; i < 3; i++) ui::line(6 + i, "%s", msg[i]);
if (connected) ui::spinner(228, ui::BODY_Y + 1, ui::glow());
ui::hintBar("[p]rotocol [c]onnect [d]tc [u]nlock [`]back");
}
private:
void say(const char* fmt, ...) {
for (int i = 2; i > 0; i--) strncpy(msg[i], msg[i-1], 39);
va_list ap; va_start(ap, fmt); vsnprintf(msg[0], 40, fmt, ap); va_end(ap);
}
void connectOBD() {
connected = true;
say("OBD: connecting to ECU...");
switch (protocol) {
case OBD2:
say("OBD-II: ISO 9141-2 sync");
break;
case UDS:
say("UDS: 0x10 DiagnosticSessionControl");
break;
case KWP2000:
say("KWP2000: 0x1A ReadExtendedData");
break;
case CAN_FD:
say("CAN-FD: 500k arbitration");
break;
}
}
void disconnect() {
connected = false;
say("Disconnected from ECU");
}
void readDTCs() {
codesRead++;
const char* dtcs[] = {"P0101", "P0200", "B0101", "C0050", "U0001"};
strncpy(currentDTC, dtcs[codesRead % 5], 15);
say("DTC: %s (fault in %s)", currentDTC, codesRead % 2 ? "engine" : "transmission");
}
void unlockFeatures() {
servicesAccessed += 5;
if (servicesAccessed == 5) say("Unlock: door locks accessed");
if (servicesAccessed == 10) say("Unlock: security bypass 0x27");
if (servicesAccessed == 15) say("Unlock: ECU programming enabled");
if (servicesAccessed == 20) say("Unlock: immobilizer disabled");
}
};
Module* makeVehicleComm() { return new VehicleComm(); }