i2c raw control

This commit is contained in:
2026-02-14 22:39:21 +01:00
parent d79358fa48
commit 5e6371b409
7 changed files with 180 additions and 8 deletions
+106
View File
@@ -359,6 +359,11 @@ void Communication() {
}
}
} else if (data_str.startsWith("l") || data_str.startsWith("L")) printLogbookCSV();
else if(data_str.charAt(0) == '~' && data_str.charAt(1) == '/') {
MuteScreen(true);
i2c_pc_control = i2c_pc_control_init = true;
Serial.flush();
}
}
if (RDSSPYUSB && Serial.available()) {
@@ -915,4 +920,105 @@ void tryWiFi() {
Udp.stop();
WiFi.mode(WIFI_OFF);
}
}
void total_pc_control() {
if(i2c_pc_control_init) {
Serial.write(1);
Serial.write(0xff);
Serial.flush();
i2c_pc_control_init = false;
}
if(Serial.available()) {
uint8_t userlen = Serial.read();
if(userlen == '~' && Serial.read() == '/') {
Serial.write(1);
Serial.write(0xff);
Serial.flush(true);
return;
}
uint8_t *data = (uint8_t*)malloc(userlen);
if(data == NULL) return;
auto len = Serial.read(data, userlen);
if(len != userlen) {
free(data);
return; // Incomplete data
}
switch (data[0]) {
case 0: { // Set clock
if(len < 5) break;
uint32_t clock = ((uint32_t)data[1] << 24) |
((uint32_t)data[2] << 16) |
((uint32_t)data[3] << 8) |
((uint32_t)data[4]);
Wire.setClock(clock);
Serial.write(1);
Serial.write(0);
} break;
case 1: { // Send data
if(len < 3) break;
Wire.beginTransmission(data[1]);
for(int i = 0; i < (len-2); i++) Wire.write(data[2+i]);
auto out = Wire.endTransmission();
Serial.write(2);
Serial.write(1);
Serial.write(out);
} break;
case 2: { // Send and receive data
if(len < 4) break; // Need at least: cmd, addr, datalen, recvlen
uint8_t addr = data[1];
uint8_t datalen = data[2];
if(len < 3 + datalen + 1) break; // Validate buffer size
Wire.beginTransmission(addr);
for(int i = 0; i < datalen; i++) Wire.write(data[3+i]);
auto out = Wire.endTransmission(false);
uint8_t recvlen_requested = data[3+datalen];
uint8_t recvlen = Wire.requestFrom(addr, recvlen_requested);
Serial.write(recvlen+2);
Serial.write(2);
Serial.write(out);
while(Wire.available()) Serial.write(Wire.read());
} break;
case 3: { // Quit
i2c_pc_control = false;
MuteScreen(false);
Serial.write(1);
Serial.write(3);
Serial.flush();
Serial.updateBaudRate(115200);
} break;
case 4: { // Version
Serial.write(2);
Serial.write(4);
Serial.write(0);
} break;
case 5: { // Reboot
Serial.write(1);
Serial.write(5);
Serial.flush();
delay(5);
esp_restart();
} break;
case 6: { // Change baud
if(len < 5) break;
uint32_t clock = ((uint32_t)data[1] << 24) |
((uint32_t)data[2] << 16) |
((uint32_t)data[3] << 8) |
((uint32_t)data[4]);
Serial.write(1);
Serial.write(6);
Serial.flush(true);
Serial.updateBaudRate(clock);
} break;
default:
break;
}
free(data);
Serial.flush(true);
}
}
+3
View File
@@ -324,6 +324,9 @@ bool rds_settings_changed;
const size_t language_totalnumber = sizeof(myLanguage) / sizeof(myLanguage[0]);
const size_t language_entrynumber = sizeof(myLanguage[0]) / sizeof(myLanguage[0][0]);
volatile bool i2c_pc_control = false;
volatile bool i2c_pc_control_init = false;
mem presets[EE_PRESETS_CNT];
TEF6686 radio;
TFT_eSPI tft = TFT_eSPI();
+9 -5
View File
@@ -1130,7 +1130,7 @@ void endMenu() {
if (af == 2) radio.rds.afreg = true; else radio.rds.afreg = false;
Serial.end();
if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient);
if (USBmode) Serial.begin(19200); else Serial.begin(115200);
if (USBmode) Serial.updateBaudRate(19200); else Serial.updateBaudRate(115200);
leave = true;
if (language == LANGUAGE_CHS) PSSprite.setTextFont(3); else PSSprite.setTextFont(2);
@@ -1202,7 +1202,6 @@ void MuteScreen(bool setting) {
void setup_periph() {
Wire.setClock(400000);
Serial.begin(115200);
Serial.println();
byte error, address;
for (address = 1; address < 108; address++) {
@@ -1232,7 +1231,6 @@ void setup_periph() {
}
Serial.flush();
Serial.end();
Wire.setClock(100000);
}
@@ -1305,7 +1303,7 @@ void later_setup_periph() {
} else console.print("RX8010SJ is not available at address " + String(RX8010SJ_ADDRESS, HEX));
if(analogRead(BATTERY_PIN) < BATTERY_DETECT_THRESHOLD) batterydetect = false;
else console.print("Battery detected.");
else console.print("Battery detected");
}
void read_encoder();
@@ -1325,6 +1323,7 @@ void setup() {
EEPROM.begin(EE_TOTAL_CNT);
setupmode = true;
Serial.begin(115200);
Wire.begin();
Wire.setClock(100000);
@@ -1355,7 +1354,7 @@ void setup() {
for (int y = 0; y < 5; y++) presets[i].RDSPI[y] = EEPROM.readByte((i * 5) + y + EE_PRESETS_RDSPI_START);
}
if (USBmode) Serial.begin(19200); else Serial.begin(115200);
if (USBmode) Serial.updateBaudRate(19200); else Serial.updateBaudRate(115200);
if (iMSset && EQset) iMSEQ = 2;
if (!iMSset && EQset) iMSEQ = 3;
@@ -1633,6 +1632,11 @@ void handleTimers() {
}
void loop() {
if(i2c_pc_control) {
total_pc_control();
if(i2c_pc_control) return;
}
handleWiFi();
handleTouch();
Communication();