Skip to content

Commit ce356ec

Browse files
authored
Merge pull request #3 from TeaRex-coder/api-v2
API V2
2 parents 91a7a44 + 2f43397 commit ce356ec

File tree

12 files changed

+475
-149
lines changed

12 files changed

+475
-149
lines changed

firmware/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Build environment tools:
1212
### Generate image
1313

1414
```bash
15-
esptool.py --chip esp32 merge_bin -o ./public/image.bin --flash_mode dio --flash_size 4MB 0x1000 ./firmware/.pio/build/esp32dev/bootloader.bin 0x8000 ./firmware/.pio/build/esp32dev/partitions.bin 0x10000 ./firmware/.pio/build/esp32dev/firmware.bin
15+
esptool.py --chip esp32 merge_bin -o image.bin --flash_mode dio --flash_size 4MB 0x1000 .pio/build/esp32dev/bootloader.bin 0x8000 .pio/build/esp32dev/partitions.bin 0x10000 .pio/build/esp32dev/firmware.bin
1616
```
1717

1818
### Flash Image

firmware/include/http.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include <WiFi.h>
55

6-
void handleHttpRequest(WiFiClient &client);
6+
void handleHttpRequest(WiFiClient& client);
77
void httpSetup();
88
void httpLoop();
99

firmware/include/improv.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ extern ImprovWiFi improvSerial;
88
void wifiSetup();
99
void wifiLoop();
1010
void onImprovWiFiErrorCb(ImprovTypes::Error err);
11-
void onImprovWiFiConnectedCb(const char *ssid, const char *password);
12-
bool connectWifi(const char *ssid, const char *password);
11+
void onImprovWiFiConnectedCb(const char* ssid, const char* password);
12+
bool connectWifi(const char* ssid, const char* password);
1313

1414
#endif

firmware/lib/ddc/ddc.cpp

Lines changed: 148 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,38 @@
11
#include "Arduino.h"
22
#include "ddc.h"
33

4-
DDC::DDC()
5-
{
6-
}
4+
DDC::DDC() {}
75

8-
bool DDC::begin()
9-
{
6+
bool DDC::begin() {
107
Wire.begin();
118
Wire.beginTransmission(_I2CAddress);
12-
if (Wire.endTransmission() == 0)
13-
{
9+
if (Wire.endTransmission() == 0) {
1410
return true;
1511
}
1612
return false;
1713
}
1814

19-
void DDC::setVCP(byte op, uint16_t value)
20-
{
15+
void DDC::setVCP(byte op, uint16_t value) {
2116
Wire.beginTransmission(_I2CAddress);
2217
Wire.write(0x51);
2318
Wire.write(0x84);
2419
Wire.write(0x03);
2520
Wire.write(op);
2621
Wire.write(byte(value >> 8));
2722
Wire.write(byte(value));
28-
Wire.write((_I2CAddress << 1) ^ 0x51 ^ 0x84 ^ 0x03 ^ op ^ byte(value >> 8) ^ byte(value)); // XOR checksum. Include all bytes sent, including slave address!
23+
Wire.write((_I2CAddress << 1) ^ 0x51 ^ 0x84 ^ 0x03 ^ op ^ byte(value >> 8) ^
24+
byte(value)); // XOR checksum. Include all bytes sent, including slave address!
2925
Wire.endTransmission();
3026
}
3127

32-
uint16_t DDC::getVCP(byte op)
33-
{
28+
uint16_t DDC::getVCP(byte op) {
3429
Wire.beginTransmission(_I2CAddress);
3530
Wire.write(0x51);
3631
Wire.write(0x82);
3732
Wire.write(0x01);
3833
Wire.write(op);
39-
Wire.write((_I2CAddress << 1) ^ 0x51 ^ 0x82 ^ 0x01 ^ op); // XOR checksum. Include all bytes sent, including slave address!
34+
Wire.write((_I2CAddress << 1) ^ 0x51 ^ 0x82 ^ 0x01 ^
35+
op); // XOR checksum. Include all bytes sent, including slave address!
4036
Wire.endTransmission();
4137
delay(40);
4238
Wire.requestFrom(_I2CAddress, (uint8_t)12);
@@ -52,50 +48,168 @@ uint16_t DDC::getVCP(byte op)
5248
return (response[8] << 8) + response[9];
5349
}
5450

55-
void DDC::setBrightness(int value)
56-
{
57-
if (value > 100)
58-
{
51+
void DDC::setBrightness(int value) {
52+
if (value > 100) {
5953
value = 100;
6054
}
6155
setVCP(0x10, value);
6256
}
6357

64-
uint16_t DDC::getBrightness()
65-
{
58+
uint16_t DDC::getBrightness() {
6659
return getVCP(0x10);
6760
}
6861

6962
// 0x01:VGA, 0x03:DVI, 0x0f:DP
70-
void DDC::setSource(uint16_t value)
71-
{
63+
void DDC::setSource(uint16_t value) {
7264
setVCP(0x60, value);
7365
}
7466

75-
uint16_t DDC::getSource()
76-
{
67+
uint16_t DDC::getSource() {
7768
return getVCP(0x60);
7869
}
7970

8071
// true:on, false:suspend
81-
void DDC::setPower(bool value)
82-
{
83-
if (value)
84-
{
72+
void DDC::setPower(bool value) {
73+
if (value) {
8574
setVCP(0xD6, 0x01);
86-
}
87-
else
88-
{
75+
} else {
8976
setVCP(0xD6, 0x03);
9077
}
9178
}
9279

93-
bool DDC::getPower()
94-
{
80+
bool DDC::getPower() {
9581
byte power = getVCP(0xD6);
96-
if (power == 0x01)
97-
{
82+
if (power == 0x01) {
9883
return true;
9984
}
10085
return false;
10186
}
87+
88+
void DDC::getEDID(uint8_t* edid) {
89+
for (int i = 0; i < 128; i += 16) {
90+
Wire.beginTransmission(0x50);
91+
Wire.write(i);
92+
Wire.endTransmission();
93+
Wire.requestFrom(0x50, 16);
94+
for (int j = 0; j < 16 && Wire.available(); j++) {
95+
edid[i + j] = Wire.read();
96+
}
97+
}
98+
}
99+
100+
String DDC::getMfg() {
101+
uint8_t edid[128];
102+
getEDID(edid);
103+
104+
char mfg[4] = {0};
105+
uint8_t byte1 = edid[8];
106+
uint8_t byte2 = edid[9];
107+
108+
mfg[0] = ((byte1 & 0x7C) >> 2) + '@';
109+
mfg[1] = ((byte1 & 0x03) << 3) + ((byte2 & 0xE0) >> 5) + '@';
110+
mfg[2] = (byte2 & 0x1F) + '@';
111+
112+
return String(mfg);
113+
}
114+
115+
String DDC::getModel() {
116+
uint8_t edid[128];
117+
getEDID(edid);
118+
119+
for (int i = 54; i < 128; i += 18) {
120+
if (edid[i] == 0x00 && edid[i + 1] == 0x00 && edid[i + 2] == 0x00 && edid[i + 3] == 0xFC) {
121+
String model = "";
122+
for (int j = i + 5; j < i + 18; j++) {
123+
if (edid[j] == 0x0A || edid[j] == 0x20) {
124+
break;
125+
}
126+
model += (char)edid[j];
127+
}
128+
return model;
129+
}
130+
}
131+
132+
return "";
133+
}
134+
135+
String DDC::getProduct() {
136+
uint8_t edid[128];
137+
getEDID(edid);
138+
139+
uint16_t productCode = (edid[11] << 8) | edid[10];
140+
141+
return String(productCode);
142+
}
143+
144+
String DDC::getProductSerial() {
145+
uint8_t edid[128];
146+
getEDID(edid);
147+
148+
for (int i = 54; i < 128; i += 18) {
149+
if (edid[i] == 0x00 && edid[i + 1] == 0x00 && edid[i + 2] == 0x00 && edid[i + 3] == 0xFF) {
150+
String serial = "";
151+
for (int j = i + 5; j < i + 18; j++) {
152+
if (edid[j] == 0x0A || edid[j] == 0x20) {
153+
break;
154+
}
155+
serial += (char)edid[j];
156+
}
157+
return serial;
158+
}
159+
}
160+
161+
return "";
162+
}
163+
164+
String DDC::getSerial() {
165+
uint8_t edid[128];
166+
getEDID(edid);
167+
168+
uint32_t serialNumber =
169+
(edid[0x0F] << 24) | (edid[0x0E] << 16) | (edid[0x0D] << 8) | edid[0x0C];
170+
171+
char hexString[11];
172+
sprintf(hexString, "0x%08X", serialNumber);
173+
174+
return String(hexString);
175+
}
176+
177+
uint32_t DDC::getSerialDecimal() {
178+
uint8_t edid[128];
179+
getEDID(edid);
180+
181+
uint32_t serialNumber =
182+
(edid[0x0F] << 24) | (edid[0x0E] << 16) | (edid[0x0D] << 8) | edid[0x0C];
183+
184+
return serialNumber;
185+
}
186+
187+
uint16_t DDC::getYear() {
188+
uint8_t edid[128];
189+
getEDID(edid);
190+
191+
uint8_t yearOffset = edid[17];
192+
return 1990 + yearOffset;
193+
}
194+
195+
uint8_t DDC::getWeek() {
196+
uint8_t edid[128];
197+
getEDID(edid);
198+
199+
return edid[16];
200+
}
201+
202+
String DDC::getVCP() {
203+
uint16_t version = getVCP(0xDF);
204+
uint8_t major = (version >> 8) & 0xFF;
205+
uint8_t minor = version & 0xFF;
206+
207+
String versionString = String(major) + "." + String(minor);
208+
209+
if (versionString == "2.0" || versionString == "2.1" || versionString == "3.0" ||
210+
versionString == "2.2") {
211+
return versionString;
212+
} else {
213+
return "Detection failed";
214+
}
215+
}

firmware/lib/ddc/ddc.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
#include <Wire.h>
55
#include "Arduino.h"
66

7-
class DDC
8-
{
7+
class DDC {
98
public:
109
DDC();
1110
bool begin();
@@ -17,6 +16,16 @@ class DDC
1716
uint16_t getSource();
1817
void setPower(bool value);
1918
bool getPower();
19+
void getEDID(uint8_t* edid);
20+
String getMfg();
21+
String getModel();
22+
String getProduct();
23+
String getProductSerial();
24+
String getSerial();
25+
uint32_t getSerialDecimal();
26+
uint16_t getYear();
27+
uint8_t getWeek();
28+
String getVCP();
2029

2130
private:
2231
uint8_t _I2CAddress = 0x37;

0 commit comments

Comments
 (0)