76 uint32_t now = millis();
102 while (!
Serial && millis() < 3000) {
106 Serial.println(
"\n=== HTTP RPC Bidirectional Example ===\n");
107 Serial.println(
"This example demonstrates server + client in one process:");
108 Serial.println(
" - Server listens on port 8080");
109 Serial.println(
" - Client connects to localhost:8080");
110 Serial.println(
" - All three RPC modes demonstrated");
120 Serial.println(
"Starting HTTP server on port 8080...");
128 Serial.println(
"[SERVER] Client connected!");
134 Serial.println(
"[SERVER] Client disconnected!");
151 auto aOpt = params[0].
as_int();
152 auto bOpt = params[1].
as_int();
159 fl::printf(
"[SERVER] add(%d, %d) = %d\n", a, b, result);
167 ack.
set(
"ack",
true);
173 auto durationOpt = params[0].
as_int();
175 duration = *durationOpt;
179 fl::printf(
"[SERVER] longTask(%d) - ACK sent\n", duration);
182 uint32_t startTime = millis();
183 while (millis() - startTime <
static_cast<uint32_t
>(duration)) {
189 result.set(
"value", 42);
190 result.set(
"duration", duration);
193 fl::printf(
"[SERVER] longTask(%d) - DONE\n", duration);
200 ack.
set(
"ack",
true);
206 auto countOpt = params[0].
as_int();
212 fl::printf(
"[SERVER] streamData(%d) - ACK sent\n", count);
215 for (
int i = 0; i < count; i++) {
217 update.
set(
"update", i);
219 fl::printf(
"[SERVER] streamData - update %d/%d\n", i + 1, count);
225 final.set(
"value", count);
228 fl::printf(
"[SERVER] streamData(%d) - DONE\n", count);
233 Serial.println(
"ERROR: Failed to start server!");
236 Serial.println(
"✓ Server started successfully");
238 Serial.print(
" Listening on port: ");
239 Serial.println(actualPort);
254 Serial.println(
"Connecting client to server...");
262 Serial.println(
"[CLIENT] Connected to server!");
268 Serial.println(
"[CLIENT] Disconnected from server!");
282 Serial.println(
"ERROR: Failed to connect to server!");
286 Serial.println(
"✓ Client connected successfully\n");
287 Serial.println(
"Starting test sequence...\n");
291 Serial.println(
">>> [CLIENT] Testing SYNC mode: add(2, 3)");
294 request[
"jsonrpc"] =
"2.0";
295 request[
"method"] =
"add";
299 request[
"params"] = params;
307 Serial.println(
">>> [CLIENT] Testing ASYNC mode: longTask(1000)");
310 request[
"jsonrpc"] =
"2.0";
311 request[
"method"] =
"longTask";
314 request[
"params"] = params;
322 Serial.println(
">>> [CLIENT] Testing ASYNC_STREAM mode: streamData(5)");
325 request[
"jsonrpc"] =
"2.0";
326 request[
"method"] =
"streamData";
329 request[
"params"] = params;
337 if (response.contains(
"result")) {
338 const fl::json& result = response[
"result"];
341 if (result.contains(
"ack")) {
342 auto ackOpt = result[
"ack"].as_bool();
343 if (ackOpt && *ackOpt) {
344 Serial.println(
"<<< [CLIENT] Received ACK");
350 if (result.contains(
"update")) {
351 auto updateOpt = result[
"update"].as_int();
353 int update = *updateOpt;
354 fl::printf(
"<<< [CLIENT] Received update: %d\n", update);
362 if (result.contains(
"stop")) {
363 auto stopOpt = result[
"stop"].as_bool();
364 if (stopOpt && *stopOpt) {
365 Serial.println(
"<<< [CLIENT] Received FINAL result");
372 Serial.print(
"<<< [CLIENT] Received result: ");
373 Serial.println(result.to_string().c_str());
379 uint32_t now = millis();
411 Serial.println(
"\n--- Test cycle complete, starting over ---\n");
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
const uint32_t REQUEST_INTERVAL
static ServerCleanup serverCleanup
fl::unique_ptr< fl::Remote > clientRemote
std::atomic< bool > serverRunning(false)
fl::unique_ptr< fl::net::http::HttpStreamClient > clientTransport
fl::unique_ptr< fl::net::http::HttpStreamServer > serverTransport
void sendAsyncStreamRequest()
void handleClientResponse(const fl::json &response)
fl::unique_ptr< fl::Remote > serverRemote
FastLED chrono implementation - duration types for time measurements.
static void addListener(Listener *listener, int priority=0) FL_NOEXCEPT
void send(const fl::json &result)
Send a single response (for ASYNC mode)
void sendFinal(const fl::json &result)
Send final response and mark stream as complete (for ASYNC_STREAM mode)
void sendUpdate(const fl::json &update)
Send intermediate streaming update (for ASYNC_STREAM mode)
Helper class for sending responses in async/streaming RPC methods.
void push_back(const json &value) FL_NOEXCEPT
fl::optional< i64 > as_int() const FL_NOEXCEPT
bool is_array() const FL_NOEXCEPT
size_t size() const FL_NOEXCEPT
void set(const fl::string &key, const json &value) FL_NOEXCEPT
static json object() FL_NOEXCEPT
void fill_solid(CRGB *targetArray, int numToFill, const CRGB &color) FL_NOEXCEPT
Fill a range of LEDs with a solid color.
duration< fl::i64, fl::milli > milliseconds
Milliseconds - duration with period of 1/1,000 seconds.
void printf(const char *format, const Args &... args) FL_NOEXCEPT
Printf-like formatting function that prints directly to the platform output.
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
@ Green
<div style='background:#008000;width:4em;height:4em;'></div>
@ Red
<div style='background:#FF0000;width:4em;height:4em;'></div>
@ Blue
<div style='background:#0000FF;width:4em;height:4em;'></div>
@ Purple
<div style='background:#800080;width:4em;height:4em;'></div>
@ Black
<div style='background:#000000;width:4em;height:4em;'></div>