The IrcBot class can connect to a channel on an IRC network. Users on the same network can send messages to the bot that are parsed by message handlers. The included handlers read digital/analog inputs and write digital outputs or echo messages back to the command sender/channel. Users can write their own message handlers inheriting from the MessageHandler class to perform different actions.
Diff: handlers.cpp
- Revision:
- 0:b8fb2df56652
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/handlers.cpp Sat Aug 02 12:09:10 2014 +0000 @@ -0,0 +1,113 @@ +#include "handlers.h" + +DigitalOutHandler::DigitalOutHandler(char * n, PinName p, bool v) : + pin(p), verbose(v) +{ + sprintf(name, "%s", n); + pin = 0; +} + +IrcMessage DigitalOutHandler::handle(IrcMessage msg) { + IrcMessage reply; + if (verbose) { + if (msg.to[0] == '#') { + strcpy(reply.to, msg.to); + } else { + strcpy(reply.to, msg.from); + } + } + char required[64]; + sprintf(required, "WRITE %s", name); + char * c = NULL; + c = strstr(msg.msg, required); + if (c != NULL) { + c = strstr(msg.msg, "ON"); + if (c != NULL) { + pin = 1; + if (verbose) { + sprintf(reply.msg, "SET %s ON", name); + } + } + c = strstr(msg.msg, "OFF"); + if (c != NULL) { + pin = 0; + if (verbose) { + sprintf(reply.msg, "SET %s OFF", name); + } + } + } + return reply; +} + +DigitalInHandler::DigitalInHandler(char * n, PinName p) : + pin(p) +{ + sprintf(name, "%s", n); +} + +IrcMessage DigitalInHandler::handle(IrcMessage msg) { + IrcMessage reply; + if (msg.to[0] == '#') { + strcpy(reply.to, msg.to); + } else { + strcpy(reply.to, msg.from); + } + char required[64]; + sprintf(required, "READ %s", name); + char * c = NULL; + c = strstr(msg.msg, required); + if (c != NULL) { + if (pin) { + sprintf(reply.msg, "%s is ON", name); + } else { + sprintf(reply.msg, "%s is OFF", name); + } + } + return reply; +} + +AnalogInHandler::AnalogInHandler(char * n, PinName p) : + pin(p), scaleval(1.0) +{ + sprintf(name, "%s", n); + sprintf(unit, ""); +} + +void AnalogInHandler::scale(float s, char * u) { + scaleval = s; + sprintf(unit, "%s", u); +} + +IrcMessage AnalogInHandler::handle(IrcMessage msg) { + IrcMessage reply; + if (msg.to[0] == '#') { + strcpy(reply.to, msg.to); + } else { + strcpy(reply.to, msg.from); + } + char required[64]; + sprintf(required, "READ %s", name); + char * c = NULL; + c = strstr(msg.msg, required); + if (c != NULL) { + float v = pin * scaleval; + sprintf(reply.msg, "%s = %f %s", name, v, unit); + } + return reply; +} + +IrcMessage EchoHandler::handle(IrcMessage msg) { + IrcMessage reply; + char * c = NULL; + c = strstr(msg.msg, "ECHO "); + if (c != NULL) { + strcpy(reply.from, msg.to); + if (msg.to[0] == '#') { + strcpy(reply.to, msg.to); + } else { + strcpy(reply.to, msg.from); + } + strcpy(reply.msg, c + 5); + } + return reply; +}