From 20bea25b67ecd50009a97f7541471e6394a982ee Mon Sep 17 00:00:00 2001 From: Derek Molloy Date: Wed, 25 Mar 2015 01:04:03 +0000 Subject: [PATCH] added the CGI get example --- chp10/cgicc/LED.cpp | 51 +++++++++++++++++++++++++++++++++++++++ chp10/cgicc/LED.h | 36 ++++++++++++++++++++++++++++ chp10/cgicc/build | 3 +++ chp10/cgicc/deploy | 4 ++++ chp10/cgicc/getLED.cgi | Bin 0 -> 19924 bytes chp10/cgicc/getLED.cpp | 53 +++++++++++++++++++++++++++++++++++++++++ chp10/cgicc/hello.cpp | 2 +- 7 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 chp10/cgicc/LED.cpp create mode 100644 chp10/cgicc/LED.h create mode 100755 chp10/cgicc/deploy create mode 100755 chp10/cgicc/getLED.cgi create mode 100644 chp10/cgicc/getLED.cpp diff --git a/chp10/cgicc/LED.cpp b/chp10/cgicc/LED.cpp new file mode 100644 index 0000000..3c596be --- /dev/null +++ b/chp10/cgicc/LED.cpp @@ -0,0 +1,51 @@ +#include "LED.h" + +LED::LED(int number){ + this->number = number; + // much easier with C++11 using to_string(number) + ostringstream s; // using a stream to contruct the path + s << LED_PATH << number; //append LED number to LED_PATH + path = string(s.str()); //convert back from stream to string +} + +void LED::writeLED(string filename, string value){ + ofstream fs; + fs.open((path + filename).c_str()); + fs << value; + fs.close(); +} + +void LED::removeTrigger(){ + writeLED("/trigger", "none"); +} + +void LED::turnOn(){ + cout << "Turning LED" << number << " on." << endl; + removeTrigger(); + writeLED("/brightness", "1"); +} + +void LED::turnOff(){ + cout << "Turning LED" << number << " off." << endl; + removeTrigger(); + writeLED("/brightness", "0"); +} + +void LED::flash(string delayms = "50"){ + cout << "Making LED" << number << " flash." << endl; + writeLED("/trigger", "timer"); + writeLED("/delay_on", delayms); + writeLED("/delay_off", delayms); +} + +void LED::outputState(){ + ifstream fs; + fs.open( (path + "/trigger").c_str()); + string line; + while(getline(fs,line)) cout << line << endl; + fs.close(); +} + +LED::~LED(){ + cout << "destroying the LED with path: " << path << endl; +} diff --git a/chp10/cgicc/LED.h b/chp10/cgicc/LED.h new file mode 100644 index 0000000..66f7224 --- /dev/null +++ b/chp10/cgicc/LED.h @@ -0,0 +1,36 @@ +/** Simple On-board LED flashing program - written by Derek Molloy +* simple OOP struture for the Exploring BeagleBone book +* +* This program uses all four LEDS and can be executed in three ways: +* makeLEDs on +* makeLEDs off +* makeLEDs flash (flash at time delay intervals) +* makeLEDs status (get the trigger status) +* +* Written by Derek Molloy for the book "Exploring BeagleBone: Tools and +* Techniques for Building with Embedded Linux" by John Wiley & Sons, 2014 +* ISBN 9781118935125. Please see the file README.md in the repository root +* directory for copyright and GNU GPLv3 license information. */ + +#include +#include +#include +#include +using namespace std; + +#define LED_PATH "/sys/class/leds/beaglebone:green:usr" + +class LED{ + private: + string path; + int number; + virtual void writeLED(string filename, string value); + virtual void removeTrigger(); + public: + LED(int number); + virtual void turnOn(); + virtual void turnOff(); + virtual void flash(string delayms); + virtual void outputState(); + virtual ~LED(); +}; diff --git a/chp10/cgicc/build b/chp10/cgicc/build index 47a3957..5806abc 100755 --- a/chp10/cgicc/build +++ b/chp10/cgicc/build @@ -1,3 +1,6 @@ #!/bin/bash echo "Building the hello.cgi C++ CGI Program" g++ hello.cpp -o hello.cgi + +echo "Building the getLED.cgi C++ CGI Program" +g++ getLED.cpp LED.cpp -o getLED.cgi -lcgicc diff --git a/chp10/cgicc/deploy b/chp10/cgicc/deploy new file mode 100755 index 0000000..4fe20d8 --- /dev/null +++ b/chp10/cgicc/deploy @@ -0,0 +1,4 @@ +#!/bin/bash +echo "Copying the cgi files to the /usr/lib/cgi-bin/" +sudo cp *.cgi /usr/lib/cgi-bin/ +sudo chmod +s /usr/lib/cgi-bin/getLED.cgi diff --git a/chp10/cgicc/getLED.cgi b/chp10/cgicc/getLED.cgi new file mode 100755 index 0000000000000000000000000000000000000000..bda97ab55f9e3bd1d27b0549d0667916eca21e7b GIT binary patch literal 19924 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 literal 0 HcmV?d00001 diff --git a/chp10/cgicc/getLED.cpp b/chp10/cgicc/getLED.cpp new file mode 100644 index 0000000..697c8cd --- /dev/null +++ b/chp10/cgicc/getLED.cpp @@ -0,0 +1,53 @@ +/* C++ CGI BeagleBone GET example -- Written by Derek Molloy (www.derekmolloy.ie) + You must set the sticky bit for this script in order that it can + access the on-board LED sysfs file system. +*/ + +#include // for the input/output +#include // for the getenv call +#include // for the system uptime call + +#include // the cgicc headers +#include +#include +#include + +#include "LED.h" // the LED class from Chapter 5 of the book + +using namespace std; +using namespace cgicc; + +int main(){ + Cgicc form; + LED *led3 = new LED(3); + + char *value = getenv("REMOTE_ADDR"); // The remote address CGI environment variable + cout << "Content-type:text/html\r\n\r\n"; // Generate the HTML output + cout << "\n"; + cout << "EBB C++ GET Example\n"; + cout << "\n"; + cout << "

BeagleBone GET Example

\n"; + + form_iterator it = form.getElement("command"); + string cmd(**it); + if (!it->isEmpty() && it!=(*form).end()) { + cout << "
The LED command is " << cmd << ".
"; + + /** This code sets the USR3 LED state using the LED class **/ + if(cmd=="on") led3->turnOn(); + else if(cmd=="off") led3->turnOff(); + else if(cmd=="flash") led3->flash("100"); + else if(cmd=="status"){ + cout << "
"; + led3->outputState(); + cout << "
"; + } + else cout << "
Invalid command!
"; + } + else{ + cout << "
The LED command is missing or invalid.
"; + } + cout << "
The CGI REMOTE_ADDR environment variable is " << value << "
"; + cout << "\n"; + return 0; +} diff --git a/chp10/cgicc/hello.cpp b/chp10/cgicc/hello.cpp index 34211b2..30ac7f3 100644 --- a/chp10/cgicc/hello.cpp +++ b/chp10/cgicc/hello.cpp @@ -15,7 +15,7 @@ int main(){ cout << "\n"; cout << "

BeagleBone System Uptime

\n"; int mins = info.uptime / 60; // the uptime comes from the sysinfo struct - int ram = info.freeram / 1024 / 1024; // the available memory in Mb + int ram = info.freeram / 1024 / 1024; // the available memory in Mb cout << "
The BBB system uptime is " << mins << " minutes.\n"; cout << "There is " << ram << " Mb of memory available.
\n"; cout << "
The CGI REMOTE_ADDR environment variable is " << value << "
";