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.
main.cpp@0:98c94cf86eb8, 2013-04-29 (annotated)
- Committer:
- stevep
- Date:
- Mon Apr 29 10:08:19 2013 +0000
- Revision:
- 0:98c94cf86eb8
- Child:
- 2:b4e81333dfef
Munin client showing values on a RS display board.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
stevep | 0:98c94cf86eb8 | 1 | #include "mbed.h" |
stevep | 0:98c94cf86eb8 | 2 | #include "EthernetInterface.h" |
stevep | 0:98c94cf86eb8 | 3 | #include "dispBoB.h" |
stevep | 0:98c94cf86eb8 | 4 | |
stevep | 0:98c94cf86eb8 | 5 | |
stevep | 0:98c94cf86eb8 | 6 | const char* MUNIN_SERVER_ADDRESS = "172.28.22.45"; |
stevep | 0:98c94cf86eb8 | 7 | const int MUNIN_SERVER_PORT = 4949; |
stevep | 0:98c94cf86eb8 | 8 | char cmd[] = "fetch users\n"; |
stevep | 0:98c94cf86eb8 | 9 | |
stevep | 0:98c94cf86eb8 | 10 | dispBoB db(p28, p27, p26); |
stevep | 0:98c94cf86eb8 | 11 | |
stevep | 0:98c94cf86eb8 | 12 | int main() { |
stevep | 0:98c94cf86eb8 | 13 | EthernetInterface eth; |
stevep | 0:98c94cf86eb8 | 14 | TCPSocketConnection socket; |
stevep | 0:98c94cf86eb8 | 15 | |
stevep | 0:98c94cf86eb8 | 16 | char buf[256]; |
stevep | 0:98c94cf86eb8 | 17 | char *value; |
stevep | 0:98c94cf86eb8 | 18 | int n, count, wd=0, curval=0; |
stevep | 0:98c94cf86eb8 | 19 | |
stevep | 0:98c94cf86eb8 | 20 | db.printf("DHCPing\n"); |
stevep | 0:98c94cf86eb8 | 21 | |
stevep | 0:98c94cf86eb8 | 22 | eth.init(); //Use DHCP |
stevep | 0:98c94cf86eb8 | 23 | eth.connect(); |
stevep | 0:98c94cf86eb8 | 24 | |
stevep | 0:98c94cf86eb8 | 25 | db.scroll(eth.getIPAddress(), 0.5); |
stevep | 0:98c94cf86eb8 | 26 | |
stevep | 0:98c94cf86eb8 | 27 | while(1) { |
stevep | 0:98c94cf86eb8 | 28 | wd++; |
stevep | 0:98c94cf86eb8 | 29 | while (socket.connect(MUNIN_SERVER_ADDRESS, MUNIN_SERVER_PORT) < 0) { |
stevep | 0:98c94cf86eb8 | 30 | db.printf("Cnct"); |
stevep | 0:98c94cf86eb8 | 31 | wait(1); |
stevep | 0:98c94cf86eb8 | 32 | db.cls(); |
stevep | 0:98c94cf86eb8 | 33 | } |
stevep | 0:98c94cf86eb8 | 34 | |
stevep | 0:98c94cf86eb8 | 35 | n = socket.receive(buf, 256); |
stevep | 0:98c94cf86eb8 | 36 | buf[n] = '\0'; |
stevep | 0:98c94cf86eb8 | 37 | n = socket.send(cmd, sizeof(cmd) - 1); |
stevep | 0:98c94cf86eb8 | 38 | |
stevep | 0:98c94cf86eb8 | 39 | buf[0] = '\0'; |
stevep | 0:98c94cf86eb8 | 40 | n = socket.receive_all(buf, 256); |
stevep | 0:98c94cf86eb8 | 41 | buf[n] = '\0'; |
stevep | 0:98c94cf86eb8 | 42 | |
stevep | 0:98c94cf86eb8 | 43 | count = 0; |
stevep | 0:98c94cf86eb8 | 44 | |
stevep | 0:98c94cf86eb8 | 45 | for (int i=0; i < sizeof(buf); i++) { |
stevep | 0:98c94cf86eb8 | 46 | if (buf[i] == '\n' && (i == 0 || buf[i-1] != '.')) { |
stevep | 0:98c94cf86eb8 | 47 | count++; |
stevep | 0:98c94cf86eb8 | 48 | } |
stevep | 0:98c94cf86eb8 | 49 | } |
stevep | 0:98c94cf86eb8 | 50 | |
stevep | 0:98c94cf86eb8 | 51 | char* ptr = buf; |
stevep | 0:98c94cf86eb8 | 52 | |
stevep | 0:98c94cf86eb8 | 53 | printf("%s\n", buf); |
stevep | 0:98c94cf86eb8 | 54 | |
stevep | 0:98c94cf86eb8 | 55 | for (int i=0; i < count; i++) { |
stevep | 0:98c94cf86eb8 | 56 | char *space = strstr(ptr, " "); |
stevep | 0:98c94cf86eb8 | 57 | value = space + 1; |
stevep | 0:98c94cf86eb8 | 58 | char *name; |
stevep | 0:98c94cf86eb8 | 59 | |
stevep | 0:98c94cf86eb8 | 60 | *space = 0; |
stevep | 0:98c94cf86eb8 | 61 | name = ptr; |
stevep | 0:98c94cf86eb8 | 62 | |
stevep | 0:98c94cf86eb8 | 63 | ptr = value; |
stevep | 0:98c94cf86eb8 | 64 | ptr = strstr(ptr, "\n"); |
stevep | 0:98c94cf86eb8 | 65 | *ptr = 0; |
stevep | 0:98c94cf86eb8 | 66 | |
stevep | 0:98c94cf86eb8 | 67 | if (strncmp(name, "usercount.value", 15) == 0) { |
stevep | 0:98c94cf86eb8 | 68 | printf("%s\n", value); |
stevep | 0:98c94cf86eb8 | 69 | if (curval < atoi(value)) { |
stevep | 0:98c94cf86eb8 | 70 | curval = atoi(value); |
stevep | 0:98c94cf86eb8 | 71 | db.cls(); |
stevep | 0:98c94cf86eb8 | 72 | db.printf(" %s\n", value); |
stevep | 0:98c94cf86eb8 | 73 | } |
stevep | 0:98c94cf86eb8 | 74 | break; |
stevep | 0:98c94cf86eb8 | 75 | } |
stevep | 0:98c94cf86eb8 | 76 | |
stevep | 0:98c94cf86eb8 | 77 | ptr++; |
stevep | 0:98c94cf86eb8 | 78 | } |
stevep | 0:98c94cf86eb8 | 79 | |
stevep | 0:98c94cf86eb8 | 80 | socket.close(); |
stevep | 0:98c94cf86eb8 | 81 | wait(10); |
stevep | 0:98c94cf86eb8 | 82 | } |
stevep | 0:98c94cf86eb8 | 83 | } |