Skip to content

Commit

Permalink
Respond to lxi/identification HTTP request. (#42)
Browse files Browse the repository at this point in the history
  • Loading branch information
morgendagen authored Feb 10, 2024
1 parent 10f6589 commit d0942c3
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 11 deletions.
5 changes: 5 additions & 0 deletions include/riden_http_server/riden_http_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class RidenHttpServer
void handle_reboot_dongle_get();
void handle_firmware_update_post();
void finish_firmware_update_post();
void handle_lxi_identification();
void handle_not_found();

void handle_modbus_qps();
Expand All @@ -52,6 +53,10 @@ class RidenHttpServer
void send_as_chunks(const char *str);
void send_info_row(const String key, const String value);
void send_client_row(const IPAddress &ip, const String protocol);

const char *get_firmware_version();
const char *get_serial_number();
const char *get_visa_resource();
};

} // namespace RidenDongle
1 change: 1 addition & 0 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ lib_deps =
sfeister/SCPI_Parser @ ^2.2.0
emelianov/modbus-esp8266 @ ^4.1.0
wnatth3/WiFiManager @ 2.0.16-rc.2
full-stack-ex/TinyTemplateEngine@^1.1
build_flags =
-D DEFAULT_UART_BAUDRATE=9600
-D USE_FULL_ERROR_LIST
Expand Down
37 changes: 37 additions & 0 deletions src/riden_http_server/http_static.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,40 @@ static const char *HTML_NO_CONNECTION_BODY =
" <p>You must power-cycle the power supply if you modified"
" its configuration.</p>"
"</div>";

/**
* @brief LXI identification document template.
*
* Substitution variables:
*
* 0 = Model
* 1 = Serial Number
* 2 = Firmware Revision
* 3 = Hostname
* 4 = IP Address
* 5 = Subnet mask
* 6 = MAC Address
* 7 = IP Gateway
* 8 = VISA Resource Address
*/
static const char *LXI_IDENTIFICATION_TEMPLATE = R"==(<?xml version="1.0" encoding="UTF-8" ?>
<LXIDevice xmlns="http://www.lxistandard.org/InstrumentIdentification/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.lxistandard.org/InstrumentIdentification/1.0/LXIIdentification.xsd">
<Manufacturer>Riden</Manufacturer>
<Model>${0}</Model>
<SerialNumber>${1}</SerialNumber>
<FirmwareRevision>${2}</FirmwareRevision>
<ManufacturerDescription>Power Supply</ManufacturerDescription>
<IdentificationURL>http://${3}.local/lxi/identification</IdentificationURL>
<Interface xsi:type="NetworkInformation" InterfaceType="LXI" IPType="IPv4">
<InstrumentAddressString>${8}</InstrumentAddressString>
<Hostname>${3}</Hostname>
<IPAddress>${4}</IPAddress>
<SubnetMask>${5}</SubnetMask>
<MACAddress>${6}</MACAddress>
<Gateway>${7}</Gateway>
<DHCPEnabled>true</DHCPEnabled>
<AutoIPEnabled>true</AutoIPEnabled>
</Interface>
<LXIVersion>1.5</LXIVersion>
</LXIDevice>
)==";
76 changes: 65 additions & 11 deletions src/riden_http_server/riden_http_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <riden_logging/riden_logging.h>

#include <ESP8266mDNS.h>
#include <TinyTemplateEngineMemoryReader.h>
#include <list>

using namespace RidenDongle;
Expand Down Expand Up @@ -115,6 +116,7 @@ bool RidenHttpServer::begin()
server.on("/firmware/update/", HTTPMethod::HTTP_POST,
std::bind(&RidenHttpServer::finish_firmware_update_post, this),
std::bind(&RidenHttpServer::handle_firmware_update_post, this));
server.on("/lxi/identification", HTTPMethod::HTTP_GET, std::bind(&RidenHttpServer::handle_lxi_identification, this));
server.on("/qps/modbus/", HTTPMethod::HTTP_GET, std::bind(&RidenHttpServer::handle_modbus_qps, this));
server.onNotFound(std::bind(&RidenHttpServer::handle_not_found, this));
server.begin(port());
Expand Down Expand Up @@ -442,22 +444,15 @@ void RidenHttpServer::send_dongle_info()

void RidenHttpServer::send_power_supply_info()
{
uint16_t firmware_version;
uint32_t serial_number;
String type = modbus.get_type();
modbus.get_firmware_version(firmware_version);
modbus.get_serial_number(serial_number);
char tmp_string[10];

server.sendContent(" <div class='box'>");
server.sendContent(" <a style='float:right' href='/psu/'>Details</a><h2>Power Supply</h2>");
server.sendContent(" <table class='info'>");
server.sendContent(" <tbody>");
send_info_row("Model", type);
sprintf(tmp_string, "%u.%u", firmware_version / 100u, firmware_version % 100u);
send_info_row("Firmware", tmp_string);
sprintf(tmp_string, "%08u", serial_number);
send_info_row("Serial Number", String(tmp_string));
send_info_row("Firmware", get_firmware_version());
send_info_row("Serial Number", get_serial_number());
server.sendContent(" </tbody>");
server.sendContent(" </table>");
server.sendContent(" </div>");
Expand Down Expand Up @@ -497,8 +492,7 @@ void RidenHttpServer::send_services()
send_info_row("Modbus TCP Port", String(bridge.port(), 10));
String scpi_port = String(scpi.port(), 10);
send_info_row("SCPI Port", scpi_port);
String visa_resource = "TCPIP::" + WiFi.localIP().toString() + "::" + scpi_port + "::SOCKET";
send_info_row("VISA Resource Address", visa_resource);
send_info_row("VISA Resource Address", get_visa_resource());
server.sendContent(" </tbody>");
server.sendContent(" </table>");
server.sendContent(" </div>");
Expand Down Expand Up @@ -578,3 +572,63 @@ void RidenHttpServer::handle_modbus_qps()
server.sendContent(HTML_FOOTER);
server.sendContent("");
}

void RidenHttpServer::handle_lxi_identification()
{
String model = modbus.get_type();
String ip = WiFi.localIP().toString();
String subnet_mask = WiFi.subnetMask().toString();
String mac_address = WiFi.macAddress();
String gateway = WiFi.gatewayIP().toString();
// The values to be substituted
const char *values[] = {
model.c_str(),
get_serial_number(),
get_firmware_version(),
WiFi.getHostname(),
ip.c_str(),
subnet_mask.c_str(),
mac_address.c_str(),
gateway.c_str(),
get_visa_resource(),
0 // Guard against wrong parameters, such as ${9999}
};
TinyTemplateEngineMemoryReader reader(LXI_IDENTIFICATION_TEMPLATE);
reader.keepLineEnds(true);

server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(200, "text/xml");
TinyTemplateEngine engine(reader);
engine.start(values);
while (const char *line = engine.nextLine()) {
server.sendContent(line);
}
engine.end();
server.sendContent(""); // Done
}

const char *RidenHttpServer::get_firmware_version()
{
static char firmware_version_string[10];

uint16_t firmware_version;
modbus.get_firmware_version(firmware_version);
sprintf(firmware_version_string, "%u.%u", firmware_version / 100u, firmware_version % 100u);
return firmware_version_string;
}

const char *RidenHttpServer::get_serial_number()
{
static char serial_number_string[10];
uint32_t serial_number;
modbus.get_serial_number(serial_number);
sprintf(serial_number_string, "%08u", serial_number);
return serial_number_string;
}

const char *RidenHttpServer::get_visa_resource()
{
static char visa_resource[40];
sprintf(visa_resource, "TCPIP::%s::%u::SOCKET", WiFi.localIP().toString().c_str(), scpi.port());
return visa_resource;
}

0 comments on commit d0942c3

Please sign in to comment.