Elma
An event loop manager for embedded systems
temperature_server.cc
1 #include "httplib/httplib.h"
2 #include "json/json.h"
3 #include <iostream>
4 #include <ctime>
5 #include <map>
6 #include <string>
7 
8 long int unix_timestamp() {
9  time_t t = std::time(0);
10  long int now = static_cast<long int> (t);
11  return now;
12 }
13 
14 int main(void)
15 {
16  using namespace httplib;
17  using nlohmann::json;
18 
19  Server svr;
20 
21  // Example databased for saving temperatures recorded at specific x, y locations
22  // This should be at least replaced with a Database class
23  // Or better yet, use an actual database like sqlite, mysql, postgress, etc.
24  // id timestamp x y temperature
25  std::map<int, std::tuple<int, double, double, double>> database;
26  int next_id = 0;
27 
28  svr.Post("/save", [&](const Request& req, Response& res) {
29 
30  json request, result;
31 
32  try {
33  request = json::parse(req.body);
34  } catch(json::exception e) {
35  result["result"] = "error";
36  result["message"] = e.what();
37  res.set_content(result.dump(), "json");
38  return;
39  }
40 
41  std::cout << "Got new save request " << request.dump() << std::endl;
42 
43  database[next_id] = std::make_tuple(
44  unix_timestamp(),
45  request["x"].is_number() ? (double) request["x"] : 0,
46  request["y"].is_number() ? (double) request["y"] : 0,
47  request["temperature"].is_number() ? (double) request["temperature"] : 0
48  );
49 
50  result["result"] = "ok";
51  result["id"] = next_id++;
52  res.set_content(result.dump(), "json");
53 
54  });
55 
56  svr.Get(R"(/find/(\d+))", [&](const Request& req, Response& res) {
57  std::cout << "Got find request for id = " << req.matches[1] << "\n";
58  auto id = std::stoi(req.matches[1].str());
59  json result;
60  if ( database.find(id) != database.end() ) {
61  result = {
62  { "result", "ok" },
63  { "id", id },
64  { "timestamp", std::get<0>(database[id]) },
65  { "x", std::get<1>(database[id]) },
66  { "y", std::get<2>(database[id]) },
67  { "temperature", std::get<3>(database[id]) }
68  };
69  } else {
70  result["result"] = "error";
71  result["message"] = "not found";
72  res.status = 404;
73  }
74  res.set_content(result.dump(), "json");
75  });
76 
77  svr.listen("0.0.0.0", 8080); // Note, only this port is exposed to
78  // host machine
79 
80  std::cout << "You can't see me, because svr.listen never returns\n";
81 
82 }
83