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:13:40 2014 +0000
Revision:
4:186148592f35
Parent:
3:56c6df84e619
Child:
5:5c0288a4e2c7
Small bugfixes.

Who changed what in which revision?

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