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

Committer:
dminear
Date:
Wed Mar 09 05:09:42 2011 +0000
Revision:
0:74139f5b6180
Initial release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dminear 0:74139f5b6180 1 /*
dminear 0:74139f5b6180 2 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
dminear 0:74139f5b6180 3
dminear 0:74139f5b6180 4 Permission is hereby granted, free of charge, to any person obtaining a copy
dminear 0:74139f5b6180 5 of this software and associated documentation files (the "Software"), to deal
dminear 0:74139f5b6180 6 in the Software without restriction, including without limitation the rights
dminear 0:74139f5b6180 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
dminear 0:74139f5b6180 8 copies of the Software, and to permit persons to whom the Software is
dminear 0:74139f5b6180 9 furnished to do so, subject to the following conditions:
dminear 0:74139f5b6180 10
dminear 0:74139f5b6180 11 The above copyright notice and this permission notice shall be included in
dminear 0:74139f5b6180 12 all copies or substantial portions of the Software.
dminear 0:74139f5b6180 13
dminear 0:74139f5b6180 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
dminear 0:74139f5b6180 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
dminear 0:74139f5b6180 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
dminear 0:74139f5b6180 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
dminear 0:74139f5b6180 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
dminear 0:74139f5b6180 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
dminear 0:74139f5b6180 20 THE SOFTWARE.
dminear 0:74139f5b6180 21 */
dminear 0:74139f5b6180 22
dminear 0:74139f5b6180 23 #include "derby_handler.h"
dminear 0:74139f5b6180 24 #include "Servo.h"
dminear 0:74139f5b6180 25 #include "share.h"
dminear 0:74139f5b6180 26
dminear 0:74139f5b6180 27 #include <string>
dminear 0:74139f5b6180 28 #include <cstring>
dminear 0:74139f5b6180 29
dminear 0:74139f5b6180 30
dminear 0:74139f5b6180 31 //#define __DEBUG
dminear 0:74139f5b6180 32 #include "dbg/dbg.h"
dminear 0:74139f5b6180 33
dminear 0:74139f5b6180 34 void reset_lane_latch_enables(void);
dminear 0:74139f5b6180 35
dminear 0:74139f5b6180 36 Timeout gatetimer;
dminear 0:74139f5b6180 37 Timeout soltimer;
dminear 0:74139f5b6180 38 Timeout gameover;
dminear 0:74139f5b6180 39
dminear 0:74139f5b6180 40 SimpleHandler3::SimpleHandler3(const char* rootPath,
dminear 0:74139f5b6180 41 const char* path,
dminear 0:74139f5b6180 42 TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath,
dminear 0:74139f5b6180 43 path,
dminear 0:74139f5b6180 44 pTCPSocket)
dminear 0:74139f5b6180 45 {
dminear 0:74139f5b6180 46
dminear 0:74139f5b6180 47 }
dminear 0:74139f5b6180 48
dminear 0:74139f5b6180 49 SimpleHandler3::~SimpleHandler3()
dminear 0:74139f5b6180 50 {
dminear 0:74139f5b6180 51 DBG("\r\nHandler destroyed\r\n");
dminear 0:74139f5b6180 52 }
dminear 0:74139f5b6180 53
dminear 0:74139f5b6180 54 void SimpleHandler3::doGet()
dminear 0:74139f5b6180 55 {
dminear 0:74139f5b6180 56 char resp[300];
dminear 0:74139f5b6180 57
dminear 0:74139f5b6180 58 DBG("\r\nIn SimpleHandler::doGet()\r\n");
dminear 0:74139f5b6180 59 string str = "GET path is " + path();
dminear 0:74139f5b6180 60 sprintf( resp, "%s\nlane1:%f\nlane2:%f\nlane3:%f\nlane4:%f\n", str.c_str(), lane1, lane2, lane3, lane4 );
dminear 0:74139f5b6180 61
dminear 0:74139f5b6180 62 setContentLen( strlen(resp) );
dminear 0:74139f5b6180 63
dminear 0:74139f5b6180 64 respHeaders()["Connection"] = "close";
dminear 0:74139f5b6180 65 respHeaders()["Content-type"] = "text/plain";
dminear 0:74139f5b6180 66 writeData(resp, strlen(resp));
dminear 0:74139f5b6180 67 DBG("\r\nExit SimpleHandler::doGet()\r\n");
dminear 0:74139f5b6180 68 }
dminear 0:74139f5b6180 69
dminear 0:74139f5b6180 70 void SimpleHandler3::doPost()
dminear 0:74139f5b6180 71 {
dminear 0:74139f5b6180 72 string str = "POST path is " + path();
dminear 0:74139f5b6180 73
dminear 0:74139f5b6180 74 // find out if it's a reset or start
dminear 0:74139f5b6180 75 const char * match = strstr( path().c_str(), "reset");
dminear 0:74139f5b6180 76 if (match > 0) { // must be reset
dminear 0:74139f5b6180 77 // handle reset
dminear 0:74139f5b6180 78 timer.reset();
dminear 0:74139f5b6180 79 myservo = 0.7;
dminear 0:74139f5b6180 80 energizeSol();
dminear 0:74139f5b6180 81 gatetimer.detach();
dminear 0:74139f5b6180 82 soltimer.detach();
dminear 0:74139f5b6180 83 gameover.detach();
dminear 0:74139f5b6180 84 raiseGate();
dminear 0:74139f5b6180 85 deenergizeSol();
dminear 0:74139f5b6180 86 turnoffleds();
dminear 0:74139f5b6180 87 ledcheck();
dminear 0:74139f5b6180 88
dminear 0:74139f5b6180 89 DBG("\r\nreset called\r\n");
dminear 0:74139f5b6180 90 }
dminear 0:74139f5b6180 91 match = strstr( path().c_str(), "start");
dminear 0:74139f5b6180 92 if (match > 0) { // must be start
dminear 0:74139f5b6180 93 gatetimer.detach();
dminear 0:74139f5b6180 94 soltimer.detach();
dminear 0:74139f5b6180 95 gameover.detach();
dminear 0:74139f5b6180 96 raiseGate();
dminear 0:74139f5b6180 97 deenergizeSol();
dminear 0:74139f5b6180 98 if (blinkm) {
dminear 0:74139f5b6180 99 FadeToColor(255,0,0);
dminear 0:74139f5b6180 100 wait(1.0);
dminear 0:74139f5b6180 101 FadeToColor(255,255,0);
dminear 0:74139f5b6180 102 wait(1.0);
dminear 0:74139f5b6180 103 FastColorChg(0,255,0);
dminear 0:74139f5b6180 104 }
dminear 0:74139f5b6180 105 lane1led = 1;
dminear 0:74139f5b6180 106 lane2led = 1;
dminear 0:74139f5b6180 107 lane3led = 1;
dminear 0:74139f5b6180 108 lane4led = 1;
dminear 0:74139f5b6180 109 reset_lane_latch_enables();
dminear 0:74139f5b6180 110 wait(0.1);
dminear 0:74139f5b6180 111 timer.reset();
dminear 0:74139f5b6180 112 timer.start();
dminear 0:74139f5b6180 113 lane1 = 10.0;
dminear 0:74139f5b6180 114 lane2 = 10.0;
dminear 0:74139f5b6180 115 lane3 = 10.0;
dminear 0:74139f5b6180 116 lane4 = 10.0;
dminear 0:74139f5b6180 117 myservo = 0.2; // drop the gate
dminear 0:74139f5b6180 118 startsol = 0;
dminear 0:74139f5b6180 119 gatetimer.attach( this, &SimpleHandler3::raiseGate, 2.0 );
dminear 0:74139f5b6180 120 soltimer.attach( this, &SimpleHandler3::energizeSol, 10.0 );
dminear 0:74139f5b6180 121 gameover.attach( this, &SimpleHandler3::turnoffleds, 10.0 );
dminear 0:74139f5b6180 122
dminear 0:74139f5b6180 123 DBG("\r\nstart called\r\n");
dminear 0:74139f5b6180 124 }
dminear 0:74139f5b6180 125
dminear 0:74139f5b6180 126 const char * resp = str.c_str();
dminear 0:74139f5b6180 127 setContentLen( strlen(resp) );
dminear 0:74139f5b6180 128 respHeaders()["Content-type"] = "text/plain";
dminear 0:74139f5b6180 129 respHeaders()["Connection"] = "close";
dminear 0:74139f5b6180 130 writeData(resp, strlen(resp));
dminear 0:74139f5b6180 131 DBG("\r\nExit SimpleHandler::doGet()\r\n");
dminear 0:74139f5b6180 132 }
dminear 0:74139f5b6180 133
dminear 0:74139f5b6180 134 void SimpleHandler3::doHead()
dminear 0:74139f5b6180 135 {
dminear 0:74139f5b6180 136
dminear 0:74139f5b6180 137 }
dminear 0:74139f5b6180 138
dminear 0:74139f5b6180 139
dminear 0:74139f5b6180 140 void SimpleHandler3::onReadable() //Data has been read
dminear 0:74139f5b6180 141 {
dminear 0:74139f5b6180 142
dminear 0:74139f5b6180 143 }
dminear 0:74139f5b6180 144
dminear 0:74139f5b6180 145 void SimpleHandler3::onWriteable() //Data has been written & buf is free
dminear 0:74139f5b6180 146 {
dminear 0:74139f5b6180 147 DBG("\r\nSimpleHandler::onWriteable() event\r\n");
dminear 0:74139f5b6180 148 close(); //Data written, we can close the connection
dminear 0:74139f5b6180 149 }
dminear 0:74139f5b6180 150
dminear 0:74139f5b6180 151 void SimpleHandler3::onClose() //Connection is closing
dminear 0:74139f5b6180 152 {
dminear 0:74139f5b6180 153 //Nothing to do
dminear 0:74139f5b6180 154 }
dminear 0:74139f5b6180 155
dminear 0:74139f5b6180 156 void SimpleHandler3::raiseGate( void )
dminear 0:74139f5b6180 157 {
dminear 0:74139f5b6180 158 myservo = 0.7; // reset the gate
dminear 0:74139f5b6180 159 DBG( "\r\nraiseGate\r\n");
dminear 0:74139f5b6180 160 }
dminear 0:74139f5b6180 161
dminear 0:74139f5b6180 162 void SimpleHandler3::deenergizeSol( void )
dminear 0:74139f5b6180 163 {
dminear 0:74139f5b6180 164 startsol = 0;
dminear 0:74139f5b6180 165 DBG( "\r\ndeenergizeSol\r\n");
dminear 0:74139f5b6180 166 }
dminear 0:74139f5b6180 167
dminear 0:74139f5b6180 168 void SimpleHandler3::energizeSol( void )
dminear 0:74139f5b6180 169 {
dminear 0:74139f5b6180 170 startsol = 1;
dminear 0:74139f5b6180 171 }
dminear 0:74139f5b6180 172
dminear 0:74139f5b6180 173 void SimpleHandler3::turnoffleds( void )
dminear 0:74139f5b6180 174 {
dminear 0:74139f5b6180 175 lane1led = 0;
dminear 0:74139f5b6180 176 lane2led = 0;
dminear 0:74139f5b6180 177 lane3led = 0;
dminear 0:74139f5b6180 178 lane4led = 0;
dminear 0:74139f5b6180 179 if (blinkm) {
dminear 0:74139f5b6180 180 FadeToColor(0,0,0);
dminear 0:74139f5b6180 181 }
dminear 0:74139f5b6180 182
dminear 0:74139f5b6180 183 DBG( "\r\ndeenergizeSol\r\n");
dminear 0:74139f5b6180 184 }
dminear 0:74139f5b6180 185
dminear 0:74139f5b6180 186 void SimpleHandler3::ledcheck( void ) {
dminear 0:74139f5b6180 187 lane1led = 1;
dminear 0:74139f5b6180 188 wait(0.2);
dminear 0:74139f5b6180 189 lane2led = 1;
dminear 0:74139f5b6180 190 wait(0.2);
dminear 0:74139f5b6180 191 lane3led = 1;
dminear 0:74139f5b6180 192 wait(0.2);
dminear 0:74139f5b6180 193 lane4led = 1;
dminear 0:74139f5b6180 194 wait(0.2);
dminear 0:74139f5b6180 195 lane1led = 0;
dminear 0:74139f5b6180 196 wait(0.2);
dminear 0:74139f5b6180 197 lane2led = 0;
dminear 0:74139f5b6180 198 wait(0.2);
dminear 0:74139f5b6180 199 lane3led = 0;
dminear 0:74139f5b6180 200 wait(0.2);
dminear 0:74139f5b6180 201 lane4led = 0;
dminear 0:74139f5b6180 202 wait(0.2);
dminear 0:74139f5b6180 203 }