Displays a value on an RS display board

Dependencies:   EthernetInterface PCA9635 dispBoB mbed-rtos mbed munin-client-lib

Displaying values retrieved from a munin node on an RS display board. Porting this code to work with an alternative display should be trivial, I have also used an mbed application board's LCD to display the values for example.

Hardware

Software

Most of the work is done by libraries that are freely available on mbed.org. The code uses the lwip based EthernetInterface library. The only code I had to write was submit a command to a munin node and parse it's response.

Testing

The software has currently been running for around 2 weeks without any problems. On a previous run it stopped updating after 4 days.

Committer:
PrzemekWirkus
Date:
Fri Apr 11 18:05:00 2014 +0000
Revision:
3:56c6df84e619
Parent:
2:b4e81333dfef
Child:
4:186148592f35
1. C++ refactoring.; 2. Added more verboseness.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stevep 0:98c94cf86eb8 1 #include "mbed.h"
stevep 0:98c94cf86eb8 2 #include "EthernetInterface.h"
stevep 0:98c94cf86eb8 3 #include "dispBoB.h"
PrzemekWirkus 3:56c6df84e619 4 #include <string>
PrzemekWirkus 3:56c6df84e619 5 #include <vector>
PrzemekWirkus 3:56c6df84e619 6 #include <sstream>
PrzemekWirkus 3:56c6df84e619 7 #include <utility>
PrzemekWirkus 3:56c6df84e619 8
PrzemekWirkus 3:56c6df84e619 9 namespace {
PrzemekWirkus 3:56c6df84e619 10 const char* MUNIN_SERVER_ADDRESS = "172.28.22.45";
PrzemekWirkus 3:56c6df84e619 11 const int MUNIN_SERVER_PORT = 4949;
PrzemekWirkus 3:56c6df84e619 12 char CMD_FETCH_USERS[] = "fetch users\n";
PrzemekWirkus 3:56c6df84e619 13 }
stevep 0:98c94cf86eb8 14
stevep 0:98c94cf86eb8 15
PrzemekWirkus 3:56c6df84e619 16 class MuninDisplay {
PrzemekWirkus 3:56c6df84e619 17 public:
PrzemekWirkus 3:56c6df84e619 18 MuninDisplay::MuninDisplay() : db(p28, p27, p26) {
PrzemekWirkus 3:56c6df84e619 19 db.cls();
PrzemekWirkus 3:56c6df84e619 20 }
PrzemekWirkus 3:56c6df84e619 21
PrzemekWirkus 3:56c6df84e619 22 void lcd_print_str(const char *str) {
PrzemekWirkus 3:56c6df84e619 23 db.cls();
PrzemekWirkus 3:56c6df84e619 24 db.printf("%s\n", str);
PrzemekWirkus 3:56c6df84e619 25 }
PrzemekWirkus 3:56c6df84e619 26
PrzemekWirkus 3:56c6df84e619 27 void dhcp_connection() {
PrzemekWirkus 3:56c6df84e619 28 printf("DHCP: Connecting ... ");
PrzemekWirkus 3:56c6df84e619 29 eth.init(); //Use DHCP
PrzemekWirkus 3:56c6df84e619 30 eth.connect();
PrzemekWirkus 3:56c6df84e619 31 printf("%s\r\n", eth.getIPAddress());
PrzemekWirkus 3:56c6df84e619 32 }
PrzemekWirkus 3:56c6df84e619 33
PrzemekWirkus 3:56c6df84e619 34 int socket_connection() {
PrzemekWirkus 3:56c6df84e619 35 printf("TCP: Connecting ... ");
PrzemekWirkus 3:56c6df84e619 36 int ret = socket.connect(MUNIN_SERVER_ADDRESS, MUNIN_SERVER_PORT) < 0;
PrzemekWirkus 3:56c6df84e619 37 printf("[OK]\r\n");
PrzemekWirkus 3:56c6df84e619 38 return ret;
PrzemekWirkus 3:56c6df84e619 39 }
PrzemekWirkus 3:56c6df84e619 40
PrzemekWirkus 3:56c6df84e619 41 int socket_close() {
PrzemekWirkus 3:56c6df84e619 42 socket.close();
PrzemekWirkus 3:56c6df84e619 43 }
stevep 0:98c94cf86eb8 44
PrzemekWirkus 3:56c6df84e619 45 int socket_recv() {
PrzemekWirkus 3:56c6df84e619 46 const int n = socket.receive(buf, sizeof(buf) - 1);
PrzemekWirkus 3:56c6df84e619 47 if (n > 0) {
PrzemekWirkus 3:56c6df84e619 48 buf[n] = '\0';
PrzemekWirkus 3:56c6df84e619 49 printf("RECV: %s\r\n", buf);
PrzemekWirkus 3:56c6df84e619 50 }
PrzemekWirkus 3:56c6df84e619 51 return n;
PrzemekWirkus 3:56c6df84e619 52 }
PrzemekWirkus 3:56c6df84e619 53
PrzemekWirkus 3:56c6df84e619 54 int socket_recv_all() {
PrzemekWirkus 3:56c6df84e619 55 const int n = socket.receive_all(buf, sizeof(buf) - 1);
PrzemekWirkus 3:56c6df84e619 56 if (n > 0) {
PrzemekWirkus 3:56c6df84e619 57 buf[n] = '\0';
PrzemekWirkus 3:56c6df84e619 58 printf("RECV: %s\r\n", buf);
PrzemekWirkus 3:56c6df84e619 59 }
PrzemekWirkus 3:56c6df84e619 60 return n;
PrzemekWirkus 3:56c6df84e619 61 }
PrzemekWirkus 3:56c6df84e619 62
PrzemekWirkus 3:56c6df84e619 63 int socket_send(char *cmd, const int cmd_size) {
PrzemekWirkus 3:56c6df84e619 64 const int n = socket.send(cmd, cmd_size - 1);
PrzemekWirkus 3:56c6df84e619 65 return n;
PrzemekWirkus 3:56c6df84e619 66 }
stevep 0:98c94cf86eb8 67
PrzemekWirkus 3:56c6df84e619 68 int get_param_value(std::string param_name) {
PrzemekWirkus 3:56c6df84e619 69 std::vector<std::string> s = explode(std::string(buf), '\n');
PrzemekWirkus 3:56c6df84e619 70
PrzemekWirkus 3:56c6df84e619 71 for (std::vector<std::string>::iterator it = s.begin(); it != s.end(); ++it) {
PrzemekWirkus 3:56c6df84e619 72 std::string &param = *it;
PrzemekWirkus 3:56c6df84e619 73 printf("PARAM_RECV: %s\r\n", param.c_str());
PrzemekWirkus 3:56c6df84e619 74 if (!param.compare(0, param_name.size(), param_name)) {
PrzemekWirkus 3:56c6df84e619 75 printf("PARAM_FOUND: %s is '%s' \r\n", param.c_str(), param_name.c_str());
PrzemekWirkus 3:56c6df84e619 76 std::vector<std::string> name_value = explode(param, ' ');
PrzemekWirkus 3:56c6df84e619 77 if (name_value.size() == 2) {
PrzemekWirkus 3:56c6df84e619 78 const int val = atoi(name_value[1].c_str());
PrzemekWirkus 3:56c6df84e619 79 db.cls();
PrzemekWirkus 3:56c6df84e619 80 db.printf(" %s\n", name_value[1].c_str());
PrzemekWirkus 3:56c6df84e619 81 printf("DISPLAYING: %s\r\n", name_value[1].c_str());
PrzemekWirkus 3:56c6df84e619 82 return val;
PrzemekWirkus 3:56c6df84e619 83 }
PrzemekWirkus 3:56c6df84e619 84 }
PrzemekWirkus 3:56c6df84e619 85 }
PrzemekWirkus 3:56c6df84e619 86 return 0;
PrzemekWirkus 3:56c6df84e619 87 }
PrzemekWirkus 3:56c6df84e619 88
PrzemekWirkus 3:56c6df84e619 89 protected:
stevep 0:98c94cf86eb8 90 EthernetInterface eth;
stevep 0:98c94cf86eb8 91 TCPSocketConnection socket;
PrzemekWirkus 3:56c6df84e619 92 dispBoB db;
stevep 0:98c94cf86eb8 93 char buf[256];
stevep 0:98c94cf86eb8 94
PrzemekWirkus 3:56c6df84e619 95 std::vector<std::string> explode(std::string const &s, char delim)
PrzemekWirkus 3:56c6df84e619 96 {
PrzemekWirkus 3:56c6df84e619 97 std::vector<std::string> result;
PrzemekWirkus 3:56c6df84e619 98 std::istringstream iss(s);
PrzemekWirkus 3:56c6df84e619 99 for (std::string token; std::getline(iss, token, delim); ) {
PrzemekWirkus 3:56c6df84e619 100 result.push_back(token);
PrzemekWirkus 3:56c6df84e619 101 }
PrzemekWirkus 3:56c6df84e619 102 return result;
PrzemekWirkus 3:56c6df84e619 103 }
PrzemekWirkus 3:56c6df84e619 104 };
stevep 0:98c94cf86eb8 105
PrzemekWirkus 3:56c6df84e619 106 int main() {
PrzemekWirkus 3:56c6df84e619 107 MuninDisplay munin_lcd;
PrzemekWirkus 3:56c6df84e619 108 munin_lcd.dhcp_connection(); // DHCP connection
PrzemekWirkus 3:56c6df84e619 109
PrzemekWirkus 3:56c6df84e619 110 while(true) {
PrzemekWirkus 3:56c6df84e619 111 while (munin_lcd.socket_connection() < 0) {
stevep 0:98c94cf86eb8 112 wait(1);
stevep 0:98c94cf86eb8 113 }
stevep 0:98c94cf86eb8 114
PrzemekWirkus 3:56c6df84e619 115 munin_lcd.socket_recv();
PrzemekWirkus 3:56c6df84e619 116 munin_lcd.socket_send(CMD_FETCH_USERS, sizeof(CMD_FETCH_USERS));
PrzemekWirkus 3:56c6df84e619 117 munin_lcd.socket_recv_all();
PrzemekWirkus 3:56c6df84e619 118 munin_lcd.get_param_value("usercount.value");
stevep 0:98c94cf86eb8 119
PrzemekWirkus 3:56c6df84e619 120 munin_lcd.socket_close();
PrzemekWirkus 3:56c6df84e619 121 wait(3);
stevep 0:98c94cf86eb8 122 }
PrzemekWirkus 3:56c6df84e619 123 }