This is the end gate portion of a pinewood derby timer that uses an mbed. It communicates via HTTP to a web server that is doing the racer control and race management. Still need to put all that code together into a package on the net.
Dependencies: EthernetNetIf mbed HTTPServer Servo
Diff: derby_handler.cpp
- Revision:
- 0:74139f5b6180
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/derby_handler.cpp Wed Mar 09 05:09:42 2011 +0000 @@ -0,0 +1,203 @@ +/* +Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "derby_handler.h" +#include "Servo.h" +#include "share.h" + +#include <string> +#include <cstring> + + +//#define __DEBUG +#include "dbg/dbg.h" + +void reset_lane_latch_enables(void); + +Timeout gatetimer; +Timeout soltimer; +Timeout gameover; + +SimpleHandler3::SimpleHandler3(const char* rootPath, + const char* path, + TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, + path, + pTCPSocket) +{ + +} + +SimpleHandler3::~SimpleHandler3() +{ + DBG("\r\nHandler destroyed\r\n"); +} + +void SimpleHandler3::doGet() +{ + char resp[300]; + + DBG("\r\nIn SimpleHandler::doGet()\r\n"); + string str = "GET path is " + path(); + sprintf( resp, "%s\nlane1:%f\nlane2:%f\nlane3:%f\nlane4:%f\n", str.c_str(), lane1, lane2, lane3, lane4 ); + + setContentLen( strlen(resp) ); + + respHeaders()["Connection"] = "close"; + respHeaders()["Content-type"] = "text/plain"; + writeData(resp, strlen(resp)); + DBG("\r\nExit SimpleHandler::doGet()\r\n"); +} + +void SimpleHandler3::doPost() +{ + string str = "POST path is " + path(); + + // find out if it's a reset or start + const char * match = strstr( path().c_str(), "reset"); + if (match > 0) { // must be reset + // handle reset + timer.reset(); + myservo = 0.7; + energizeSol(); + gatetimer.detach(); + soltimer.detach(); + gameover.detach(); + raiseGate(); + deenergizeSol(); + turnoffleds(); + ledcheck(); + + DBG("\r\nreset called\r\n"); + } + match = strstr( path().c_str(), "start"); + if (match > 0) { // must be start + gatetimer.detach(); + soltimer.detach(); + gameover.detach(); + raiseGate(); + deenergizeSol(); + if (blinkm) { + FadeToColor(255,0,0); + wait(1.0); + FadeToColor(255,255,0); + wait(1.0); + FastColorChg(0,255,0); + } + lane1led = 1; + lane2led = 1; + lane3led = 1; + lane4led = 1; + reset_lane_latch_enables(); + wait(0.1); + timer.reset(); + timer.start(); + lane1 = 10.0; + lane2 = 10.0; + lane3 = 10.0; + lane4 = 10.0; + myservo = 0.2; // drop the gate + startsol = 0; + gatetimer.attach( this, &SimpleHandler3::raiseGate, 2.0 ); + soltimer.attach( this, &SimpleHandler3::energizeSol, 10.0 ); + gameover.attach( this, &SimpleHandler3::turnoffleds, 10.0 ); + + DBG("\r\nstart called\r\n"); + } + + const char * resp = str.c_str(); + setContentLen( strlen(resp) ); + respHeaders()["Content-type"] = "text/plain"; + respHeaders()["Connection"] = "close"; + writeData(resp, strlen(resp)); + DBG("\r\nExit SimpleHandler::doGet()\r\n"); +} + +void SimpleHandler3::doHead() +{ + +} + + +void SimpleHandler3::onReadable() //Data has been read +{ + +} + +void SimpleHandler3::onWriteable() //Data has been written & buf is free +{ + DBG("\r\nSimpleHandler::onWriteable() event\r\n"); + close(); //Data written, we can close the connection +} + +void SimpleHandler3::onClose() //Connection is closing +{ + //Nothing to do +} + +void SimpleHandler3::raiseGate( void ) +{ + myservo = 0.7; // reset the gate + DBG( "\r\nraiseGate\r\n"); +} + +void SimpleHandler3::deenergizeSol( void ) +{ + startsol = 0; + DBG( "\r\ndeenergizeSol\r\n"); +} + +void SimpleHandler3::energizeSol( void ) +{ + startsol = 1; +} + +void SimpleHandler3::turnoffleds( void ) +{ + lane1led = 0; + lane2led = 0; + lane3led = 0; + lane4led = 0; + if (blinkm) { + FadeToColor(0,0,0); + } + + DBG( "\r\ndeenergizeSol\r\n"); +} + +void SimpleHandler3::ledcheck( void ) { + lane1led = 1; + wait(0.2); + lane2led = 1; + wait(0.2); + lane3led = 1; + wait(0.2); + lane4led = 1; + wait(0.2); + lane1led = 0; + wait(0.2); + lane2led = 0; + wait(0.2); + lane3led = 0; + wait(0.2); + lane4led = 0; + wait(0.2); +}