Move non-cryptography code to a separate repository
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "BlinkLED.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \class BlinkLED BlinkLED.h <BlinkLED.h>
|
||||
* \brief Blink a LED on a digital output pin.
|
||||
*
|
||||
* BlinkLED simplies the process of blinking a LED by encapsulating the
|
||||
* control logic into a single class. The following example strobes the
|
||||
* status LED on D13 with a period of 70 milliseconds on, 930 milliseconds off
|
||||
* (the LED is initially off):
|
||||
*
|
||||
* \code
|
||||
* #include <BlinkLED.h>
|
||||
*
|
||||
* BlinkLED statusBlink(13, 70, 930);
|
||||
*
|
||||
* void setup() {}
|
||||
*
|
||||
* void loop() {
|
||||
* statusBlink.loop();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The current state() of the LED can be changed immediately by calling
|
||||
* setState(). The blink rate can be modified with setBlinkRate().
|
||||
* And the blink cycle can be suspended and restarted with pause()
|
||||
* and resume().
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Initialize a blinking LED on the specified \a pin.
|
||||
*
|
||||
* The LED will blink with a rate defined by \a onTime and \a offTime
|
||||
* (in milliseconds). Initially the LED's state is given by \a initialState,
|
||||
* where true means initially on and false means initially off.
|
||||
*/
|
||||
BlinkLED::BlinkLED(uint8_t pin, unsigned long onTime, unsigned long offTime, bool initialState)
|
||||
: _pin(pin)
|
||||
, _state(initialState)
|
||||
, _paused(false)
|
||||
, _onTime(onTime)
|
||||
, _offTime(offTime)
|
||||
{
|
||||
pinMode(pin, OUTPUT);
|
||||
digitalWrite(pin, initialState ? HIGH : LOW);
|
||||
_lastChange = millis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a single iteration of the blink loop for this LED.
|
||||
*/
|
||||
void BlinkLED::loop()
|
||||
{
|
||||
if (_paused)
|
||||
return;
|
||||
unsigned long currentTime = millis();
|
||||
if (_state) {
|
||||
if ((currentTime - _lastChange) >= _onTime) {
|
||||
digitalWrite(_pin, LOW);
|
||||
_lastChange += _onTime;
|
||||
_state = false;
|
||||
}
|
||||
} else {
|
||||
if ((currentTime - _lastChange) >= _offTime) {
|
||||
digitalWrite(_pin, HIGH);
|
||||
_lastChange += _offTime;
|
||||
_state = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn unsigned long BlinkLED::onTime() const
|
||||
* \brief Returns the number of milliseconds the LED will be on.
|
||||
*
|
||||
* \sa offTime(), setBlinkRate()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn unsigned long BlinkLED::offTime() const
|
||||
* \brief Returns the number of milliseconds the LED will be off.
|
||||
*
|
||||
* \sa onTime(), setBlinkRate()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the \a onTime and \a offTime (in milliseconds).
|
||||
*
|
||||
* The change takes effect immediately. If the current onTime() or
|
||||
* offTime() has now expired, then the LED will immediately switch to
|
||||
* the opposite state().
|
||||
*
|
||||
* \sa onTime(), offTime()
|
||||
*/
|
||||
void BlinkLED::setBlinkRate(unsigned long onTime, unsigned long offTime)
|
||||
{
|
||||
_onTime = onTime;
|
||||
_offTime = offTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool BlinkLED::state() const
|
||||
* \brief Returns the current state of the LED; true is on, false is off.
|
||||
*
|
||||
* \sa setState()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the current \a state of the LED, where true is on, false is off.
|
||||
*
|
||||
* If the LED is already set to \a state, then it will complete its current
|
||||
* cycle of onTime() or offTime(). Otherwise the LED is immediately set to
|
||||
* \a state and a new cycle begins.
|
||||
*
|
||||
* \sa state()
|
||||
*/
|
||||
|
||||
void BlinkLED::setState(bool state)
|
||||
{
|
||||
if (_state != state) {
|
||||
digitalWrite(_pin, state ? HIGH : LOW);
|
||||
_state = state;
|
||||
_lastChange = millis();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn void BlinkLED::pause()
|
||||
* \brief Pauses the LED blink cycle in its current state().
|
||||
*
|
||||
* \sa resume(), isPaused()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Resumes the LED blink cycle after a pause().
|
||||
*
|
||||
* The LED will complete its current onTime() or offTime() and then
|
||||
* will switch to the opposite state(). If onTime() or offTime() has
|
||||
* already expired, then the LED will immediately switch state.
|
||||
*
|
||||
* \sa pause(), isPaused()
|
||||
*/
|
||||
void BlinkLED::resume()
|
||||
{
|
||||
if (_paused) {
|
||||
_paused = false;
|
||||
unsigned long currentTime = millis();
|
||||
if (_state) {
|
||||
if ((currentTime - _lastChange) >= _onTime) {
|
||||
digitalWrite(_pin, LOW);
|
||||
_lastChange = currentTime;
|
||||
_state = false;
|
||||
}
|
||||
} else {
|
||||
if ((currentTime - _lastChange) >= _offTime) {
|
||||
digitalWrite(_pin, HIGH);
|
||||
_lastChange = currentTime;
|
||||
_state = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool BlinkLED::isPaused()
|
||||
* \brief Returns true if the LED blink cycle is paused; false otherwise.
|
||||
*
|
||||
* \sa pause(), resume()
|
||||
*/
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef BlinkLED_h
|
||||
#define BlinkLED_h
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
class BlinkLED
|
||||
{
|
||||
public:
|
||||
BlinkLED(uint8_t pin, unsigned long onTime, unsigned long offTime, bool initialState = false);
|
||||
|
||||
void loop();
|
||||
|
||||
unsigned long onTime() const { return _onTime; }
|
||||
unsigned long offTime() const { return _offTime; }
|
||||
void setBlinkRate(unsigned long onTime, unsigned long offTime);
|
||||
|
||||
bool state() const { return _state; }
|
||||
void setState(bool state);
|
||||
|
||||
void pause() { _paused = true; }
|
||||
void resume();
|
||||
bool isPaused() const { return _paused; }
|
||||
|
||||
private:
|
||||
uint8_t _pin;
|
||||
bool _state;
|
||||
bool _paused;
|
||||
unsigned long _onTime;
|
||||
unsigned long _offTime;
|
||||
unsigned long _lastChange;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,350 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "Charlieplex.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* \class Charlieplex Charlieplex.h <Charlieplex.h>
|
||||
* \brief Manage an array of LED's in a charlieplexed arrangement.
|
||||
*
|
||||
* <a href="http://en.wikipedia.org/wiki/Charlieplexing">Charlieplexing</a>
|
||||
* is a technique for multiplexing large numbers of LED's on a small
|
||||
* number of microcontroller output pins. LED's are arranged in
|
||||
* complementary pairs; the simplest being for two output pins:
|
||||
*
|
||||
* \image html charlieplex2pin.png
|
||||
*
|
||||
* When Pin1 is 1 and Pin2 is 0, LED1 will be lit. When Pin1 is 0 and
|
||||
* Pin2 is 1, then LED2 will be lit. The technique extends to 3 pins
|
||||
* as follows:
|
||||
*
|
||||
* \image html charlieplex3pin.png
|
||||
*
|
||||
* In this case, LED5 is lit when Pin1 is 1, Pin3 is 0, and Pin2 is set
|
||||
* to a high-impedance input to "disconnect" it.
|
||||
*
|
||||
* Charlieplex presents a simple array of led() values that indicate whether
|
||||
* each LED is on, off, or in an intermediate PWM state (if setPwmLed()
|
||||
* is used). The application must call loop() or refresh() on a regular
|
||||
* basis to ensure that the multiplexed display is kept up to date.
|
||||
* The following example drives 6 LED's connected to the output pins
|
||||
* D9, D10, and D11:
|
||||
*
|
||||
* \dontinclude BlinkLED/examples/Charlieplex/Charlieplex.ino
|
||||
* \skip #include
|
||||
* \until charlie.loop
|
||||
* \until }
|
||||
*
|
||||
* The following diagram extends the circuit for 4 output pins and 12 LED's:
|
||||
*
|
||||
* \image html charlieplex4pin.png
|
||||
*
|
||||
* The following diagram extends the circuit for 5 output pins and 20 LED's:
|
||||
*
|
||||
* \image html charlieplex5pin.png
|
||||
*
|
||||
* Circuits for higher numbers of LED's get increasingly complex. For those
|
||||
* cases it can be easier to use traditional multiplexing matrix arrangements
|
||||
* and shift registers. The DMD class does this for a specific kind of
|
||||
* large dot matrix display. Otherwise, use the following pseudocode to
|
||||
* determine how to connect the LED's for higher numbers of pins:
|
||||
*
|
||||
* \code
|
||||
* n = 1
|
||||
* for Pass = 1 to NumPins-1:
|
||||
* for Pin = 1 to NumPins-Pass:
|
||||
* LED[n] is connected between Pin (anode) and Pin+Pass (cathode)
|
||||
* LED[n+1] is connected between Pin+Pass (anode) and Pin (cathode)
|
||||
* n = n + 2
|
||||
* \endcode
|
||||
*
|
||||
* Note: while the above circuit diagrams and psuedocode use 1-based
|
||||
* numbering for LED's, Charlieplex uses 0-based numbering in the led(),
|
||||
* setLed(), pwmLed(), and setPwmLed() functions.
|
||||
*
|
||||
* It isn't necessary to wire up all LED's. If you only need 10 LED's,
|
||||
* then use the 4-output circuit and omit LED11 and LED12. Charlieplex
|
||||
* only drives LED's that are lit; LED's that are unlit or unused will
|
||||
* be skipped during the refresh scan. The maximum number of LED's that
|
||||
* that can be driven by a specific number of pins is given by the
|
||||
* following table:
|
||||
*
|
||||
* <table>
|
||||
* <tr><td>Number of Pins</td><td>Number of LED's</td></tr>
|
||||
* <tr><td>2</td><td>2</td></tr>
|
||||
* <tr><td>3</td><td>6</td></tr>
|
||||
* <tr><td>4</td><td>12</td></tr>
|
||||
* <tr><td>5</td><td>20</td></tr>
|
||||
* <tr><td>6</td><td>30</td></tr>
|
||||
* <tr><td>7</td><td>42</td></tr>
|
||||
* <tr><td>8</td><td>56</td></tr>
|
||||
* <tr><td>9</td><td>72</td></tr>
|
||||
* <tr><td>10</td><td>90</td></tr>
|
||||
* <tr><td>n</td><td>n * (n - 1)</td></tr>
|
||||
* </table>
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new charliexplexing array where the output pins
|
||||
* are specified by the \a numPins entries in \a pins.
|
||||
*
|
||||
* Note: \a numPins must be 2 or greater for correct operation.
|
||||
*
|
||||
* \sa count(), setLed()
|
||||
*/
|
||||
Charlieplex::Charlieplex(const uint8_t *pins, uint8_t numPins)
|
||||
: _count(((int)numPins) * (numPins - 1))
|
||||
, _lastTime(micros())
|
||||
, _currentIndex(-1)
|
||||
, _pwmPhase(0xC0)
|
||||
{
|
||||
// Determine the best hold time for 50 Hz refresh when all LED's
|
||||
// are lit. Divide it again by 4 (to get 200 Hz) to manage the
|
||||
// simulated PWM in refresh().
|
||||
_holdTime = 20000 / _count / 4;
|
||||
|
||||
// Allocate the pin arrays and populate them. Doing this now makes
|
||||
// refresh() more efficient later, at the expense of some memory.
|
||||
_pins1 = (uint8_t *)malloc(_count);
|
||||
_pins2 = (uint8_t *)malloc(_count);
|
||||
int n = 0;
|
||||
for (uint8_t pass = 1; pass < numPins; ++pass) {
|
||||
for (uint8_t pin = 0; pin < (numPins - pass); ++pin) {
|
||||
_pins1[n] = _pins2[n + 1] = pins[pin];
|
||||
_pins2[n] = _pins1[n + 1] = pins[pin + pass];
|
||||
n += 2;
|
||||
}
|
||||
}
|
||||
|
||||
// Allocate space for the LED value array and zero it.
|
||||
_values = (uint8_t *)malloc(_count);
|
||||
memset(_values, 0, _count);
|
||||
|
||||
// Start with all pins configured as floating inputs (all LED's off).
|
||||
for (uint8_t pin = 0; pin < numPins; ++pin) {
|
||||
digitalWrite(pins[pin], LOW);
|
||||
pinMode(pins[pin], INPUT);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Destroys this charlieplexed array.
|
||||
*/
|
||||
Charlieplex::~Charlieplex()
|
||||
{
|
||||
free(_pins1);
|
||||
free(_pins2);
|
||||
free(_values);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int Charlieplex::count() const
|
||||
* \brief Returns the number of LED's in this charlieplexed array based
|
||||
* on the number of pins.
|
||||
*
|
||||
* <table>
|
||||
* <tr><td>Number of Pins</td><td>Number of LED's</td></tr>
|
||||
* <tr><td>2</td><td>2</td></tr>
|
||||
* <tr><td>3</td><td>6</td></tr>
|
||||
* <tr><td>4</td><td>12</td></tr>
|
||||
* <tr><td>5</td><td>20</td></tr>
|
||||
* <tr><td>6</td><td>30</td></tr>
|
||||
* <tr><td>7</td><td>42</td></tr>
|
||||
* <tr><td>8</td><td>56</td></tr>
|
||||
* <tr><td>9</td><td>72</td></tr>
|
||||
* <tr><td>10</td><td>90</td></tr>
|
||||
* <tr><td>n</td><td>n * (n - 1)</td></tr>
|
||||
* </table>
|
||||
*
|
||||
* \sa led()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn bool Charlieplex::led(int index) const
|
||||
* \brief Returns the value of the LED at \a index in the charplexed array;
|
||||
* true if lit; false if not lit.
|
||||
*
|
||||
* If the LED is displaying a PWM value, then this function will return
|
||||
* true for any non-zero PWM value.
|
||||
*
|
||||
* \sa setLed(), pwmLed()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Charlieplex::setLed(int index, bool value)
|
||||
* \brief Sets the \a value of the LED at \a index in the charliplexed array.
|
||||
*
|
||||
* The brightness of the LED will be proportional to the number of LED's
|
||||
* that are currently lit, as the holdTime() refresh rate will cause the
|
||||
* LED to appear to dim; the more LED's that are lit the less overall time
|
||||
* each individual LED is held on. For best results, only a single LED should
|
||||
* be lit at once or higher-brightness LED's should be used.
|
||||
*
|
||||
* \sa led(), setPwmLed()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn uint8_t Charlieplex::pwmLed(int index) const
|
||||
* \brief Returns the PWM value of the LED at \a index in the charplexed array;
|
||||
* between 0 and 255.
|
||||
*
|
||||
* \sa setPwmLed(), led()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Charlieplex::setPwmLed(int index, uint8_t value)
|
||||
* \brief Sets the PWM \a value of the LED at \a index in the charliplexed
|
||||
* array; between 0 and 255.
|
||||
*
|
||||
* If this function is used, then it is assumed that the output pins are
|
||||
* capable of PWM output.
|
||||
*
|
||||
* The PWM-specified brightness of the LED will also be affected to the
|
||||
* number of LED's that are currently lit, as the holdTime() refresh rate
|
||||
* will cause the LED to appear to dim; the more LED's that are lit the
|
||||
* less overall time each individual LED is held on. For best results,
|
||||
* only a single LED should be lit at once or higher-brightness LED's
|
||||
* should be used.
|
||||
*
|
||||
* \sa pwmLed(), setLed()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn unsigned long Charlieplex::holdTime() const
|
||||
* \brief Returns the number of microseconds that each LED should be
|
||||
* held on for before moving onto the next in loop().
|
||||
*
|
||||
* The default value is calculated so that all LED's can be refreshed
|
||||
* with a rate of at least 200 Hz, which is necessary for handling PWM
|
||||
* output on multiple LED's. The less LED's that are lit at once,
|
||||
* the faster the display will refresh.
|
||||
*
|
||||
* \sa setHoldTime(), loop()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Charlieplex::setHoldTime(unsigned long us)
|
||||
* \brief Sets the number of microseconds that each LED should be
|
||||
* held on for before moving onto the next in loop() to \a us.
|
||||
*
|
||||
* \sa holdTime(), loop()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Runs the multiplexing loop, to display the LED states on
|
||||
* the charlieplexed array.
|
||||
*
|
||||
* If holdTime() microseconds have elapsed since the last call to loop(),
|
||||
* then the current LED is turned off and the next LED that needs to be
|
||||
* lit is turned on.
|
||||
*
|
||||
* LED's that do not need to be lit are skipped. The total time for a
|
||||
* single pass through all lit LED's may be very short if only a few
|
||||
* LED's are lit at once. If all LED's are lit, then the total time for
|
||||
* a single pass will be count() * holdTime() microseconds.
|
||||
*
|
||||
* If the application is using timer interrupts to drive the multiplexing
|
||||
* process, then use refresh() instead of loop().
|
||||
*
|
||||
* \sa led(), pwmLed(), holdTime(), refresh()
|
||||
*/
|
||||
void Charlieplex::loop()
|
||||
{
|
||||
unsigned long us = micros();
|
||||
if ((us - _lastTime) >= _holdTime) {
|
||||
_lastTime = us;
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Refreshes the charlieplexed array by advancing to the next LED
|
||||
* that needs to be lit.
|
||||
*
|
||||
* This function is intended to be called from a timer interrupt service
|
||||
* routine to advance the multiplexing state without the main application
|
||||
* having to explicitly call loop().
|
||||
*
|
||||
* \sa loop()
|
||||
*/
|
||||
void Charlieplex::refresh()
|
||||
{
|
||||
// Find the next LED to be lit.
|
||||
int prevIndex = _currentIndex;
|
||||
int limit = _count;
|
||||
while (limit >= 0) {
|
||||
_currentIndex = (_currentIndex + 1) % _count;
|
||||
if (_values[_currentIndex] != 0)
|
||||
break;
|
||||
--limit;
|
||||
}
|
||||
if (limit < 0) {
|
||||
// No LED's are lit. Turn off the previous LED and exit.
|
||||
if (prevIndex != -1) {
|
||||
digitalWrite(_pins1[prevIndex], LOW);
|
||||
digitalWrite(_pins2[prevIndex], LOW);
|
||||
pinMode(_pins1[prevIndex], INPUT);
|
||||
pinMode(_pins2[prevIndex], INPUT);
|
||||
}
|
||||
_currentIndex = -1;
|
||||
return;
|
||||
}
|
||||
|
||||
// Light the current LED.
|
||||
uint8_t value = _values[_currentIndex];
|
||||
uint8_t pin1 = _pins1[_currentIndex];
|
||||
uint8_t pin2 = _pins2[_currentIndex];
|
||||
_pwmPhase += 0x40;
|
||||
if (prevIndex != _currentIndex) {
|
||||
// Turn off the previous LED.
|
||||
if (prevIndex != -1) {
|
||||
digitalWrite(_pins1[prevIndex], LOW);
|
||||
digitalWrite(_pins2[prevIndex], LOW);
|
||||
pinMode(_pins1[prevIndex], INPUT);
|
||||
pinMode(_pins2[prevIndex], INPUT);
|
||||
}
|
||||
|
||||
// We simulate PWM using a phase counter because analogWrite()
|
||||
// combined with holdTime() causes too much flickering if more
|
||||
// than one LED is lit. This reduces the PWM resolution to 1 in 4.
|
||||
pinMode(pin1, OUTPUT);
|
||||
pinMode(pin2, OUTPUT);
|
||||
if (value > _pwmPhase)
|
||||
digitalWrite(pin1, HIGH);
|
||||
else
|
||||
digitalWrite(pin1, LOW);
|
||||
} else {
|
||||
// Same LED as previous. Since there is only a single LED
|
||||
// that is lit, we can use analogWrite() to set the PWM state.
|
||||
if (value == 255)
|
||||
digitalWrite(pin1, HIGH);
|
||||
else
|
||||
analogWrite(pin1, value);
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef Charlieplex_h
|
||||
#define Charlieplex_h
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
class Charlieplex
|
||||
{
|
||||
public:
|
||||
Charlieplex(const uint8_t *pins, uint8_t numPins);
|
||||
~Charlieplex();
|
||||
|
||||
int count() const { return _count; }
|
||||
|
||||
bool led(int index) const { return _values[index] != 0; }
|
||||
void setLed(int index, bool value) { _values[index] = (value ? 255 : 0); }
|
||||
|
||||
uint8_t pwmLed(int index) const { return _values[index]; }
|
||||
void setPwmLed(int index, uint8_t value) { _values[index] = value; }
|
||||
|
||||
unsigned long holdTime() const { return _holdTime; }
|
||||
void setHoldTime(unsigned long us) { _holdTime = us; }
|
||||
|
||||
void loop();
|
||||
void refresh();
|
||||
|
||||
private:
|
||||
int _count;
|
||||
uint8_t *_pins1;
|
||||
uint8_t *_pins2;
|
||||
uint8_t *_values;
|
||||
unsigned long _holdTime;
|
||||
unsigned long _lastTime;
|
||||
int _currentIndex;
|
||||
uint8_t _pwmPhase;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,182 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "ChaseLEDs.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \class ChaseLEDs ChaseLEDs.h <ChaseLEDs.h>
|
||||
* \brief Chase LED's on output pins in a defined sequence.
|
||||
*
|
||||
* The following example performs a LED chase over the 6 PWM outputs
|
||||
* on the Arduino Uno, with a 150 millisecond delay between each LED:
|
||||
*
|
||||
* \code
|
||||
* uint8_t pins[] = {3, 5, 6, 9, 10, 11};
|
||||
* ChaseLEDs chaser(pins, sizeof(pins), 150);
|
||||
*
|
||||
* void loop() {
|
||||
* chaser.loop();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* After pin 11 is lit, the pattern will repeat at pin 3. To cause the
|
||||
* chase to oscillate back and forth instead, extend the sequence as follows:
|
||||
*
|
||||
* \code
|
||||
* uint8_t pins[] = {3, 5, 6, 9, 10, 11, 10, 9, 6, 5};
|
||||
* ChaseLEDs chaser(pins, sizeof(pins), 150);
|
||||
* \endcode
|
||||
*
|
||||
* See the \ref blink_cylon "Cylon" example for more information on
|
||||
* how to use the ChaseLEDs class in a practical application.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Initializes the LED chaser.
|
||||
*
|
||||
* The chase sequence consists of \a num pins, whose names are given by
|
||||
* the \a pins array. Each LED is lit for \a advanceTime milliseconds
|
||||
* before advancing to the next LED.
|
||||
*
|
||||
* This constructor configures all of the pins for output and sets their
|
||||
* state to be LOW. The first LED will be lit when the program first
|
||||
* calls loop().
|
||||
*
|
||||
* \sa loop()
|
||||
*/
|
||||
ChaseLEDs::ChaseLEDs(const uint8_t *pins, int num, unsigned long advanceTime)
|
||||
: _pins(pins)
|
||||
, _numPins(num)
|
||||
, _currentIndex(-1)
|
||||
, _advanceTime(advanceTime)
|
||||
, _lastChange(millis())
|
||||
{
|
||||
for (uint8_t index = 0; index < _numPins; ++index) {
|
||||
pinMode(_pins[index], OUTPUT);
|
||||
digitalWrite(_pins[index], LOW);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform a single iteration of the control loop for this LED chaser.
|
||||
*/
|
||||
void ChaseLEDs::loop()
|
||||
{
|
||||
if (_currentIndex >= 0) {
|
||||
if ((millis() - _lastChange) >= _advanceTime) {
|
||||
// Advance to the next LED in sequence.
|
||||
_currentIndex = (_currentIndex + 1) % _numPins;
|
||||
_lastChange += _advanceTime;
|
||||
advance(previousPin(1), _pins[_currentIndex]);
|
||||
}
|
||||
} else {
|
||||
// First time - light the first LED.
|
||||
_currentIndex = 0;
|
||||
_lastChange = millis();
|
||||
advance(previousPin(1), _pins[_currentIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn unsigned long ChaseLEDs::advanceTime() const
|
||||
* \brief Returns the number of milliseconds that each LED will be
|
||||
* lit in the chase sequence.
|
||||
*
|
||||
* \sa setAdvanceTime(), advance()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void ChaseLEDs::setAdvanceTime(unsigned long advanceTime)
|
||||
* \brief Sets the number of milliseconds to advance between LED's to
|
||||
* \a advanceTime.
|
||||
*
|
||||
* \sa advanceTime(), advance()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Advances to the next LED in sequence, turning off \a prevPin,
|
||||
* and turning on \a nextPin.
|
||||
*
|
||||
* The default implementation is equivalent to the following code:
|
||||
*
|
||||
* \code
|
||||
* digitalWrite(prevPin, LOW);
|
||||
* digitalWrite(nextPin, HIGH);
|
||||
* \endcode
|
||||
*
|
||||
* This method may be overridden in subclasses to provide special effects.
|
||||
* See the documentation for previousPin() for some example effects.
|
||||
*
|
||||
* \sa previousPin()
|
||||
*/
|
||||
void ChaseLEDs::advance(uint8_t prevPin, uint8_t nextPin)
|
||||
{
|
||||
digitalWrite(prevPin, LOW);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn uint8_t ChaseLEDs::previousPin(int n) const
|
||||
* \brief Returns the pin that is \a n steps back in the sequence.
|
||||
*
|
||||
* If \a n is zero, then the current pin is returned; if \a n is 1,
|
||||
* then the previous pin is returned; and so on.
|
||||
*
|
||||
* This function may be called by subclasses in their advance() method
|
||||
* to manipulate pins that are further back in the chase sequence than
|
||||
* the immediately previous pin.
|
||||
*
|
||||
* For example, the following code implements a LED chaser that lights
|
||||
* two pins at a time:
|
||||
*
|
||||
* \code
|
||||
* void DoubleChaser::advance(uint8_t prevPin, uint8_t nextPin)
|
||||
* {
|
||||
* digitalWrite(previousPin(2), LOW);
|
||||
* digitalWrite(prevPin, HIGH);
|
||||
* digitalWrite(nextPin, HIGH);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* As another exmaple, the following code uses PWM outputs to fade out
|
||||
* the previous pin rather than turn it off immediately:
|
||||
*
|
||||
* \code
|
||||
* void FadingChaser::advance(uint8_t prevPin, uint8_t nextPin)
|
||||
* {
|
||||
* digitalWrite(previousPin(2), LOW);
|
||||
* analogWrite(prevPin, 32);
|
||||
* digitalWrite(nextPin, HIGH);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* Note: it is possible to retrieve the \em following pin in sequence using
|
||||
* previousPin(-1). This could be used to fade in the LED that follows
|
||||
* \a nextPin.
|
||||
*
|
||||
* \sa advance()
|
||||
*/
|
||||
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ChaseLEDs_h
|
||||
#define ChaseLEDs_h
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
class ChaseLEDs
|
||||
{
|
||||
public:
|
||||
ChaseLEDs(const uint8_t *pins, int num, unsigned long advanceTime);
|
||||
|
||||
void loop();
|
||||
|
||||
unsigned long advanceTime() const { return _advanceTime; }
|
||||
void setAdvanceTime(unsigned long advanceTime) { _advanceTime = advanceTime; }
|
||||
|
||||
protected:
|
||||
virtual void advance(uint8_t prevPin, uint8_t nextPin);
|
||||
uint8_t previousPin(int n) const
|
||||
{ return _pins[(_currentIndex + _numPins - n) % _numPins]; }
|
||||
|
||||
private:
|
||||
const uint8_t *_pins;
|
||||
int _numPins;
|
||||
int _currentIndex;
|
||||
unsigned long _advanceTime;
|
||||
unsigned long _lastChange;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
Blink the status LED using the BlinkLED utility class.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <BlinkLED.h>
|
||||
|
||||
BlinkLED statusBlink(13, 70, 930);
|
||||
|
||||
void setup() {}
|
||||
|
||||
void loop() {
|
||||
statusBlink.loop();
|
||||
}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
/* This example is placed into the public domain */
|
||||
|
||||
#include <Charlieplex.h>
|
||||
|
||||
byte pins[3] = {9, 10, 11};
|
||||
Charlieplex charlie(pins, sizeof(pins));
|
||||
|
||||
void setup() {
|
||||
charlie.setLed(0, true); // Turn on LED1
|
||||
charlie.setLed(3, true); // Turn on LED4
|
||||
charlie.setPwmLed(5, 64); // Set LED6 to one-quarter on
|
||||
}
|
||||
|
||||
void loop() {
|
||||
charlie.loop();
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 3825 3105 4275 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 3150 3825 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 3150 4158 3110 4104 3190 4050 3110 3996 3190 3942 3110
|
||||
3915 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 3150 4180 3150
|
||||
-6
|
||||
6 4410 3375 4635 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 3600 4545 3510 4455 3510 4500 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3600 4500 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 3600 4555 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3555 4590 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3600 4635 3555 4590 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3510 4635 3465 4590 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3465 4590 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3375 4500 3510
|
||||
-6
|
||||
6 3825 4005 4275 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4050 3825 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4050 4158 4010 4104 4090 4050 4010 3996 4090 3942 4010
|
||||
3915 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4050 4180 4050
|
||||
-6
|
||||
6 4455 3105 4545 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 3150 30 30 4500 3150 4500 3180
|
||||
-6
|
||||
6 4455 4005 4545 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4050 30 30 4500 4050 4500 4080
|
||||
-6
|
||||
6 5310 3375 5535 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 3510 5445 3600 5355 3600 5400 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3510 5400 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 3510 5455 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3555 5490 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3510 5535 3555 5490 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3600 5535 3645 5490 3645
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3645 5490 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3735 5400 3600
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4230 3150 5400 3150 5400 3420
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3420 4500 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4050 5400 4050 5400 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3735 4500 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3870 3150 3600 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 4050 3600 4050
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 3645 LED2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 3645 LED1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 3195 Pin1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 4095 Pin2\001
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1,210 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 3825 3105 4275 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 3150 3825 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 3150 4158 3110 4104 3190 4050 3110 3996 3190 3942 3110
|
||||
3915 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 3150 4180 3150
|
||||
-6
|
||||
6 4410 3375 4635 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 3600 4545 3510 4455 3510 4500 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3600 4500 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 3600 4555 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3555 4590 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3600 4635 3555 4590 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3510 4635 3465 4590 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3465 4590 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3375 4500 3510
|
||||
-6
|
||||
6 3825 4005 4275 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4050 3825 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4050 4158 4010 4104 4090 4050 4010 3996 4090 3942 4010
|
||||
3915 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4050 4180 4050
|
||||
-6
|
||||
6 4455 3105 4545 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 3150 30 30 4500 3150 4500 3180
|
||||
-6
|
||||
6 4455 4005 4545 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4050 30 30 4500 4050 4500 4080
|
||||
-6
|
||||
6 3825 4905 4275 4995
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4950 3825 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4950 4158 4910 4104 4990 4050 4910 3996 4990 3942 4910
|
||||
3915 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4950 4180 4950
|
||||
-6
|
||||
6 4410 4275 4635 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 4500 4545 4410 4455 4410 4500 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4500 4500 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 4500 4555 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4455 4590 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4500 4635 4455 4590 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4410 4635 4365 4590 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4365 4590 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4275 4500 4410
|
||||
-6
|
||||
6 6210 3915 6435 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6300 4140 6345 4050 6255 4050 6300 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 4140 6300 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6245 4140 6355 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4095 6390 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 4140 6435 4095 6390 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 4050 6435 4005 6390 4005
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4005 6390 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 3915 6300 4050
|
||||
-6
|
||||
6 5310 3375 5535 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 3510 5445 3600 5355 3600 5400 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3510 5400 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 3510 5455 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3555 5490 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3510 5535 3555 5490 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3600 5535 3645 5490 3645
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3645 5490 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3735 5400 3600
|
||||
-6
|
||||
6 5310 4275 5535 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 4410 5445 4500 5355 4500 5400 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4410 5400 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 4410 5455 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4455 5490 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4410 5535 4455 5490 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4500 5535 4545 5490 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4545 5490 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4635 5400 4500
|
||||
-6
|
||||
6 7110 3915 7335 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7200 4050 7245 4140 7155 4140 7200 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 4050 7200 3915
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7145 4050 7255 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 4095 7290 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 4050 7335 4095 7290 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 4140 7335 4185 7290 4185
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 4185 7290 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 4275 7200 4140
|
||||
-6
|
||||
6 5355 3105 5445 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 3150 30 30 5400 3150 5400 3180
|
||||
-6
|
||||
6 6255 3105 6345 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 3150 30 30 6300 3150 6300 3180
|
||||
-6
|
||||
6 6255 4905 6345 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 4950 30 30 6300 4950 6300 4980
|
||||
-6
|
||||
6 5355 4905 5445 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4950 30 30 5400 4950 5400 4980
|
||||
-6
|
||||
6 4455 4905 4545 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4950 30 30 4500 4950 4500 4980
|
||||
-6
|
||||
6 5355 4005 5445 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4050 30 30 5400 4050 5400 4080
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4230 3150 5400 3150 5400 3420
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3420 4500 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4050 5400 4050 5400 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3735 4500 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3870 3150 3600 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 4050 3600 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 4950 3600 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4050 4500 4320
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4590 4500 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4365 5400 4005
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4950 5400 4950 5400 4590
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5400 3150 6300 3150 6300 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6255 3150 7200 3150 7200 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5355 4950 6300 4950 6300 4230
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6300 4950 7200 4950 7200 4185
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 3645 LED2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 3645 LED1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 3195 Pin1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 4095 Pin2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 4995 Pin3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 4545 LED3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 4545 LED4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 7425 4140 LED6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 6525 4140 LED5\001
|
||||
|
Before Width: | Height: | Size: 5.9 KiB |
@@ -1,394 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6300.000 4950.000 6300 4905 6345 4950 6300 4995
|
||||
6 3825 3105 4275 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 3150 3825 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 3150 4158 3110 4104 3190 4050 3110 3996 3190 3942 3110
|
||||
3915 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 3150 4180 3150
|
||||
-6
|
||||
6 4410 3375 4635 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 3600 4545 3510 4455 3510 4500 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3600 4500 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 3600 4555 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3555 4590 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3600 4635 3555 4590 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3510 4635 3465 4590 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3465 4590 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3375 4500 3510
|
||||
-6
|
||||
6 3825 4005 4275 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4050 3825 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4050 4158 4010 4104 4090 4050 4010 3996 4090 3942 4010
|
||||
3915 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4050 4180 4050
|
||||
-6
|
||||
6 4455 3105 4545 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 3150 30 30 4500 3150 4500 3180
|
||||
-6
|
||||
6 4455 4005 4545 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4050 30 30 4500 4050 4500 4080
|
||||
-6
|
||||
6 3825 4905 4275 4995
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4950 3825 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4950 4158 4910 4104 4990 4050 4910 3996 4990 3942 4910
|
||||
3915 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4950 4180 4950
|
||||
-6
|
||||
6 4410 4275 4635 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 4500 4545 4410 4455 4410 4500 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4500 4500 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 4500 4555 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4455 4590 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4500 4635 4455 4590 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4410 4635 4365 4590 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4365 4590 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4275 4500 4410
|
||||
-6
|
||||
6 5310 3375 5535 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 3510 5445 3600 5355 3600 5400 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3510 5400 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 3510 5455 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3555 5490 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3510 5535 3555 5490 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3600 5535 3645 5490 3645
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3645 5490 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3735 5400 3600
|
||||
-6
|
||||
6 5310 4275 5535 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 4410 5445 4500 5355 4500 5400 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4410 5400 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 4410 5455 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4455 5490 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4410 5535 4455 5490 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4500 5535 4545 5490 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4545 5490 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4635 5400 4500
|
||||
-6
|
||||
6 5355 3105 5445 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 3150 30 30 5400 3150 5400 3180
|
||||
-6
|
||||
6 5355 4905 5445 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4950 30 30 5400 4950 5400 4980
|
||||
-6
|
||||
6 4455 4905 4545 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4950 30 30 4500 4950 4500 4980
|
||||
-6
|
||||
6 5355 4005 5445 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4050 30 30 5400 4050 5400 4080
|
||||
-6
|
||||
6 6660 3915 6885 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6750 4140 6795 4050 6705 4050 6750 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6750 4140 6750 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6695 4140 6805 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4095 6840 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6885 4140 6885 4095 6840 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6885 4050 6885 4005 6840 4005
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4005 6840 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6750 3915 6750 4050
|
||||
-6
|
||||
6 7560 3915 7785 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7650 4050 7695 4140 7605 4140 7650 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7650 4050 7650 3915
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7595 4050 7705 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7785 4095 7740 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7785 4050 7785 4095 7740 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7785 4140 7785 4185 7740 4185
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7785 4185 7740 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7650 4275 7650 4140
|
||||
-6
|
||||
6 6705 3105 6795 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6750 3150 30 30 6750 3150 6750 3180
|
||||
-6
|
||||
6 6705 4905 6795 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6750 4950 30 30 6750 4950 6750 4980
|
||||
-6
|
||||
6 4410 5175 4635 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 5400 4545 5310 4455 5310 4500 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5400 4500 5535
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 5400 4555 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 5355 4590 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 5400 4635 5355 4590 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 5310 4635 5265 4590 5265
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 5265 4590 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5175 4500 5310
|
||||
-6
|
||||
6 3825 5805 4275 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 5850 3825 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 5850 4158 5810 4104 5890 4050 5810 3996 5890 3942 5810
|
||||
3915 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 5850 4180 5850
|
||||
-6
|
||||
6 4455 5805 4545 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 5850 30 30 4500 5850 4500 5880
|
||||
-6
|
||||
6 5310 5175 5535 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 5310 5445 5400 5355 5400 5400 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5310 5400 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 5310 5455 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5355 5490 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 5310 5535 5355 5490 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 5400 5535 5445 5490 5445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5445 5490 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5535 5400 5400
|
||||
-6
|
||||
6 5355 5805 5445 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 5850 30 30 5400 5850 5400 5880
|
||||
-6
|
||||
6 6255 5040 6345 5130
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 5085 30 30 6300 5085 6300 5115
|
||||
-6
|
||||
6 6210 5175 6435 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6300 5400 6345 5310 6255 5310 6300 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5400 6300 5535
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6245 5400 6355 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5355 6390 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 5400 6435 5355 6390 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 5310 6435 5265 6390 5265
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5265 6390 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5175 6300 5310
|
||||
-6
|
||||
6 6255 5805 6345 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 5850 30 30 6300 5850 6300 5880
|
||||
-6
|
||||
6 7110 5175 7335 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7200 5310 7245 5400 7155 5400 7200 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5310 7200 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7145 5310 7255 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 5355 7290 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 5310 7335 5355 7290 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 5400 7335 5445 7290 5445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 5445 7290 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5535 7200 5400
|
||||
-6
|
||||
6 8460 4275 8685 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
8550 4500 8595 4410 8505 4410 8550 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8550 4500 8550 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8495 4500 8605 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8685 4455 8640 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
8685 4500 8685 4455 8640 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
8685 4410 8685 4365 8640 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8685 4365 8640 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8550 4275 8550 4410
|
||||
-6
|
||||
6 9360 4275 9585 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
9450 4410 9495 4500 9405 4500 9450 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9450 4410 9450 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9395 4410 9505 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9585 4455 9540 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9585 4410 9585 4455 9540 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9585 4500 9585 4545 9540 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9585 4545 9540 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9450 4635 9450 4500
|
||||
-6
|
||||
6 8505 3105 8595 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 8550 3150 30 30 8550 3150 8550 3180
|
||||
-6
|
||||
6 7605 3105 7695 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7650 3150 30 30 7650 3150 7650 3180
|
||||
-6
|
||||
6 7155 5805 7245 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7200 5850 30 30 7200 5850 7200 5880
|
||||
-6
|
||||
6 8505 5805 8595 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 8550 5850 30 30 8550 5850 8550 5880
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4230 3150 5400 3150 5400 3420
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3420 4500 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4050 5400 4050 5400 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3735 4500 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3870 3150 3600 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 4050 3600 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 4950 3600 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4050 4500 4320
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4590 4500 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4365 5400 4005
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4950 5400 4950 5400 4590
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4950 4500 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5490 5400 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5220 5400 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3150 6795 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6750 3150 6750 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4950 6750 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6750 4230 6750 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5400 4050 6300 4050 6300 4905
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6705 3150 7650 3150 7650 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6750 4950 7650 4950 7650 4185
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4230 5850 4500 5850 4500 5490
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
3825 5850 3600 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5850 5400 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6300 5085 7200 5085 7200 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6300 4995 6300 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5490 6300 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5400 5850 7200 5850 7200 5490
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7605 3150 8550 3150 8550 4275
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7200 5850 8550 5850 8550 4590
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8505 3150 9450 3150 9450 4275
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8550 5850 9450 5850 9450 4590
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 3645 LED2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 3645 LED1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 3195 Pin1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 4095 Pin2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 4995 Pin3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 4545 LED3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 4545 LED4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 7875 4140 LED8\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 6975 4140 LED7\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 3105 5895 Pin4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 5445 LED6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 5445 LED5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 6525 5445 LED9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 7425 5445 LED10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 8730 4500 LED11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 9630 4500 LED12\001
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,649 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4500.000 4950.000 4500 4905 4545 4950 4500 4995
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 4950.000 4500.000 4905 4500 4950 4455 4995 4500
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 5850.000 4500.000 5805 4500 5850 4455 5895 4500
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6750.000 4500.000 6750 4455 6795 4500 6750 4545
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6750.000 4950.000 6750 4905 6795 4950 6750 4995
|
||||
5 1 0 1 0 7 50 -1 -1 0.000 0 0 0 0 6300.000 5625.000 6255 5625 6300 5580 6345 5625
|
||||
6 2025 3105 2475 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2120 3150 2025 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2385 3150 2358 3110 2304 3190 2250 3110 2196 3190 2142 3110
|
||||
2115 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2475 3150 2380 3150
|
||||
-6
|
||||
6 2610 3375 2835 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2700 3600 2745 3510 2655 3510 2700 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 3600 2700 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2645 3600 2755 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 3555 2790 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 3600 2835 3555 2790 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 3510 2835 3465 2790 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 3465 2790 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 3375 2700 3510
|
||||
-6
|
||||
6 2025 4005 2475 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2120 4050 2025 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2385 4050 2358 4010 2304 4090 2250 4010 2196 4090 2142 4010
|
||||
2115 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2475 4050 2380 4050
|
||||
-6
|
||||
6 2655 3105 2745 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 2700 3150 30 30 2700 3150 2700 3180
|
||||
-6
|
||||
6 2655 4005 2745 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 2700 4050 30 30 2700 4050 2700 4080
|
||||
-6
|
||||
6 2025 4905 2475 4995
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2120 4950 2025 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2385 4950 2358 4910 2304 4990 2250 4910 2196 4990 2142 4910
|
||||
2115 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2475 4950 2380 4950
|
||||
-6
|
||||
6 2610 4275 2835 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2700 4500 2745 4410 2655 4410 2700 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 4500 2700 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2645 4500 2755 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 4455 2790 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 4500 2835 4455 2790 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 4410 2835 4365 2790 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 4365 2790 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 4275 2700 4410
|
||||
-6
|
||||
6 3510 3375 3735 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
3600 3510 3645 3600 3555 3600 3600 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 3510 3600 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3545 3510 3655 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 3555 3690 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 3510 3735 3555 3690 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 3600 3735 3645 3690 3645
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 3645 3690 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 3735 3600 3600
|
||||
-6
|
||||
6 3510 4275 3735 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
3600 4410 3645 4500 3555 4500 3600 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 4410 3600 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3545 4410 3655 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 4455 3690 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 4410 3735 4455 3690 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 4500 3735 4545 3690 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 4545 3690 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 4635 3600 4500
|
||||
-6
|
||||
6 3555 3105 3645 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 3150 30 30 3600 3150 3600 3180
|
||||
-6
|
||||
6 3555 4905 3645 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 4950 30 30 3600 4950 3600 4980
|
||||
-6
|
||||
6 2655 4905 2745 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 2700 4950 30 30 2700 4950 2700 4980
|
||||
-6
|
||||
6 3555 4005 3645 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 4050 30 30 3600 4050 3600 4080
|
||||
-6
|
||||
6 4860 3915 5085 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4950 4140 4995 4050 4905 4050 4950 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4950 4140 4950 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4895 4140 5005 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5085 4095 5040 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5085 4140 5085 4095 5040 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5085 4050 5085 4005 5040 4005
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5085 4005 5040 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4950 3915 4950 4050
|
||||
-6
|
||||
6 5760 3915 5985 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5850 4050 5895 4140 5805 4140 5850 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5850 4050 5850 3915
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5795 4050 5905 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4095 5940 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5985 4050 5985 4095 5940 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5985 4140 5985 4185 5940 4185
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4185 5940 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5850 4275 5850 4140
|
||||
-6
|
||||
6 4905 3105 4995 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4950 3150 30 30 4950 3150 4950 3180
|
||||
-6
|
||||
6 4905 4905 4995 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4950 4950 30 30 4950 4950 4950 4980
|
||||
-6
|
||||
6 2610 5175 2835 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2700 5400 2745 5310 2655 5310 2700 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 5400 2700 5535
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2645 5400 2755 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 5355 2790 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 5400 2835 5355 2790 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 5310 2835 5265 2790 5265
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 5265 2790 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 5175 2700 5310
|
||||
-6
|
||||
6 2025 5805 2475 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2120 5850 2025 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2385 5850 2358 5810 2304 5890 2250 5810 2196 5890 2142 5810
|
||||
2115 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2475 5850 2380 5850
|
||||
-6
|
||||
6 2655 5805 2745 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 2700 5850 30 30 2700 5850 2700 5880
|
||||
-6
|
||||
6 3510 5175 3735 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
3600 5310 3645 5400 3555 5400 3600 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 5310 3600 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3545 5310 3655 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 5355 3690 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 5310 3735 5355 3690 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 5400 3735 5445 3690 5445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 5445 3690 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 5535 3600 5400
|
||||
-6
|
||||
6 3555 5805 3645 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 5850 30 30 3600 5850 3600 5880
|
||||
-6
|
||||
6 4455 5040 4545 5130
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 5085 30 30 4500 5085 4500 5115
|
||||
-6
|
||||
6 4410 5175 4635 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 5400 4545 5310 4455 5310 4500 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5400 4500 5535
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 5400 4555 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 5355 4590 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 5400 4635 5355 4590 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 5310 4635 5265 4590 5265
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 5265 4590 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5175 4500 5310
|
||||
-6
|
||||
6 4455 5805 4545 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 5850 30 30 4500 5850 4500 5880
|
||||
-6
|
||||
6 5310 5175 5535 5535
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 5310 5445 5400 5355 5400 5400 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5310 5400 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 5310 5455 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5355 5490 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 5310 5535 5355 5490 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 5400 5535 5445 5490 5445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5445 5490 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 5535 5400 5400
|
||||
-6
|
||||
6 2025 6705 2475 6795
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2120 6750 2025 6750
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2385 6750 2358 6710 2304 6790 2250 6710 2196 6790 2142 6710
|
||||
2115 6750
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2475 6750 2380 6750
|
||||
-6
|
||||
6 2655 6705 2745 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 2700 6750 30 30 2700 6750 2700 6780
|
||||
-6
|
||||
6 2610 6075 2835 6435
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2700 6300 2745 6210 2655 6210 2700 6300
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 6300 2700 6435
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2645 6300 2755 6300
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 6255 2790 6300
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 6300 2835 6255 2790 6255
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2835 6210 2835 6165 2790 6165
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2835 6165 2790 6210
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2700 6075 2700 6210
|
||||
-6
|
||||
6 3510 6075 3735 6435
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
3600 6210 3645 6300 3555 6300 3600 6210
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 6210 3600 6075
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3545 6210 3655 6210
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 6255 3690 6210
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 6210 3735 6255 3690 6255
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
3735 6300 3735 6345 3690 6345
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3735 6345 3690 6300
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3600 6435 3600 6300
|
||||
-6
|
||||
6 7110 5715 7335 6075
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7200 5850 7245 5940 7155 5940 7200 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5850 7200 5715
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7145 5850 7255 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 5895 7290 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 5850 7335 5895 7290 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 5940 7335 5985 7290 5985
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 5985 7290 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 6075 7200 5940
|
||||
-6
|
||||
6 6210 5715 6435 6075
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6300 5940 6345 5850 6255 5850 6300 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5940 6300 6075
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6245 5940 6355 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5895 6390 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 5940 6435 5895 6390 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 5850 6435 5805 6390 5805
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5805 6390 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5715 6300 5850
|
||||
-6
|
||||
6 5805 4905 5895 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5850 4950 30 30 5850 4950 5850 4980
|
||||
-6
|
||||
6 6255 4905 6345 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 4950 30 30 6300 4950 6300 4980
|
||||
-6
|
||||
6 6255 6705 6345 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 6750 30 30 6300 6750 6300 6780
|
||||
-6
|
||||
6 3555 6705 3645 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3600 6750 30 30 3600 6750 3600 6780
|
||||
-6
|
||||
6 8010 5715 8235 6075
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
8100 5940 8145 5850 8055 5850 8100 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8100 5940 8100 6075
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8045 5940 8155 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8235 5895 8190 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
8235 5940 8235 5895 8190 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
8235 5850 8235 5805 8190 5805
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8235 5805 8190 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8100 5715 8100 5850
|
||||
-6
|
||||
6 8910 5715 9135 6075
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
9000 5850 9045 5940 8955 5940 9000 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9000 5850 9000 5715
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8945 5850 9055 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9135 5895 9090 5850
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9135 5850 9135 5895 9090 5895
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9135 5940 9135 5985 9090 5985
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9135 5985 9090 5940
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9000 6075 9000 5940
|
||||
-6
|
||||
6 4455 4455 4545 4545
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4500 30 30 4500 4500 4500 4530
|
||||
-6
|
||||
6 8055 4455 8145 4545
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 8100 4500 30 30 8100 4500 8100 4530
|
||||
-6
|
||||
6 7155 6705 7245 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7200 6750 30 30 7200 6750 7200 6780
|
||||
-6
|
||||
6 8055 6705 8145 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 8100 6750 30 30 8100 6750 8100 6780
|
||||
-6
|
||||
6 6660 3915 6885 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6750 4140 6795 4050 6705 4050 6750 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6750 4140 6750 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6695 4140 6805 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4095 6840 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6885 4140 6885 4095 6840 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6885 4050 6885 4005 6840 4005
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4005 6840 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6750 3915 6750 4050
|
||||
-6
|
||||
6 7560 3915 7785 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7650 4050 7695 4140 7605 4140 7650 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7650 4050 7650 3915
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7595 4050 7705 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7785 4095 7740 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7785 4050 7785 4095 7740 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7785 4140 7785 4185 7740 4185
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7785 4185 7740 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7650 4275 7650 4140
|
||||
-6
|
||||
6 5355 5805 5445 5895
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 5850 30 30 5400 5850 5400 5880
|
||||
-6
|
||||
6 6705 4320 6795 4410
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6750 4365 30 30 6750 4365 6750 4395
|
||||
-6
|
||||
6 6705 3105 6795 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6750 3150 30 30 6750 3150 6750 3180
|
||||
-6
|
||||
6 5805 3105 5895 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5850 3150 30 30 5850 3150 5850 3180
|
||||
-6
|
||||
6 9810 4725 10035 5085
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
9900 4950 9945 4860 9855 4860 9900 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9900 4950 9900 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9845 4950 9955 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10035 4905 9990 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10035 4950 10035 4905 9990 4905
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10035 4860 10035 4815 9990 4815
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10035 4815 9990 4860
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9900 4725 9900 4860
|
||||
-6
|
||||
6 10710 4725 10935 5085
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
10800 4860 10845 4950 10755 4950 10800 4860
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10800 4860 10800 4725
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10745 4860 10855 4860
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10935 4905 10890 4860
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10935 4860 10935 4905 10890 4905
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10935 4950 10935 4995 10890 4995
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10935 4995 10890 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10800 5085 10800 4950
|
||||
-6
|
||||
6 9855 3105 9945 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 9900 3150 30 30 9900 3150 9900 3180
|
||||
-6
|
||||
6 8955 6705 9045 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 9000 6750 30 30 9000 6750 9000 6780
|
||||
-6
|
||||
6 9855 6705 9945 6795
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 9900 6750 30 30 9900 6750 9900 6780
|
||||
-6
|
||||
6 7605 3105 7695 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 7650 3150 30 30 7650 3150 7650 3180
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
2430 3150 3600 3150 3600 3420
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 3420 2700 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
2475 4050 3600 4050 3600 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 3735 2700 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
2070 3150 1800 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
2025 4050 1800 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
2025 4950 1800 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 4050 2700 4320
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 4590 2700 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 4365 3600 4005
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
2475 4950 3600 4950 3600 4590
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 4950 2700 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 5490 3600 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 5220 3600 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 3150 4995 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4950 3150 4950 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 4950 4950 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4950 4230 4950 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
3600 4050 4500 4050 4500 4905
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4905 3150 5850 3150 5850 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4950 4950 5850 4950 5850 4185
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
2430 5850 2700 5850 2700 5490
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
2025 5850 1800 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 5850 3600 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4500 5085 5400 5085 5400 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4995 4500 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 5490 4500 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
3600 5850 5400 5850 5400 5490
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
8 1 1.00 60.00 120.00
|
||||
2025 6750 1800 6750
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
2430 6750 2700 6750 2700 6390
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 6750 3600 6750
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 6390 3600 6750
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2700 5850 2700 6120
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3600 5850 3600 6120
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5760 4950 7200 4950 7200 5715
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6300 5715 6300 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
3600 6750 7200 6750 7200 6030
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6300 6030 6300 6750
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4500 4905 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4995 4500 5805 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5895 4500 8100 4500 8100 5760
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8055 4500 9000 4500 9000 5760
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8100 6075 8100 6750 7155 6750
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8010 6750 9000 6750 9000 6030
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
|
||||
5400 5850 6075 5850 6075 5625 6255 5625
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6345 5625 6750 5625 6750 4995
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6750 4905 6750 4545
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6750 4455 6750 4230
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6750 4365 7650 4365 7650 4230
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5850 3150 6750 3150 6750 3915
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6750 3150 7650 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
7650 3150 7650 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7605 3150 10800 3150 10800 4770
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
9900 4770 9900 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
8955 6750 10800 6750 10800 5085
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
9900 5040 9900 6750
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 3825 3645 LED2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 2925 3645 LED1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 1305 3195 Pin1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 1305 4095 Pin2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 1305 4995 Pin3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 2925 4545 LED3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 3825 4545 LED4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 6075 4140 LED10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5175 4140 LED9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 1305 5895 Pin4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 3825 5445 LED6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 2925 5445 LED5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 4725 5445 LED11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 5625 5445 LED12\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 375 1305 6795 Pin5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 2925 6345 LED7\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 3825 6345 LED8\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 6480 5940 LED13\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 7380 5940 LED14\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 8280 5940 LED17\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 9180 5940 LED18\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 6930 4140 LED15\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 7830 4140 LED16\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 10080 4995 LED19\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 10980 4995 LED20\001
|
||||
|
Before Width: | Height: | Size: 16 KiB |
@@ -1,215 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 3825 3105 4275 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 3150 3825 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 3150 4158 3110 4104 3190 4050 3110 3996 3190 3942 3110
|
||||
3915 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 3150 4180 3150
|
||||
-6
|
||||
6 4410 3375 4635 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 3600 4545 3510 4455 3510 4500 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3600 4500 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 3600 4555 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3555 4590 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3600 4635 3555 4590 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 3510 4635 3465 4590 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 3465 4590 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3375 4500 3510
|
||||
-6
|
||||
6 3825 4005 4275 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4050 3825 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4050 4158 4010 4104 4090 4050 4010 3996 4090 3942 4010
|
||||
3915 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4050 4180 4050
|
||||
-6
|
||||
6 4455 3105 4545 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 3150 30 30 4500 3150 4500 3180
|
||||
-6
|
||||
6 4455 4005 4545 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4050 30 30 4500 4050 4500 4080
|
||||
-6
|
||||
6 3825 4905 4275 4995
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3920 4950 3825 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
4185 4950 4158 4910 4104 4990 4050 4910 3996 4990 3942 4910
|
||||
3915 4950
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4275 4950 4180 4950
|
||||
-6
|
||||
6 4410 4275 4635 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
4500 4500 4545 4410 4455 4410 4500 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4500 4500 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4445 4500 4555 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4455 4590 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4500 4635 4455 4590 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
4635 4410 4635 4365 4590 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4635 4365 4590 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4275 4500 4410
|
||||
-6
|
||||
6 6210 3915 6435 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6300 4140 6345 4050 6255 4050 6300 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 4140 6300 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6245 4140 6355 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4095 6390 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 4140 6435 4095 6390 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6435 4050 6435 4005 6390 4005
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4005 6390 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6300 3915 6300 4050
|
||||
-6
|
||||
6 5310 3375 5535 3735
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 3510 5445 3600 5355 3600 5400 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3510 5400 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 3510 5455 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3555 5490 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3510 5535 3555 5490 3555
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 3600 5535 3645 5490 3645
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3645 5490 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3735 5400 3600
|
||||
-6
|
||||
6 5310 4275 5535 4635
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
5400 4410 5445 4500 5355 4500 5400 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4410 5400 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5345 4410 5455 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4455 5490 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4410 5535 4455 5490 4455
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
5535 4500 5535 4545 5490 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4545 5490 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4635 5400 4500
|
||||
-6
|
||||
6 7110 3915 7335 4275
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7200 4050 7245 4140 7155 4140 7200 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 4050 7200 3915
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7145 4050 7255 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 4095 7290 4050
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 4050 7335 4095 7290 4095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7335 4140 7335 4185 7290 4185
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 4185 7290 4140
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7200 4275 7200 4140
|
||||
-6
|
||||
6 5355 3105 5445 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 3150 30 30 5400 3150 5400 3180
|
||||
-6
|
||||
6 6255 3105 6345 3195
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 3150 30 30 6300 3150 6300 3180
|
||||
-6
|
||||
6 6255 4905 6345 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 6300 4950 30 30 6300 4950 6300 4980
|
||||
-6
|
||||
6 5355 4905 5445 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4950 30 30 5400 4950 5400 4980
|
||||
-6
|
||||
6 4455 4905 4545 4995
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 4500 4950 30 30 4500 4950 4500 4980
|
||||
-6
|
||||
6 5355 4005 5445 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5400 4050 30 30 5400 4050 5400 4080
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4230 3150 5400 3150 5400 3420
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3420 4500 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4050 5400 4050 5400 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 3735 4500 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3870 3150 3600 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3825 4050 3600 4050
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3825 4950 3600 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4050 4500 4320
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
4500 4590 4500 4950
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 4365 5400 4005
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4275 4950 5400 4950 5400 4590
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5400 3150 6300 3150 6300 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6255 3150 7200 3150 7200 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
5355 4950 6300 4950 6300 4230
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6300 4950 7200 4950 7200 4185
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
1575 2475 3600 2475 3600 5625 1575 5625 1575 2475
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 3645 LED2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 3645 LED1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 4725 4545 LED3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 5625 4545 LED4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 7425 4140 LED6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 480 6525 4140 LED5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 3825 3915 120R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 3825 4815 120R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 3825 3015 120R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 3240 3195 D9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 3195 4095 D10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 3195 4995 D11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 2205 4185 Uno\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 675 2070 3915 Arduino\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1605 4590 5355 6 x 3mm Red LED's\001
|
||||
|
Before Width: | Height: | Size: 8.7 KiB |
@@ -1,36 +0,0 @@
|
||||
/* This example is placed into the public domain */
|
||||
|
||||
#include <Charlieplex.h>
|
||||
|
||||
byte pins[3] = {9, 10, 11};
|
||||
Charlieplex charlie(pins, sizeof(pins));
|
||||
|
||||
int previous = 1;
|
||||
int current = 0;
|
||||
int step = 1;
|
||||
unsigned long lastTime;
|
||||
|
||||
void setup() {
|
||||
lastTime = millis();
|
||||
charlie.setLed(current, true);
|
||||
charlie.setPwmLed(previous, 64);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if ((millis() - lastTime) >= 100) {
|
||||
charlie.setLed(previous, false);
|
||||
charlie.setPwmLed(current, 64);
|
||||
previous = current;
|
||||
current += step;
|
||||
if (current < 0) {
|
||||
current = 1;
|
||||
step = 1;
|
||||
} else if (current >= charlie.count()) {
|
||||
current = charlie.count() - 2;
|
||||
step = -1;
|
||||
}
|
||||
charlie.setLed(current, true);
|
||||
lastTime += 100;
|
||||
}
|
||||
charlie.loop();
|
||||
}
|
||||
@@ -1,238 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 5175 1530 7200 2475
|
||||
6 5535 1755 5985 1845
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 1800 5535 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 1800 5868 1760 5814 1840 5760 1760 5706 1840 5652 1760
|
||||
5625 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 5890 1800
|
||||
-6
|
||||
6 6345 1665 6705 1890
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 1800 6480 1755 6480 1845 6570 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1800 6705 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1855 6570 1745
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 1665 6570 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 1665 6525 1665 6525 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 1665 6435 1665 6435 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 1665 6480 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 1800 6480 1800
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 1800 5175 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 6390 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 1800 7200 1800 7200 2475
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 1665 220R\001
|
||||
-6
|
||||
6 5175 2205 7200 3150
|
||||
6 5535 2430 5985 2520
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 2475 5535 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 2475 5868 2435 5814 2515 5760 2435 5706 2515 5652 2435
|
||||
5625 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 5890 2475
|
||||
-6
|
||||
6 6345 2340 6705 2565
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 2475 6480 2430 6480 2520 6570 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2475 6705 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2530 6570 2420
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 2340 6570 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 2340 6525 2340 6525 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 2340 6435 2340 6435 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 2340 6480 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 2475 6480 2475
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 2475 5175 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 6390 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 2475 7200 2475 7200 3150
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 2340 220R\001
|
||||
-6
|
||||
6 5175 2880 7200 3825
|
||||
6 5535 3105 5985 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3150 5535 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3150 5868 3110 5814 3190 5760 3110 5706 3190 5652 3110
|
||||
5625 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 5890 3150
|
||||
-6
|
||||
6 6345 3015 6705 3240
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3150 6480 3105 6480 3195 6570 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3150 6705 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3205 6570 3095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3015 6570 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3015 6525 3015 6525 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3015 6435 3015 6435 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3015 6480 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3150 6480 3150
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3150 5175 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 6390 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3150 7200 3150 7200 3825
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3015 220R\001
|
||||
-6
|
||||
6 5175 3555 7200 4500
|
||||
6 5535 3780 5985 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3825 5535 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3825 5868 3785 5814 3865 5760 3785 5706 3865 5652 3785
|
||||
5625 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 5890 3825
|
||||
-6
|
||||
6 6345 3690 6705 3915
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3825 6480 3780 6480 3870 6570 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3825 6705 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3880 6570 3770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3690 6570 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3690 6525 3690 6525 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3690 6435 3690 6435 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3690 6480 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3825 6480 3825
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3825 5175 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 6390 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3825 7200 3825 7200 4500
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3690 220R\001
|
||||
-6
|
||||
6 5175 4230 7200 5175
|
||||
6 5535 4455 5985 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 4500 5535 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 4500 5868 4460 5814 4540 5760 4460 5706 4540 5652 4460
|
||||
5625 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 5890 4500
|
||||
-6
|
||||
6 6345 4365 6705 4590
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 4500 6480 4455 6480 4545 6570 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4500 6705 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4555 6570 4445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 4365 6570 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 4365 6525 4365 6525 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 4365 6435 4365 6435 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4365 6480 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 4500 6480 4500
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4500 5175 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 6390 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 4500 7200 4500 7200 5175
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 4365 220R\001
|
||||
-6
|
||||
6 5175 4905 7200 5850
|
||||
6 5535 5130 5985 5220
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 5175 5535 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 5175 5868 5135 5814 5215 5760 5135 5706 5215 5652 5135
|
||||
5625 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 5890 5175
|
||||
-6
|
||||
6 6345 5040 6705 5265
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 5175 6480 5130 6480 5220 6570 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5175 6705 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5230 6570 5120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 5040 6570 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 5040 6525 5040 6525 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 5040 6435 5040 6435 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5040 6480 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 5175 6480 5175
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5175 5175 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 6390 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 5175 7200 5175 7200 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 5040 220R\001
|
||||
-6
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
2700 1350 5175 1350 5175 6300 2700 6300 2700 1350
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5850 5175 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 2565 DOUT5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1065 2880 3870 Arduino Uno\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 1845 DOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3195 DOUT6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3870 DOUT9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 4545 DOUT10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 5220 DOUT11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 4500 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1560 7470 3510 6 x 3mm RED LED\001
|
||||
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create the "Cylon Eyes" effect from
|
||||
Battlestar Galactica. It uses the ChaseLEDs utility class.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
byte pins[] = {3, 5, 6, 9, 10, 11, 10, 9, 6, 5};
|
||||
ChaseLEDs cylonEyes(pins, sizeof(pins), 100);
|
||||
|
||||
void setup() {}
|
||||
|
||||
void loop() {
|
||||
cylonEyes.loop();
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create the "Cylon Eyes" effect from
|
||||
Battlestar Galactica. It uses the ChaseLEDs utility class.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
class CylonChase : public ChaseLEDs
|
||||
{
|
||||
public:
|
||||
CylonChase(const byte *pins, int num, unsigned long advanceTime)
|
||||
: ChaseLEDs(pins, num, advanceTime) {}
|
||||
|
||||
protected:
|
||||
void advance(byte prevPin, byte nextPin) {
|
||||
digitalWrite(previousPin(2), LOW);
|
||||
digitalWrite(prevPin, HIGH);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
}
|
||||
};
|
||||
|
||||
byte pins[] = {3, 5, 6, 9, 10, 11, 10, 9, 6, 5};
|
||||
CylonChase cylonEyes(pins, sizeof(pins), 100);
|
||||
|
||||
void setup() {}
|
||||
|
||||
void loop() {
|
||||
cylonEyes.loop();
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create the "Cylon Eyes" effect from
|
||||
Battlestar Galactica. It uses the ChaseLEDs utility class.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
class CylonChase : public ChaseLEDs
|
||||
{
|
||||
public:
|
||||
CylonChase(const byte *pins, int num, unsigned long advanceTime)
|
||||
: ChaseLEDs(pins, num, advanceTime) {}
|
||||
|
||||
protected:
|
||||
void advance(byte prevPin, byte nextPin) {
|
||||
digitalWrite(previousPin(2), LOW);
|
||||
analogWrite(prevPin, 32);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
}
|
||||
};
|
||||
|
||||
byte pins[] = {3, 5, 6, 9, 10, 11, 10, 9, 6, 5};
|
||||
CylonChase cylonEyes(pins, sizeof(pins), 100);
|
||||
|
||||
void setup() {}
|
||||
|
||||
void loop() {
|
||||
cylonEyes.loop();
|
||||
}
|
||||
|
||||
@@ -1,261 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 5175 1530 7200 2475
|
||||
6 5535 1755 5985 1845
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 1800 5535 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 1800 5868 1760 5814 1840 5760 1760 5706 1840 5652 1760
|
||||
5625 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 5890 1800
|
||||
-6
|
||||
6 6345 1665 6705 1890
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 1800 6480 1755 6480 1845 6570 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1800 6705 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1855 6570 1745
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 1665 6570 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 1665 6525 1665 6525 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 1665 6435 1665 6435 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 1665 6480 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 1800 6480 1800
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 1800 5175 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 6390 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 1800 7200 1800 7200 2475
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 1665 220R\001
|
||||
-6
|
||||
6 5175 2205 7200 3150
|
||||
6 5535 2430 5985 2520
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 2475 5535 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 2475 5868 2435 5814 2515 5760 2435 5706 2515 5652 2435
|
||||
5625 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 5890 2475
|
||||
-6
|
||||
6 6345 2340 6705 2565
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 2475 6480 2430 6480 2520 6570 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2475 6705 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2530 6570 2420
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 2340 6570 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 2340 6525 2340 6525 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 2340 6435 2340 6435 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 2340 6480 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 2475 6480 2475
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 2475 5175 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 6390 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 2475 7200 2475 7200 3150
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 2340 220R\001
|
||||
-6
|
||||
6 5175 2880 7200 3825
|
||||
6 5535 3105 5985 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3150 5535 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3150 5868 3110 5814 3190 5760 3110 5706 3190 5652 3110
|
||||
5625 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 5890 3150
|
||||
-6
|
||||
6 6345 3015 6705 3240
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3150 6480 3105 6480 3195 6570 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3150 6705 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3205 6570 3095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3015 6570 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3015 6525 3015 6525 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3015 6435 3015 6435 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3015 6480 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3150 6480 3150
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3150 5175 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 6390 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3150 7200 3150 7200 3825
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3015 220R\001
|
||||
-6
|
||||
6 5175 3555 7200 4500
|
||||
6 5535 3780 5985 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3825 5535 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3825 5868 3785 5814 3865 5760 3785 5706 3865 5652 3785
|
||||
5625 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 5890 3825
|
||||
-6
|
||||
6 6345 3690 6705 3915
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3825 6480 3780 6480 3870 6570 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3825 6705 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3880 6570 3770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3690 6570 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3690 6525 3690 6525 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3690 6435 3690 6435 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3690 6480 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3825 6480 3825
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3825 5175 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 6390 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3825 7200 3825 7200 4500
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3690 220R\001
|
||||
-6
|
||||
6 5175 4230 7200 5175
|
||||
6 5535 4455 5985 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 4500 5535 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 4500 5868 4460 5814 4540 5760 4460 5706 4540 5652 4460
|
||||
5625 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 5890 4500
|
||||
-6
|
||||
6 6345 4365 6705 4590
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 4500 6480 4455 6480 4545 6570 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4500 6705 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4555 6570 4445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 4365 6570 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 4365 6525 4365 6525 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 4365 6435 4365 6435 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4365 6480 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 4500 6480 4500
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4500 5175 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 6390 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 4500 7200 4500 7200 5175
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 4365 220R\001
|
||||
-6
|
||||
6 5175 4905 7200 5850
|
||||
6 5535 5130 5985 5220
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 5175 5535 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 5175 5868 5135 5814 5215 5760 5135 5706 5215 5652 5135
|
||||
5625 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 5890 5175
|
||||
-6
|
||||
6 6345 5040 6705 5265
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 5175 6480 5130 6480 5220 6570 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5175 6705 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5230 6570 5120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 5040 6570 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 5040 6525 5040 6525 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 5040 6435 5040 6435 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5040 6480 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 5175 6480 5175
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5175 5175 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 6390 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 5175 7200 5175 7200 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 5040 220R\001
|
||||
-6
|
||||
6 1305 3375 1530 3825
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
1395 3600 1465 3565 1465 3635 1395 3600
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1350 3730 1350 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
1350 3465 1390 3492 1310 3546 1390 3600 1310 3654 1390 3708
|
||||
1350 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1350 3375 1350 3470
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1530 3600 1440 3600
|
||||
-6
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
2700 1350 5175 1350 5175 6300 2700 6300 2700 1350
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5850 5175 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
1485 3600 2700 3600
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
1350 3375 1350 1800 2700 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
1350 3780 1350 5850 2700 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 2565 DOUT5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 1845 DOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3195 DOUT6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3870 DOUT9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 4545 DOUT10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 5220 DOUT11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 4500 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1560 7470 3510 6 x 3mm RED LED\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1065 3285 2880 Arduino Uno\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 435 2835 3645 AIN0\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 2835 1845 5V\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 2790 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 810 3645 10K\001
|
||||
@@ -1,238 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 5175 1530 7200 2475
|
||||
6 5535 1755 5985 1845
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 1800 5535 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 1800 5868 1760 5814 1840 5760 1760 5706 1840 5652 1760
|
||||
5625 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 5890 1800
|
||||
-6
|
||||
6 6345 1665 6705 1890
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 1800 6480 1755 6480 1845 6570 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1800 6705 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 1855 6570 1745
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 1665 6570 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 1665 6525 1665 6525 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 1665 6435 1665 6435 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 1665 6480 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 1800 6480 1800
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 1800 5175 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 1800 6390 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 1800 7200 1800 7200 2475
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 1665 220R\001
|
||||
-6
|
||||
6 5175 2205 7200 3150
|
||||
6 5535 2430 5985 2520
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 2475 5535 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 2475 5868 2435 5814 2515 5760 2435 5706 2515 5652 2435
|
||||
5625 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 5890 2475
|
||||
-6
|
||||
6 6345 2340 6705 2565
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 2475 6480 2430 6480 2520 6570 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2475 6705 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 2530 6570 2420
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 2340 6570 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 2340 6525 2340 6525 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 2340 6435 2340 6435 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 2340 6480 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 2475 6480 2475
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 2475 5175 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 2475 6390 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 2475 7200 2475 7200 3150
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 2340 220R\001
|
||||
-6
|
||||
6 5175 2880 7200 3825
|
||||
6 5535 3105 5985 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3150 5535 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3150 5868 3110 5814 3190 5760 3110 5706 3190 5652 3110
|
||||
5625 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 5890 3150
|
||||
-6
|
||||
6 6345 3015 6705 3240
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3150 6480 3105 6480 3195 6570 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3150 6705 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3205 6570 3095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3015 6570 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3015 6525 3015 6525 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3015 6435 3015 6435 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3015 6480 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3150 6480 3150
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3150 5175 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3150 6390 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3150 7200 3150 7200 3825
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3015 220R\001
|
||||
-6
|
||||
6 5175 3555 7200 4500
|
||||
6 5535 3780 5985 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 3825 5535 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 3825 5868 3785 5814 3865 5760 3785 5706 3865 5652 3785
|
||||
5625 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 5890 3825
|
||||
-6
|
||||
6 6345 3690 6705 3915
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 3825 6480 3780 6480 3870 6570 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3825 6705 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 3880 6570 3770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 3690 6570 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 3690 6525 3690 6525 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 3690 6435 3690 6435 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3690 6480 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 3825 6480 3825
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3825 5175 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 3825 6390 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 3825 7200 3825 7200 4500
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 3690 220R\001
|
||||
-6
|
||||
6 5175 4230 7200 5175
|
||||
6 5535 4455 5985 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 4500 5535 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 4500 5868 4460 5814 4540 5760 4460 5706 4540 5652 4460
|
||||
5625 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 5890 4500
|
||||
-6
|
||||
6 6345 4365 6705 4590
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 4500 6480 4455 6480 4545 6570 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4500 6705 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 4555 6570 4445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 4365 6570 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 4365 6525 4365 6525 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 4365 6435 4365 6435 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4365 6480 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 4500 6480 4500
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 4500 5175 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 4500 6390 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 4500 7200 4500 7200 5175
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 4365 220R\001
|
||||
-6
|
||||
6 5175 4905 7200 5850
|
||||
6 5535 5130 5985 5220
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5630 5175 5535 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
5895 5175 5868 5135 5814 5215 5760 5135 5706 5215 5652 5135
|
||||
5625 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 5890 5175
|
||||
-6
|
||||
6 6345 5040 6705 5265
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
6570 5175 6480 5130 6480 5220 6570 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5175 6705 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6570 5230 6570 5120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6525 5040 6570 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6570 5040 6525 5040 6525 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
6480 5040 6435 5040 6435 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5040 6480 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6345 5175 6480 5175
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5535 5175 5175 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5985 5175 6390 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
6660 5175 7200 5175 7200 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 5535 5040 220R\001
|
||||
-6
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
2700 1350 5175 1350 5175 6300 2700 6300 2700 1350
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
7200 5850 5175 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 2565 DOUT5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1065 2880 3870 Arduino Uno\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 1845 DOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3195 DOUT6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 4275 3870 DOUT9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 4545 DOUT10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 4275 5220 DOUT11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 4500 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1560 7470 3510 6 x 3mm RED LED\001
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create the "Cylon Eyes" effect from
|
||||
Battlestar Galactica. It uses the ChaseLEDs utility class.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
class CylonChase : public ChaseLEDs
|
||||
{
|
||||
public:
|
||||
CylonChase(const byte *pins, int num, unsigned long advanceTime)
|
||||
: ChaseLEDs(pins, num, advanceTime) {}
|
||||
|
||||
protected:
|
||||
void advance(byte prevPin, byte nextPin) {
|
||||
digitalWrite(previousPin(2), LOW);
|
||||
analogWrite(prevPin, 32);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
setAdvanceTime(map(analogRead(A0), 0, 1023, 25, 250));
|
||||
}
|
||||
};
|
||||
|
||||
byte pins[] = {3, 5, 6, 9, 10, 11, 10, 9, 6, 5};
|
||||
CylonChase cylonEyes(pins, sizeof(pins), 100);
|
||||
|
||||
void setup() {}
|
||||
|
||||
void loop() {
|
||||
cylonEyes.loop();
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB |
@@ -1,338 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 6075 1530 8100 2475
|
||||
6 6435 1755 6885 1845
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 1800 6435 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 1800 6768 1760 6714 1840 6660 1760 6606 1840 6552 1760
|
||||
6525 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 1800 6790 1800
|
||||
-6
|
||||
6 7245 1665 7605 1890
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 1800 7380 1755 7380 1845 7470 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 1800 7605 1800
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 1855 7470 1745
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 1665 7470 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 1665 7425 1665 7425 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 1665 7335 1665 7335 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 1665 7380 1710
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 1800 7380 1800
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 1800 6075 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 1800 7290 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 1800 8100 1800 8100 2475
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 1665 220R\001
|
||||
-6
|
||||
6 6075 2205 8100 3150
|
||||
6 6435 2430 6885 2520
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 2475 6435 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 2475 6768 2435 6714 2515 6660 2435 6606 2515 6552 2435
|
||||
6525 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 2475 6790 2475
|
||||
-6
|
||||
6 7245 2340 7605 2565
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 2475 7380 2430 7380 2520 7470 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 2475 7605 2475
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 2530 7470 2420
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 2340 7470 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 2340 7425 2340 7425 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 2340 7335 2340 7335 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 2340 7380 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 2475 7380 2475
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 2475 6075 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 2475 7290 2475
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 2475 8100 2475 8100 3150
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 2340 220R\001
|
||||
-6
|
||||
6 6075 2880 8100 3825
|
||||
6 6435 3105 6885 3195
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 3150 6435 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 3150 6768 3110 6714 3190 6660 3110 6606 3190 6552 3110
|
||||
6525 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 3150 6790 3150
|
||||
-6
|
||||
6 7245 3015 7605 3240
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 3150 7380 3105 7380 3195 7470 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 3150 7605 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 3205 7470 3095
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 3015 7470 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 3015 7425 3015 7425 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 3015 7335 3015 7335 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 3015 7380 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 3150 7380 3150
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3150 6075 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 3150 7290 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 3150 8100 3150 8100 3825
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 3015 220R\001
|
||||
-6
|
||||
6 6075 3555 8100 4500
|
||||
6 6435 3780 6885 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 3825 6435 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 3825 6768 3785 6714 3865 6660 3785 6606 3865 6552 3785
|
||||
6525 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 3825 6790 3825
|
||||
-6
|
||||
6 7245 3690 7605 3915
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 3825 7380 3780 7380 3870 7470 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 3825 7605 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 3880 7470 3770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 3690 7470 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 3690 7425 3690 7425 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 3690 7335 3690 7335 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 3690 7380 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 3825 7380 3825
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 3825 6075 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 3825 7290 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 3825 8100 3825 8100 4500
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 3690 220R\001
|
||||
-6
|
||||
6 6075 4230 8100 5175
|
||||
6 6435 4455 6885 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 4500 6435 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 4500 6768 4460 6714 4540 6660 4460 6606 4540 6552 4460
|
||||
6525 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4500 6790 4500
|
||||
-6
|
||||
6 7245 4365 7605 4590
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 4500 7380 4455 7380 4545 7470 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 4500 7605 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 4555 7470 4445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 4365 7470 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 4365 7425 4365 7425 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 4365 7335 4365 7335 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 4365 7380 4410
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 4500 7380 4500
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 4500 6075 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 4500 7290 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 4500 8100 4500 8100 5175
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 4365 220R\001
|
||||
-6
|
||||
6 6075 4905 8100 5850
|
||||
6 6435 5130 6885 5220
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6530 5175 6435 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
6795 5175 6768 5135 6714 5215 6660 5135 6606 5215 6552 5135
|
||||
6525 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
6885 5175 6790 5175
|
||||
-6
|
||||
6 7245 5040 7605 5265
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
7470 5175 7380 5130 7380 5220 7470 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 5175 7605 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7470 5230 7470 5120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7425 5040 7470 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7470 5040 7425 5040 7425 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
7380 5040 7335 5040 7335 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7335 5040 7380 5085
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
7245 5175 7380 5175
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6435 5175 6075 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
6885 5175 7290 5175
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
7560 5175 8100 5175 8100 5850
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 6435 5040 220R\001
|
||||
-6
|
||||
6 1530 2700 1755 3150
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
1620 2925 1690 2890 1690 2960 1620 2925
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1575 3055 1575 3150
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
1575 2790 1615 2817 1535 2871 1615 2925 1535 2979 1615 3033
|
||||
1575 3060
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1575 2700 1575 2795
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
1755 2925 1665 2925
|
||||
-6
|
||||
6 1575 3465 3600 3915
|
||||
6 2565 3780 3015 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2660 3825 2565 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2925 3825 2898 3785 2844 3865 2790 3785 2736 3865 2682 3785
|
||||
2655 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3015 3825 2920 3825
|
||||
-6
|
||||
6 1890 3690 2250 3915
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2025 3825 2115 3780 2115 3870 2025 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2025 3825 1890 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2025 3880 2025 3770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2070 3690 2025 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2025 3690 2070 3690 2070 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2115 3690 2160 3690 2160 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2160 3690 2115 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2250 3825 2115 3825
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2970 3825 3600 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2160 3825 2610 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
1935 3825 1575 3825
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 2610 3600 220R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 390 1935 3600 RED\001
|
||||
-6
|
||||
6 2565 4680 3015 4770
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2660 4725 2565 4725
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
2925 4725 2898 4685 2844 4765 2790 4685 2736 4765 2682 4685
|
||||
2655 4725
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3015 4725 2920 4725
|
||||
-6
|
||||
6 1890 4590 2250 4815
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
2025 4725 2115 4680 2115 4770 2025 4725
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2025 4725 1890 4725
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2025 4780 2025 4670
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2070 4590 2025 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2025 4590 2070 4590 2070 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
2115 4590 2160 4590 2160 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2160 4590 2115 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
2250 4725 2115 4725
|
||||
-6
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
3600 1350 6075 1350 6075 6300 3600 6300 3600 1350
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
8100 5850 6075 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
1575 2700 1575 1800 3600 1800
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
1575 3150 1575 5850 3600 5850
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
1755 2925 3600 2925
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2970 4725 3600 4725
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
2160 4725 2610 4725
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
1935 4725 1575 4725
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 5175 2565 DOUT5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 5175 1845 DOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 5175 3195 DOUT6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 5175 3870 DOUT9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 5175 4545 DOUT10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 5175 5220 DOUT11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 5400 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 3735 1845 5V\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 405 3690 5895 GND\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1065 4230 1215 Arduino Uno\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 435 3735 3015 AIN0\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 1080 3015 10K\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 450 2610 4500 100R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 615 1800 4500 WHITE\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 3690 4770 AOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 3690 3870 AOUT2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 1110 8370 3510 6 x RED LED\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 690 8505 4050 Nacelles\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 180 915 495 3870 Navigation\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 525 675 4770 Strobe\001
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create Star Trek Enterprise style
|
||||
running lights and LED chasers.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <BlinkLED.h>
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
#define NACELLE_RATE A0 // Analog input for reading the nacelle chase rate
|
||||
#define NAV_LIGHTS A2 // Output pin for controlling the navigation lights
|
||||
#define STROBE_LIGHT A3 // Output pin for controlling the strobe
|
||||
|
||||
// Configurable parameters.
|
||||
#define NAV_LIGHTS_ON 1000 // Time the navigation lights are on (milliseconds)
|
||||
#define NAV_LIGHTS_OFF 1000 // Time the navigation lights are off (milliseconds)
|
||||
#define STROBE_LIGHT_ON 70 // Time the strobe light is on (milliseconds)
|
||||
#define STROBE_LIGHT_OFF 830 // Time the strobe light is off (milliseconds)
|
||||
#define NACELLE_CHASE_LEN 6 // Length of nacelle chase, 1..6
|
||||
#define NACELLE_MIN_PERIOD 25 // Minimum time to advance the nacelle chase (milliseconds)
|
||||
#define NACELLE_MAX_PERIOD 250 // Maximum time to advance the nacelle chase (milliseconds)
|
||||
#define NACELLE_DIM_VALUE 32 // Value for dimming previous LED in chase, 0..255
|
||||
|
||||
// Output pins to use for the nacelle chase
|
||||
byte nacelleChasePins[6] = {3, 5, 6, 9, 10, 11};
|
||||
|
||||
class NacelleChaseLEDs : public ChaseLEDs
|
||||
{
|
||||
public:
|
||||
NacelleChaseLEDs(const byte *pins, int num)
|
||||
: ChaseLEDs(pins, num, 0) {}
|
||||
|
||||
protected:
|
||||
void advance(byte prevPin, byte nextPin) {
|
||||
digitalWrite(previousPin(2), LOW);
|
||||
analogWrite(prevPin, NACELLE_DIM_VALUE);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
setAdvanceTime(map(analogRead(NACELLE_RATE), 0, 1023, NACELLE_MIN_PERIOD, NACELLE_MAX_PERIOD));
|
||||
}
|
||||
};
|
||||
|
||||
NacelleChaseLEDs nacelleChase(nacelleChasePins, NACELLE_CHASE_LEN);
|
||||
|
||||
BlinkLED navLights(NAV_LIGHTS, NAV_LIGHTS_ON, NAV_LIGHTS_OFF);
|
||||
BlinkLED strobeLight(STROBE_LIGHT, STROBE_LIGHT_ON, STROBE_LIGHT_OFF);
|
||||
|
||||
void setup() {
|
||||
// Turn off the status LED on the Arduino board (we don't need it).
|
||||
pinMode(13, OUTPUT);
|
||||
digitalWrite(13, LOW);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
navLights.loop();
|
||||
strobeLight.loop();
|
||||
nacelleChase.loop();
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 1019 KiB |
|
Before Width: | Height: | Size: 474 KiB |
@@ -1,292 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 10260 2025 10485 2385
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
10350 2250 10395 2160 10305 2160 10350 2250
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 2250 10350 2385
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10295 2250 10405 2250
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10485 2205 10440 2250
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10485 2250 10485 2205 10440 2205
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10485 2160 10485 2115 10440 2115
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10485 2115 10440 2160
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 2025 10350 2160
|
||||
-6
|
||||
6 10260 3600 10485 3960
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
10350 3825 10395 3735 10305 3735 10350 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 3825 10350 3960
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10295 3825 10405 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10485 3780 10440 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10485 3825 10485 3780 10440 3780
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
10485 3735 10485 3690 10440 3690
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10485 3690 10440 3735
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 3600 10350 3735
|
||||
-6
|
||||
6 9585 2475 9810 2835
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
9675 2700 9720 2610 9630 2610 9675 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 2700 9675 2835
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9620 2700 9730 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9810 2655 9765 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9810 2700 9810 2655 9765 2655
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9810 2610 9810 2565 9765 2565
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9810 2565 9765 2610
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 2475 9675 2610
|
||||
-6
|
||||
6 10935 2475 11160 2835
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
11025 2700 11070 2610 10980 2610 11025 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 2700 11025 2835
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10970 2700 11080 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11160 2655 11115 2700
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
11160 2700 11160 2655 11115 2655
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
11160 2610 11160 2565 11115 2565
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11160 2565 11115 2610
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 2475 11025 2610
|
||||
-6
|
||||
6 10935 3150 11160 3510
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
11025 3375 11070 3285 10980 3285 11025 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 3375 11025 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10970 3375 11080 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11160 3330 11115 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
11160 3375 11160 3330 11115 3330
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
11160 3285 11160 3240 11115 3240
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11160 3240 11115 3285
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 3150 11025 3285
|
||||
-6
|
||||
6 9585 3150 9810 3510
|
||||
2 1 0 1 0 -1 0 0 20 0.000 0 0 -1 0 0 4
|
||||
9675 3375 9720 3285 9630 3285 9675 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 3375 9675 3510
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9620 3375 9730 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9810 3330 9765 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9810 3375 9810 3330 9765 3330
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 3
|
||||
9810 3285 9810 3240 9765 3240
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9810 3240 9765 3285
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 3150 9675 3285
|
||||
-6
|
||||
6 10305 3915 10395 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 4270 10350 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
10350 4005 10310 4032 10390 4086 10310 4140 10390 4194 10310 4248
|
||||
10350 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 3915 10350 4010
|
||||
-6
|
||||
6 9630 3915 9720 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 4270 9675 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
9675 4005 9635 4032 9715 4086 9635 4140 9715 4194 9635 4248
|
||||
9675 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 3915 9675 4010
|
||||
-6
|
||||
6 10980 3915 11070 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 4270 11025 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
11025 4005 10985 4032 11065 4086 10985 4140 11065 4194 10985 4248
|
||||
11025 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 3915 11025 4010
|
||||
-6
|
||||
6 9450 4365 9675 4635
|
||||
2 3 0 1 0 -1 0 0 20 0.000 0 0 0 0 0 4
|
||||
9627 4584 9597 4519 9562 4554 9627 4584
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9540 4500 9675 4635
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9540 4500 9675 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9540 4410 9540 4590
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9540 4500 9450 4500
|
||||
-6
|
||||
6 10305 1710 10620 2025
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 45.00 90.00
|
||||
10350 2025 10350 1710
|
||||
4 0 0 0 0 16 6 0.0000 4 75 225 10395 1845 VCC\001
|
||||
-6
|
||||
6 9585 4635 9765 4905
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9660 4905 9690 4905
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9625 4860 9725 4860
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9585 4815 9765 4815
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9675 4635 9675 4815
|
||||
-6
|
||||
6 10125 5175 10350 5445
|
||||
2 3 0 1 0 -1 0 0 20 0.000 0 0 0 0 0 4
|
||||
10302 5394 10272 5329 10237 5364 10302 5394
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10215 5310 10350 5445
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10215 5310 10350 5175
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10215 5220 10215 5400
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10215 5310 10125 5310
|
||||
-6
|
||||
6 10260 5445 10440 5715
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10335 5715 10365 5715
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10300 5670 10400 5670
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10260 5625 10440 5625
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10350 5445 10350 5625
|
||||
-6
|
||||
6 8550 5265 9000 5355
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8645 5310 8550 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
8910 5310 8883 5270 8829 5350 8775 5270 8721 5350 8667 5270
|
||||
8640 5310
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9000 5310 8905 5310
|
||||
-6
|
||||
6 8550 4455 9000 4545
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8645 4500 8550 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
8910 4500 8883 4460 8829 4540 8775 4460 8721 4540 8667 4460
|
||||
8640 4500
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9000 4500 8905 4500
|
||||
-6
|
||||
6 10800 5985 11025 6255
|
||||
2 3 0 1 0 -1 0 0 20 0.000 0 0 0 0 0 4
|
||||
10977 6204 10947 6139 10912 6174 10977 6204
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10890 6120 11025 6255
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10890 6120 11025 5985
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10890 6030 10890 6210
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10890 6120 10800 6120
|
||||
-6
|
||||
6 8550 6075 9000 6165
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
8645 6120 8550 6120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 7
|
||||
8910 6120 8883 6080 8829 6160 8775 6080 8721 6160 8667 6080
|
||||
8640 6120
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
9000 6120 8905 6120
|
||||
-6
|
||||
6 10935 6255 11115 6525
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11010 6525 11040 6525
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10975 6480 11075 6480
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
10935 6435 11115 6435
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
11025 6255 11025 6435
|
||||
-6
|
||||
1 4 1 1 0 7 50 -1 -1 4.000 1 0.0000 10350 2970 945 945 9405 2970 11295 2970
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
10350 2340 10350 3690
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
9675 2835 10215 2835 10215 3150 10260 3150 10305 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
10395 3150 11025 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
11025 2835 10665 2835 10665 3105
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
10665 3195 10665 3375 10395 3375
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
|
||||
10305 3375 9990 3375 9990 3150 9675 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
9675 3915 9675 3465
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
11025 3465 11025 3960
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
10350 4365 10350 5220
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
11025 4320 11025 5985
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
|
||||
9675 2520 9675 2025 11025 2025 11025 2565
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
9495 4500 8955 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
10125 5310 9000 5310
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
8550 4500 7875 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
8550 5310 7875 5310
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
10845 6120 8955 6120 9000 6120
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
8595 6120 7875 6120
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 8595 4365 10K\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 8595 5130 10K\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 345 8595 5940 10K\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 7110 4590 DOUT3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 7110 5355 DOUT5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 630 7110 6165 DOUT6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 135 9810 4230 R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 135 10485 4230 R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 135 11160 4230 R\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 2190 6930 3510 R = 120 ohms for Vcc = 5V\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 2220 6930 3780 R = 1K ohms for Vcc = 12V\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 9720 4590 BC548\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 10395 5400 BC548\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 585 11070 6210 BC548\001
|
||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
Sketch that manipulates Arduino outputs to create Star Trek Enterprise style
|
||||
running lights and LED chasers.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <BlinkLED.h>
|
||||
#include <ChaseLEDs.h>
|
||||
|
||||
#define NACELLE_RATE A0 // Analog input for reading the nacelle chase rate
|
||||
#define NAV_LIGHTS A2 // Output pin for controlling the navigation lights
|
||||
#define STROBE_LIGHT A3 // Output pin for controlling the strobe
|
||||
|
||||
// Configurable parameters.
|
||||
#define NAV_LIGHTS_ON 1000 // Time the navigation lights are on (milliseconds)
|
||||
#define NAV_LIGHTS_OFF 1000 // Time the navigation lights are off (milliseconds)
|
||||
#define STROBE_LIGHT_ON 70 // Time the strobe light is on (milliseconds)
|
||||
#define STROBE_LIGHT_OFF 830 // Time the strobe light is off (milliseconds)
|
||||
#define NACELLE_CHASE_LEN 6 // Length of nacelle chase, 1..6
|
||||
#define NACELLE_MIN_PERIOD 25 // Minimum time to advance the nacelle chase (milliseconds)
|
||||
#define NACELLE_MAX_PERIOD 250 // Maximum time to advance the nacelle chase (milliseconds)
|
||||
#define NACELLE_DIM_VALUE 32 // Value for dimming previous LED in chase, 0..255
|
||||
|
||||
// Output pins to use for the nacelle chase
|
||||
byte nacelleChasePins[6] = {3, 5, 6, 9, 10, 11};
|
||||
|
||||
class NacelleChaseLEDs : public ChaseLEDs
|
||||
{
|
||||
public:
|
||||
NacelleChaseLEDs(const byte *pins, int num)
|
||||
: ChaseLEDs(pins, num, 0) {}
|
||||
|
||||
protected:
|
||||
void advance(byte prevPin, byte nextPin) {
|
||||
digitalWrite(previousPin(5), LOW);
|
||||
analogWrite(previousPin(4), NACELLE_DIM_VALUE);
|
||||
digitalWrite(previousPin(3), HIGH);
|
||||
digitalWrite(previousPin(2), LOW);
|
||||
analogWrite(prevPin, NACELLE_DIM_VALUE);
|
||||
digitalWrite(nextPin, HIGH);
|
||||
setAdvanceTime(map(analogRead(NACELLE_RATE), 0, 1023, NACELLE_MIN_PERIOD, NACELLE_MAX_PERIOD));
|
||||
}
|
||||
};
|
||||
|
||||
NacelleChaseLEDs nacelleChase(nacelleChasePins, NACELLE_CHASE_LEN);
|
||||
|
||||
BlinkLED navLights(NAV_LIGHTS, NAV_LIGHTS_ON, NAV_LIGHTS_OFF);
|
||||
BlinkLED strobeLight(STROBE_LIGHT, STROBE_LIGHT_ON, STROBE_LIGHT_OFF);
|
||||
|
||||
void setup() {
|
||||
// Turn off the status LED on the Arduino board (we don't need it).
|
||||
pinMode(13, OUTPUT);
|
||||
digitalWrite(13, LOW);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
navLights.loop();
|
||||
strobeLight.loop();
|
||||
nacelleChase.loop();
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
BlinkLED KEYWORD1
|
||||
Charlieplex KEYWORD1
|
||||
ChaseLEDs KEYWORD1
|
||||
|
||||
onTime KEYWORD2
|
||||
offTime KEYWORD2
|
||||
setBlinkRate KEYWORD2
|
||||
|
||||
state KEYWORD2
|
||||
setState KEYWORD2
|
||||
|
||||
pause KEYWORD2
|
||||
resume KEYWORD2
|
||||
isPaused KEYWORD2
|
||||
|
||||
advanceTime KEYWORD2
|
||||
setAdvanceTime KEYWORD2
|
||||
previousPin KEYWORD2
|
||||
|
||||
count KEYWORD2
|
||||
led KEYWORD2
|
||||
setLed KEYWORD2
|
||||
pwmLed KEYWORD2
|
||||
setPwmLed KEYWORD2
|
||||
holdTime KEYWORD2
|
||||
setHoldTime KEYWORD2
|
||||
refresh KEYWORD2
|
||||
@@ -1,966 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "Bitmap.h"
|
||||
#include <WString.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* \class Bitmap Bitmap.h <Bitmap.h>
|
||||
* \brief Represents a monochrome bitmap within main memory.
|
||||
*
|
||||
* Bitmaps are a rectangular arrangement of width() x height() pixels,
|
||||
* with each pixel set to either \ref Black or \ref White. The co-ordinate
|
||||
* system has origin (0, 0) at the top-left of the bitmap.
|
||||
*
|
||||
* Functions within this class can be used to draw various shapes into
|
||||
* the bitmap's data() buffer; e.g. drawLine(), drawRect(), drawBitmap(),
|
||||
* drawText(), clear(), fill(), etc.
|
||||
*
|
||||
* \sa DMD
|
||||
*/
|
||||
|
||||
/**
|
||||
* \typedef Bitmap::Color
|
||||
* \brief Type that represents the color of a pixel in a bitmap.
|
||||
*
|
||||
* \sa Black, White
|
||||
*/
|
||||
|
||||
/**
|
||||
* \typedef Bitmap::ProgMem
|
||||
* \brief Type that represents a bitmap within program memory.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \typedef Bitmap::Font
|
||||
* \brief Type that represents a font within program memory.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var Bitmap::Black
|
||||
* \brief Color value corresponding to "black".
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var Bitmap::White
|
||||
* \brief Color value corresponding to "white". If the bitmap is
|
||||
* displayed on a LED array, then it may have a different physical color.
|
||||
*
|
||||
* Note: while the value of this constant is 1, the bitmap itself stores
|
||||
* white pixels as 0 and black as 1 because the DMD display uses 1 to
|
||||
* indicate a pixel being off.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var Bitmap::NoFill
|
||||
* \brief Special color value that is used with drawRect() and drawCircle()
|
||||
* to indicate that the interior of the shape should not be filled.
|
||||
* For all other uses, \ref NoFill is equivalent to \ref White.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new in-memory bitmap that is \a width x \a height
|
||||
* pixels in size.
|
||||
*
|
||||
* \sa width(), height(), isValid()
|
||||
*/
|
||||
Bitmap::Bitmap(int width, int height)
|
||||
: _width(width)
|
||||
, _height(height)
|
||||
, _stride((width + 7) / 8)
|
||||
, fb(0)
|
||||
, _font(0)
|
||||
, _textColor(White)
|
||||
{
|
||||
// Allocate memory for the framebuffer and clear it (1 = pixel off).
|
||||
unsigned int size = _stride * _height;
|
||||
fb = (uint8_t *)malloc(size);
|
||||
if (fb)
|
||||
memset(fb, 0xFF, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Destroys this bitmap.
|
||||
*/
|
||||
Bitmap::~Bitmap()
|
||||
{
|
||||
if (fb)
|
||||
free(fb);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool Bitmap::isValid() const
|
||||
* \brief Returns true if the memory for this bitmap is valid; false otherwise.
|
||||
*
|
||||
* This function can be called just after the constructor to determine if
|
||||
* the memory for the bitmap was allocated successfully.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int Bitmap::width() const
|
||||
* \brief Returns the width of the bitmap in pixels.
|
||||
*
|
||||
* \sa height(), stride(), bitsPerPixel()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int Bitmap::height() const
|
||||
* \brief Returns the height of the bitmap in pixels.
|
||||
*
|
||||
* \sa width(), bitsPerPixel()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int Bitmap::stride() const
|
||||
* \brief Returns the number of bytes in each line of the bitmap's data() buffer.
|
||||
*
|
||||
* \sa width(), bitsPerPixel(), data()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int Bitmap::bitsPerPixel() const
|
||||
* \brief Returns the number of bits per pixel for the bitmap; always 1.
|
||||
*
|
||||
* \sa width(), height()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn uint8_t *Bitmap::data()
|
||||
* \brief Returns a pointer to the start of the bitmap's data buffer.
|
||||
*
|
||||
* The data is organized as height() lines of stride() bytes, laid out
|
||||
* horizontally across the extent of width() pixels. The most significant
|
||||
* bit in each byte has the lowest x value.
|
||||
*
|
||||
* Note: bits within the data are 1 for \ref Black and 0 for \ref White,
|
||||
* which is the reverse of the constant values. This differs from pixel()
|
||||
* which returns the correct constant.
|
||||
*
|
||||
* \sa pixel(), stride()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn const uint8_t *Bitmap::data() const
|
||||
* \brief Returns a constant pointer to the start of the bitmap's data buffer.
|
||||
* \overload
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Clears the entire bitmap to the specified \a color.
|
||||
*
|
||||
* \sa fill()
|
||||
*/
|
||||
void Bitmap::clear(Color color)
|
||||
{
|
||||
unsigned int size = _stride * _height;
|
||||
if (color == Black)
|
||||
memset(fb, 0xFF, size);
|
||||
else
|
||||
memset(fb, 0x00, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the color of the pixel at (\a x, \a y); either \ref Black
|
||||
* or \ref White.
|
||||
*
|
||||
* Returns \a Black if \a x or \a y is out of range.
|
||||
*
|
||||
* \sa setPixel(), data()
|
||||
*/
|
||||
Bitmap::Color Bitmap::pixel(int x, int y) const
|
||||
{
|
||||
if (((unsigned int)x) >= ((unsigned int)_width) ||
|
||||
((unsigned int)y) >= ((unsigned int)_height))
|
||||
return Black;
|
||||
uint8_t *ptr = fb + y * _stride + (x >> 3);
|
||||
if (*ptr & ((uint8_t)0x80) >> (x & 0x07))
|
||||
return Black;
|
||||
else
|
||||
return White;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sets the pixel at (\a x, \a y) to \a color.
|
||||
*
|
||||
* \sa pixel()
|
||||
*/
|
||||
void Bitmap::setPixel(int x, int y, Color color)
|
||||
{
|
||||
if (((unsigned int)x) >= ((unsigned int)_width) ||
|
||||
((unsigned int)y) >= ((unsigned int)_height))
|
||||
return; // Pixel is off-screen.
|
||||
uint8_t *ptr = fb + y * _stride + (x >> 3);
|
||||
if (color)
|
||||
*ptr &= ~(((uint8_t)0x80) >> (x & 0x07));
|
||||
else
|
||||
*ptr |= (((uint8_t)0x80) >> (x & 0x07));
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Draws a line from (\a x1, \a y1) to (\a x2, \a y2) in \a color.
|
||||
*
|
||||
* \sa drawRect(), drawCircle()
|
||||
*/
|
||||
void Bitmap::drawLine(int x1, int y1, int x2, int y2, Color color)
|
||||
{
|
||||
// Midpoint line scan-conversion algorithm from "Computer Graphics:
|
||||
// Principles and Practice", Second Edition, Foley, van Dam, et al.
|
||||
int dx = x2 - x1;
|
||||
int dy = y2 - y1;
|
||||
int xstep, ystep;
|
||||
int d, incrE, incrNE;
|
||||
if (dx < 0) {
|
||||
xstep = -1;
|
||||
dx = -dx;
|
||||
} else {
|
||||
xstep = 1;
|
||||
}
|
||||
if (dy < 0) {
|
||||
ystep = -1;
|
||||
dy = -dy;
|
||||
} else {
|
||||
ystep = 1;
|
||||
}
|
||||
if (dx >= dy) {
|
||||
d = 2 * dy - dx;
|
||||
incrE = 2 * dy;
|
||||
incrNE = 2 * (dy - dx);
|
||||
setPixel(x1, y1, color);
|
||||
while (x1 != x2) {
|
||||
if (d <= 0) {
|
||||
d += incrE;
|
||||
} else {
|
||||
d += incrNE;
|
||||
y1 += ystep;
|
||||
}
|
||||
x1 += xstep;
|
||||
setPixel(x1, y1, color);
|
||||
}
|
||||
} else {
|
||||
d = 2 * dx - dy;
|
||||
incrE = 2 * dx;
|
||||
incrNE = 2 * (dx - dy);
|
||||
setPixel(x1, y1, color);
|
||||
while (y1 != y2) {
|
||||
if (d <= 0) {
|
||||
d += incrE;
|
||||
} else {
|
||||
d += incrNE;
|
||||
x1 += xstep;
|
||||
}
|
||||
y1 += ystep;
|
||||
setPixel(x1, y1, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Draws a rectangle from (\a x1, \a y1) to (\a x2, \a y2), with the
|
||||
* outline in \a borderColor and the interior filled with \a fillColor.
|
||||
*
|
||||
* If \a fillColor is \ref NoFill, then the interior is not filled.
|
||||
*
|
||||
* \sa drawFilledRect(), drawLine(), drawCircle(), fill()
|
||||
*/
|
||||
void Bitmap::drawRect(int x1, int y1, int x2, int y2, Color borderColor, Color fillColor)
|
||||
{
|
||||
int temp;
|
||||
if (x1 > x2) {
|
||||
temp = x1;
|
||||
x1 = x2;
|
||||
x2 = temp;
|
||||
}
|
||||
if (y1 > y2) {
|
||||
temp = y1;
|
||||
y1 = y2;
|
||||
y2 = temp;
|
||||
}
|
||||
if (fillColor == borderColor) {
|
||||
fill(x1, y1, x2 - x1 + 1, y2 - y1 + 1, fillColor);
|
||||
} else {
|
||||
drawLine(x1, y1, x2, y1, borderColor);
|
||||
if (y1 < y2)
|
||||
drawLine(x2, y1 + 1, x2, y2, borderColor);
|
||||
if (x1 < x2)
|
||||
drawLine(x2 - 1, y2, x1, y2, borderColor);
|
||||
if (y1 < (y2 - 1))
|
||||
drawLine(x1, y2 - 1, x1, y1 + 1, borderColor);
|
||||
if (fillColor != NoFill)
|
||||
fill(x1 + 1, y1 + 1, x2 - x1 - 1, y2 - y1 - 1, fillColor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::drawFilledRect(int x1, int y1, int x2, int y2, Color color)
|
||||
* \brief Draws a filled rectangle from (\a x1, \a y1) to (\a x2, \a y2)
|
||||
* in \a color.
|
||||
*
|
||||
* This is a convenience function that is equivalent to
|
||||
* drawRect(\a x1, \a y1, \a x2, \a y2, \a color, \a color).
|
||||
*
|
||||
* \sa drawRect(), drawFilledCircle()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Draws a circle with a specific center (\a centerX, \a centerY)
|
||||
* and \a radius, with the outline in \a borderColor and the interior
|
||||
* filled with \a fillColor.
|
||||
*
|
||||
* If \a fillColor is \ref NoFill, then the interior is not filled.
|
||||
*
|
||||
* \sa drawFilledCircle(), drawLine(), drawRect()
|
||||
*/
|
||||
void Bitmap::drawCircle(int centerX, int centerY, int radius, Color borderColor, Color fillColor)
|
||||
{
|
||||
// Midpoint circle scan-conversion algorithm using second-order
|
||||
// differences from "Computer Graphics: Principles and Practice",
|
||||
// Second Edition, Foley, van Dam, et al.
|
||||
if (radius < 0)
|
||||
radius = -radius;
|
||||
int x = 0;
|
||||
int y = radius;
|
||||
int d = 1 - radius;
|
||||
int deltaE = 3;
|
||||
int deltaSE = 5 - 2 * radius;
|
||||
drawCirclePoints(centerX, centerY, radius, x, y, borderColor, fillColor);
|
||||
while (y > x) {
|
||||
if (d < 0) {
|
||||
d += deltaE;
|
||||
deltaE += 2;
|
||||
deltaSE += 2;
|
||||
} else {
|
||||
d += deltaSE;
|
||||
deltaE += 2;
|
||||
deltaSE += 4;
|
||||
--y;
|
||||
}
|
||||
++x;
|
||||
drawCirclePoints(centerX, centerY, radius, x, y, borderColor, fillColor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::drawFilledCircle(int centerX, int centerY, int radius, Color color)
|
||||
* \brief Draws a filled circle with a specific center (\a centerX, \a centerY)
|
||||
* and \a radius in \a color.
|
||||
*
|
||||
* This is a convenience function that is equivalent to
|
||||
* drawCircle(\a centerX, \a centerY, \a radius, \a color, \a color).
|
||||
*
|
||||
* \sa drawCircle(), drawFilledRect()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Draws \a bitmap at (\a x, \a y) in \a color.
|
||||
*
|
||||
* Bits that are set to \ref White in the \a bitmap are drawn with \a color.
|
||||
* Bits that are set to \ref Black in the \a bitmap are drawn with the
|
||||
* inverse of \a color. The pixel at (\a x, \a y) will be the top-left
|
||||
* corner of the drawn image.
|
||||
*
|
||||
* Note: \a bitmap must not be the same as this object or the behaviour will
|
||||
* be undefined. To copy a region of a bitmap to elsewhere within the
|
||||
* same bitmap, use copy() instead.
|
||||
*
|
||||
* \sa drawInvertedBitmap(), copy()
|
||||
*/
|
||||
void Bitmap::drawBitmap(int x, int y, const Bitmap &bitmap, Color color)
|
||||
{
|
||||
int w = bitmap.width();
|
||||
int s = bitmap.stride();
|
||||
int h = bitmap.height();
|
||||
Color invColor = !color;
|
||||
for (uint8_t by = 0; by < h; ++by) {
|
||||
const uint8_t *line = bitmap.data() + by * s;
|
||||
uint8_t mask = 0x80;
|
||||
uint8_t value = *line++;
|
||||
for (uint8_t bx = 0; bx < w; ++bx) {
|
||||
if (value & mask)
|
||||
setPixel(x + bx, y + by, invColor);
|
||||
else
|
||||
setPixel(x + bx, y + by, color);
|
||||
mask >>= 1;
|
||||
if (!mask) {
|
||||
mask = 0x80;
|
||||
value = *line++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Draws \a bitmap at (\a x, \a y) in \a color.
|
||||
*
|
||||
* The \a bitmap must point to program memory. The first two bytes are the
|
||||
* width and height of the bitmap in pixels. The rest of the data contains
|
||||
* the pixels for the bitmap, with lines byte-aligned.
|
||||
*
|
||||
* Bits that are 1 in the \a bitmap are drawn with \a color. Bits that are
|
||||
* 0 in the \a bitmap are drawn with the inverse of \a color. The pixel at
|
||||
* (\a x, \a y) will be the top-left corner of the drawn image.
|
||||
*
|
||||
* \sa drawInvertedBitmap(), fill()
|
||||
*/
|
||||
void Bitmap::drawBitmap(int x, int y, Bitmap::ProgMem bitmap, Color color)
|
||||
{
|
||||
uint8_t w = pgm_read_byte(bitmap);
|
||||
uint8_t s = (w + 7) >> 3;
|
||||
uint8_t h = pgm_read_byte(bitmap + 1);
|
||||
Color invColor = !color;
|
||||
for (uint8_t by = 0; by < h; ++by) {
|
||||
const uint8_t *line = ((const uint8_t *)bitmap) + 2 + by * s;
|
||||
uint8_t mask = 0x80;
|
||||
uint8_t value = pgm_read_byte(line);
|
||||
for (uint8_t bx = 0; bx < w; ++bx) {
|
||||
if (value & mask)
|
||||
setPixel(x + bx, y + by, color);
|
||||
else
|
||||
setPixel(x + bx, y + by, invColor);
|
||||
mask >>= 1;
|
||||
if (!mask) {
|
||||
mask = 0x80;
|
||||
++line;
|
||||
value = pgm_read_byte(line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::drawInvertedBitmap(int x, int y, const Bitmap &bitmap)
|
||||
* \brief Draws \a bitmap at (\a x, \a y) in inverted colors.
|
||||
*
|
||||
* This is a convenience function that is equivalent to
|
||||
* drawBitmap(\a x, \a y, \a bitmap, \ref Black).
|
||||
*
|
||||
* \sa drawBitmap()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap)
|
||||
* \brief Draws \a bitmap at (\a x, \a y) in inverted colors.
|
||||
*
|
||||
* This is a convenience function that is equivalent to
|
||||
* drawBitmap(\a x, \a y, \a bitmap, \ref Black).
|
||||
*
|
||||
* \sa drawBitmap()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn Font Bitmap::font() const
|
||||
* \brief Returns the currently selected font, or null if none selected.
|
||||
*
|
||||
* \sa setFont(), drawText(), drawChar(), charWidth()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::setFont(Font font)
|
||||
* \brief Sets the \a font for use with drawText() and drawChar().
|
||||
*
|
||||
* \code
|
||||
* #include <DejaVuSans9.h>
|
||||
*
|
||||
* display.setFont(DejaVuSans9);
|
||||
* display.drawText(0, 0, "Hello");
|
||||
* \endcode
|
||||
*
|
||||
* New fonts can be generated with <a href="https://code.google.com/p/glcd-arduino/downloads/detail?name=GLCDFontCreator2.zip&can=2&q=">GLCDFontCreator2</a>.
|
||||
*
|
||||
* \sa font(), drawText(), drawChar()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn Color Bitmap::textColor() const
|
||||
* \brief Returns the color that will be used for drawing text with
|
||||
* drawText() and drawChar(). The default is \ref White.
|
||||
*
|
||||
* \sa setTextColor(), drawText(), drawChar()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::setTextColor(Color textColor)
|
||||
* \brief Sets the \a color that will be used for drawing text with
|
||||
* drawText() and drawChar().
|
||||
*
|
||||
* \sa textColor(), drawText(), drawChar()
|
||||
*/
|
||||
|
||||
#define fontIsFixed(font) (pgm_read_byte((font)) == 0 && \
|
||||
pgm_read_byte((font) + 1) == 0)
|
||||
#define fontWidth(font) (pgm_read_byte((font) + 2))
|
||||
#define fontHeight(font) (pgm_read_byte((font) + 3))
|
||||
#define fontFirstChar(font) (pgm_read_byte((font) + 4))
|
||||
#define fontCharCount(font) (pgm_read_byte((font) + 5))
|
||||
|
||||
/**
|
||||
* \brief Draws the \a len characters of \a str at (\a x, \a y).
|
||||
*
|
||||
* If \a len is less than zero, then the actual length of \a str will be used.
|
||||
*
|
||||
* The position (\a x, \a y) will be the upper-left pixel of the first
|
||||
* character that is drawn.
|
||||
*
|
||||
* \sa drawChar(), textColor(), font()
|
||||
*/
|
||||
void Bitmap::drawText(int x, int y, const char *str, int len)
|
||||
{
|
||||
if (!_font)
|
||||
return;
|
||||
uint8_t height = fontHeight(_font);
|
||||
if (len < 0)
|
||||
len = strlen(str);
|
||||
while (len-- > 0) {
|
||||
x += drawChar(x, y, *str++);
|
||||
if (len > 0) {
|
||||
fill(x, y, 1, height, !_textColor);
|
||||
++x;
|
||||
}
|
||||
if (x >= _width)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Draws \a len characters starting at \a start from \a str to the
|
||||
* screen at (\a x, \a y).
|
||||
*
|
||||
* If \a len is less than zero, then the actual length of \a str will be used.
|
||||
*
|
||||
* The position (\a x, \a y) will be the upper-left pixel of the first
|
||||
* character that is drawn.
|
||||
*
|
||||
* \sa drawChar(), textColor(), font()
|
||||
*/
|
||||
void Bitmap::drawText(int x, int y, const String &str, int start, int len)
|
||||
{
|
||||
if (!_font)
|
||||
return;
|
||||
uint8_t height = fontHeight(_font);
|
||||
if (len < 0)
|
||||
len = str.length() - start;
|
||||
while (len-- > 0) {
|
||||
x += drawChar(x, y, str[start++]);
|
||||
if (len > 0) {
|
||||
fill(x, y, 1, height, !_textColor);
|
||||
++x;
|
||||
}
|
||||
if (x >= _width)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Draws a single character \a ch at (\a x, \a y).
|
||||
*
|
||||
* Returns the width of the character in pixels so that higher-order functions
|
||||
* like drawText() can advance \a x to the location of the next character
|
||||
* to be drawn. The width does not include inter-character spacing.
|
||||
*
|
||||
* The position (\a x, \a y) will be the upper-left pixel of the drawn
|
||||
* character.
|
||||
*
|
||||
* \sa drawText(), textColor(), font(), charWidth()
|
||||
*/
|
||||
int Bitmap::drawChar(int x, int y, char ch)
|
||||
{
|
||||
uint8_t height = fontHeight(_font);
|
||||
if (ch == ' ') {
|
||||
// Font may not have space, or it is zero-width. Calculate
|
||||
// the real size and fill the space.
|
||||
int spaceWidth = charWidth('n');
|
||||
fill(x, y, spaceWidth, height, !_textColor);
|
||||
return spaceWidth;
|
||||
}
|
||||
uint8_t first = fontFirstChar(_font);
|
||||
uint8_t count = fontCharCount(_font);
|
||||
uint8_t index = (uint8_t)ch;
|
||||
if (index < first || index >= (first + count))
|
||||
return 0;
|
||||
index -= first;
|
||||
uint8_t heightBytes = (height + 7) >> 3;;
|
||||
uint8_t width;
|
||||
const uint8_t *image;
|
||||
if (fontIsFixed(_font)) {
|
||||
// Fixed-width font.
|
||||
width = fontWidth(_font);
|
||||
image = ((const uint8_t *)_font) + 6 + index * heightBytes * width;
|
||||
} else {
|
||||
// Variable-width font.
|
||||
width = pgm_read_byte(_font + 6 + index);
|
||||
image = ((const uint8_t *)_font) + 6 + count;
|
||||
for (uint8_t temp = 0; temp < index; ++temp) {
|
||||
// Scan through all previous characters to find the starting
|
||||
// location for this one.
|
||||
image += pgm_read_byte(_font + 6 + temp) * heightBytes;
|
||||
}
|
||||
}
|
||||
if ((x + width) <= 0 || (y + height) <= 0)
|
||||
return width; // Character is off the top or left of the screen.
|
||||
Color invColor = !_textColor;
|
||||
for (uint8_t cx = 0; cx < width; ++cx) {
|
||||
for (uint8_t cy = 0; cy < heightBytes; ++cy) {
|
||||
uint8_t value = pgm_read_byte(image + cy * width + cx);
|
||||
int posn;
|
||||
if (heightBytes > 1 && cy == (heightBytes - 1))
|
||||
posn = height - 8;
|
||||
else
|
||||
posn = cy * 8;
|
||||
for (uint8_t bit = 0; bit < 8; ++bit) {
|
||||
if ((posn + bit) >= (cy * 8) && (posn + bit) <= height) {
|
||||
if (value & 0x01)
|
||||
setPixel(x + cx, y + posn + bit, _textColor);
|
||||
else
|
||||
setPixel(x + cx, y + posn + bit, invColor);
|
||||
}
|
||||
value >>= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the width in pixels of \a ch in the current font().
|
||||
*
|
||||
* Returns zero if font() is not set, or \a ch is not present in font().
|
||||
*
|
||||
* \sa drawChar(), font(), textWidth(), textHeight()
|
||||
*/
|
||||
int Bitmap::charWidth(char ch) const
|
||||
{
|
||||
uint8_t index = (uint8_t)ch;
|
||||
if (!_font)
|
||||
return 0;
|
||||
uint8_t first = fontFirstChar(_font);
|
||||
uint8_t count = fontCharCount(_font);
|
||||
if (index == ' ')
|
||||
index = 'n'; // In case the font does not contain space.
|
||||
if (index < first || index >= (first + count))
|
||||
return 0;
|
||||
if (fontIsFixed(_font))
|
||||
return fontWidth(_font);
|
||||
else
|
||||
return pgm_read_byte(_font + 6 + (index - first));
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the width in pixels of the \a len characters of \a str
|
||||
* in the current font(), including inter-character spacing.
|
||||
*
|
||||
* If \a len is less than zero, then the actual length of \a str will be used.
|
||||
*
|
||||
* \sa drawText(), charWidth(), textHeight()
|
||||
*/
|
||||
int Bitmap::textWidth(const char *str, int len) const
|
||||
{
|
||||
int width = 0;
|
||||
if (len < 0)
|
||||
len = strlen(str);
|
||||
while (len-- > 0) {
|
||||
width += charWidth(*str++);
|
||||
if (len > 0)
|
||||
++width;
|
||||
}
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the width in pixels of the \a len characters of \a str
|
||||
* in the current font(), starting at \a start, including inter-character
|
||||
* spacing.
|
||||
*
|
||||
* If \a len is less than zero, then the actual length of \a str will be used.
|
||||
*
|
||||
* \sa drawText(), charWidth(), textHeight()
|
||||
*/
|
||||
int Bitmap::textWidth(const String &str, int start, int len) const
|
||||
{
|
||||
int width = 0;
|
||||
if (len < 0)
|
||||
len = str.length() - start;
|
||||
while (len-- > 0) {
|
||||
width += charWidth(str[start++]);
|
||||
if (len > 0)
|
||||
++width;
|
||||
}
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the height in pixels of the current text drawing font();
|
||||
* or zero if font() is not set.
|
||||
*
|
||||
* \sa font(), charWidth(), textWidth()
|
||||
*/
|
||||
int Bitmap::textHeight() const
|
||||
{
|
||||
if (_font)
|
||||
return fontHeight(_font);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Copies the \a width x \a height pixels starting at top-left
|
||||
* corner (\a x, \a y) to (\a destX, \a destY) in the bitmap \a dest.
|
||||
*
|
||||
* The \a dest bitmap can be the same as this object, in which case the copy
|
||||
* will be performed in a manner that correctly handles overlapping regions.
|
||||
*
|
||||
* If some part of the source region is outside the bounds of this object,
|
||||
* then the value \ref Black will be copied to \a dest for those pixels.
|
||||
* This can be used to produce a behaviour similar to scroll() when
|
||||
* \a bitmap is the same as this object.
|
||||
*
|
||||
* \sa drawBitmap(), fill(), scroll()
|
||||
*/
|
||||
void Bitmap::copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY)
|
||||
{
|
||||
if (dest == this) {
|
||||
// Copying to within the same bitmap, so copy in a direction
|
||||
// that will prevent problems with overlap.
|
||||
blit(x, y, x + width - 1, y + height - 1, destX, destY);
|
||||
} else {
|
||||
// Copying to a different bitmap.
|
||||
while (height > 0) {
|
||||
for (int tempx = 0; tempx < width; ++tempx)
|
||||
dest->setPixel(destX + tempx, destY, pixel(x + tempx, y));
|
||||
++y;
|
||||
++destY;
|
||||
--height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Fills the \a width x \a height pixels starting at top-left
|
||||
* corner (\a x, \a y) with \a color.
|
||||
*
|
||||
* \sa copy(), clear(), invert(), drawRect()
|
||||
*/
|
||||
void Bitmap::fill(int x, int y, int width, int height, Color color)
|
||||
{
|
||||
while (height > 0) {
|
||||
for (int temp = 0; temp < width; ++temp)
|
||||
setPixel(x + temp, y, color);
|
||||
++y;
|
||||
--height;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Fills the \a width x \a height pixels starting at top-left
|
||||
* corner (\a x, \a y) with the contents of \a pattern.
|
||||
*
|
||||
* The \a pattern must point to program memory. The first two bytes are the
|
||||
* width and height of the pattern in pixels. The rest of the data contains
|
||||
* the pixels for the pattern, with lines byte-aligned.
|
||||
*
|
||||
* Bits that are 1 in the \a pattern are drawn with \a color. Bits that are
|
||||
* 0 in the \a pattern are drawn with the inverse of \a color.
|
||||
*
|
||||
* \sa drawBitmap(), clear(), invert()
|
||||
*/
|
||||
void Bitmap::fill(int x, int y, int width, int height, Bitmap::ProgMem pattern, Color color)
|
||||
{
|
||||
uint8_t w = pgm_read_byte(pattern);
|
||||
uint8_t s = (w + 7) >> 3;
|
||||
uint8_t h = pgm_read_byte(pattern + 1);
|
||||
if (!w || !h)
|
||||
return;
|
||||
Color invColor = !color;
|
||||
for (int tempy = 0; tempy < height; ++tempy) {
|
||||
const uint8_t *startLine = ((const uint8_t *)pattern) + 2 + (tempy % h) * s;
|
||||
const uint8_t *line = startLine;
|
||||
uint8_t mask = 0x80;
|
||||
uint8_t value = pgm_read_byte(line++);
|
||||
int bit = 0;
|
||||
for (int tempx = 0; tempx < width; ++tempx) {
|
||||
if (value & mask)
|
||||
setPixel(x + tempx, y + tempy, color);
|
||||
else
|
||||
setPixel(x + tempx, y + tempy, invColor);
|
||||
if (++bit >= w) {
|
||||
mask = 0x80;
|
||||
line = startLine;
|
||||
value = pgm_read_byte(line++);
|
||||
bit = 0;
|
||||
} else {
|
||||
mask >>= 1;
|
||||
if (!mask) {
|
||||
mask = 0x80;
|
||||
value = pgm_read_byte(line++);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn void Bitmap::scroll(int dx, int dy, Color fillColor)
|
||||
* \brief Scrolls the entire contents of the bitmap by \a dx and \a dy.
|
||||
*
|
||||
* If \a dx is 2 and \a dy is -1, then the region will be scrolled two
|
||||
* pixels to the right and one pixel up. Pixels that are uncovered
|
||||
* by the scroll are filled with \a fillColor.
|
||||
*
|
||||
* \sa copy(), fill()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Scrolls the \a width x \a height pixels starting at top-left
|
||||
* corner (\a x, \a y) by \a dx and \a dy.
|
||||
*
|
||||
* If \a dx is 2 and \a dy is -1, then the region will be scrolled two
|
||||
* pixels to the right and one pixel up. Pixels that are uncovered
|
||||
* by the scroll are filled with \a fillColor.
|
||||
*
|
||||
* \sa copy(), fill()
|
||||
*/
|
||||
void Bitmap::scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor)
|
||||
{
|
||||
// Bail out if no scrolling at all.
|
||||
if (!dx && !dy)
|
||||
return;
|
||||
|
||||
// Clamp the scroll region to the extents of the bitmap.
|
||||
if (x < 0) {
|
||||
width += x;
|
||||
x = 0;
|
||||
}
|
||||
if (y < 0) {
|
||||
height += y;
|
||||
y = 0;
|
||||
}
|
||||
if ((x + width) > _width)
|
||||
width = _width - x;
|
||||
if ((y + height) > _height)
|
||||
height = _height - y;
|
||||
if (width <= 0 || height <= 0)
|
||||
return;
|
||||
|
||||
// Scroll the region in the specified direction.
|
||||
if (dy < 0) {
|
||||
if (dx < 0)
|
||||
blit(x - dx, y - dy, x + width - 1 + dx, y + height - 1 + dy, x, y);
|
||||
else
|
||||
blit(x, y - dy, x + width - 1 - dx, y + height - 1 + dy, x + dx, y);
|
||||
} else {
|
||||
if (dx < 0)
|
||||
blit(x - dx, y, x + width - 1 + dx, y + height - 1 - dy, x, y + dy);
|
||||
else
|
||||
blit(x, y, x + width - 1 - dx, y + height - 1 - dy, x + dx, y + dy);
|
||||
}
|
||||
|
||||
// Fill the pixels that were uncovered by the scroll.
|
||||
if (dy < 0) {
|
||||
fill(x, y + height + dy, width, -dy, fillColor);
|
||||
if (dx < 0)
|
||||
fill(x + width + dx, y, -dx, height + dy, fillColor);
|
||||
else if (dx > 0)
|
||||
fill(x, y, dx, height + dy, fillColor);
|
||||
} else if (dy > 0) {
|
||||
fill(x, y, width, -dy, fillColor);
|
||||
if (dx < 0)
|
||||
fill(x + width + dx, y + dy, -dx, height - dy, fillColor);
|
||||
else if (dx > 0)
|
||||
fill(x, y + dy, dx, height - dy, fillColor);
|
||||
} else if (dx < 0) {
|
||||
fill(x + width + dx, y, -dx, height, fillColor);
|
||||
} else if (dx > 0) {
|
||||
fill(x, y, dx, height, fillColor);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Inverts the \a width x \a height pixels starting at top-left
|
||||
* corner (\a x, \a y).
|
||||
*
|
||||
* \sa fill()
|
||||
*/
|
||||
void Bitmap::invert(int x, int y, int width, int height)
|
||||
{
|
||||
while (height > 0) {
|
||||
for (int tempx = x + width - 1; tempx >= x; --tempx)
|
||||
setPixel(tempx, y, !pixel(tempx, y));
|
||||
--height;
|
||||
++y;
|
||||
}
|
||||
}
|
||||
|
||||
void Bitmap::blit(int x1, int y1, int x2, int y2, int x3, int y3)
|
||||
{
|
||||
if (y3 < y1 || (y1 == y3 && x3 <= x1)) {
|
||||
for (int tempy = y1; tempy <= y2; ++tempy) {
|
||||
int y = y1 - tempy + y3;
|
||||
int x = x3 - x1;
|
||||
for (int tempx = x1; tempx <= x2; ++tempx)
|
||||
setPixel(x + tempx, y, pixel(tempx, tempy));
|
||||
}
|
||||
} else {
|
||||
for (int tempy = y2; tempy >= y1; --tempy) {
|
||||
int y = y1 - tempy + y3;
|
||||
int x = x3 - x1;
|
||||
for (int tempx = x2; tempx >= x1; --tempx)
|
||||
setPixel(x + tempx, y, pixel(tempx, tempy));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Bitmap::drawCirclePoints(int centerX, int centerY, int radius, int x, int y, Color borderColor, Color fillColor)
|
||||
{
|
||||
if (x != y) {
|
||||
setPixel(centerX + x, centerY + y, borderColor);
|
||||
setPixel(centerX + y, centerY + x, borderColor);
|
||||
setPixel(centerX + y, centerY - x, borderColor);
|
||||
setPixel(centerX + x, centerY - y, borderColor);
|
||||
setPixel(centerX - x, centerY - y, borderColor);
|
||||
setPixel(centerX - y, centerY - x, borderColor);
|
||||
setPixel(centerX - y, centerY + x, borderColor);
|
||||
setPixel(centerX - x, centerY + y, borderColor);
|
||||
if (fillColor != NoFill) {
|
||||
if (radius > 1) {
|
||||
drawLine(centerX - x + 1, centerY + y, centerX + x - 1, centerY + y, fillColor);
|
||||
drawLine(centerX - y + 1, centerY + x, centerX + y - 1, centerY + x, fillColor);
|
||||
drawLine(centerX - x + 1, centerY - y, centerX + x - 1, centerY - y, fillColor);
|
||||
drawLine(centerX - y + 1, centerY - x, centerX + y - 1, centerY - x, fillColor);
|
||||
} else if (radius == 1) {
|
||||
setPixel(centerX, centerY, fillColor);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setPixel(centerX + x, centerY + y, borderColor);
|
||||
setPixel(centerX + y, centerY - x, borderColor);
|
||||
setPixel(centerX - x, centerY - y, borderColor);
|
||||
setPixel(centerX - y, centerY + x, borderColor);
|
||||
if (fillColor != NoFill) {
|
||||
if (radius > 1) {
|
||||
drawLine(centerX - x + 1, centerY + y, centerX + x - 1, centerY + y, fillColor);
|
||||
drawLine(centerX - x + 1, centerY - y, centerX + x - 1, centerY - y, fillColor);
|
||||
} else if (radius == 1) {
|
||||
setPixel(centerX, centerY, fillColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef Bitmap_h
|
||||
#define Bitmap_h
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
class DMD;
|
||||
class String;
|
||||
|
||||
class Bitmap
|
||||
{
|
||||
public:
|
||||
Bitmap(int width, int height);
|
||||
~Bitmap();
|
||||
|
||||
bool isValid() const { return fb != 0; }
|
||||
|
||||
typedef uint8_t Color;
|
||||
typedef PGM_VOID_P ProgMem;
|
||||
typedef PGM_VOID_P Font;
|
||||
|
||||
static const Color Black = 0;
|
||||
static const Color White = 1;
|
||||
static const Color NoFill = 2;
|
||||
|
||||
int width() const { return _width; }
|
||||
int height() const { return _height; }
|
||||
int stride() const { return _stride; }
|
||||
int bitsPerPixel() const { return 1; }
|
||||
|
||||
uint8_t *data() { return fb; }
|
||||
const uint8_t *data() const { return fb; }
|
||||
|
||||
void clear(Color color = Black);
|
||||
|
||||
Color pixel(int x, int y) const;
|
||||
void setPixel(int x, int y, Color color);
|
||||
|
||||
void drawLine(int x1, int y1, int x2, int y2, Color color = White);
|
||||
void drawRect(int x1, int y1, int x2, int y2, Color borderColor = White, Color fillColor = NoFill);
|
||||
void drawFilledRect(int x1, int y1, int x2, int y2, Color color = White);
|
||||
void drawCircle(int centerX, int centerY, int radius, Color borderColor = White, Color fillColor = NoFill);
|
||||
void drawFilledCircle(int centerX, int centerY, int radius, Color color = White);
|
||||
|
||||
void drawBitmap(int x, int y, const Bitmap &bitmap, Color color = White);
|
||||
void drawBitmap(int x, int y, Bitmap::ProgMem bitmap, Color color = White);
|
||||
void drawInvertedBitmap(int x, int y, const Bitmap &bitmap);
|
||||
void drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap);
|
||||
|
||||
Font font() const { return _font; }
|
||||
void setFont(Font font) { _font = font; }
|
||||
|
||||
Color textColor() const { return _textColor; }
|
||||
void setTextColor(Color color) { _textColor = color; }
|
||||
|
||||
void drawText(int x, int y, const char *str, int len = -1);
|
||||
void drawText(int x, int y, const String &str, int start = 0, int len = -1);
|
||||
|
||||
int drawChar(int x, int y, char ch);
|
||||
|
||||
int charWidth(char ch) const;
|
||||
int textWidth(const char *str, int len = -1) const;
|
||||
int textWidth(const String &str, int start = 0, int len = -1) const;
|
||||
int textHeight() const;
|
||||
|
||||
void copy(int x, int y, int width, int height, Bitmap *dest, int destX, int destY);
|
||||
void fill(int x, int y, int width, int height, Color color);
|
||||
void fill(int x, int y, int width, int height, Bitmap::ProgMem pattern, Color color = White);
|
||||
|
||||
void scroll(int dx, int dy, Color fillColor = Black);
|
||||
void scroll(int x, int y, int width, int height, int dx, int dy, Color fillColor = Black);
|
||||
|
||||
void invert(int x, int y, int width, int height);
|
||||
|
||||
private:
|
||||
// Disable copy constructor and operator=().
|
||||
Bitmap(const Bitmap &) {}
|
||||
Bitmap &operator=(const Bitmap &) { return *this; }
|
||||
|
||||
int _width;
|
||||
int _height;
|
||||
int _stride;
|
||||
uint8_t *fb;
|
||||
Font _font;
|
||||
Color _textColor;
|
||||
|
||||
friend class DMD;
|
||||
|
||||
void blit(int x1, int y1, int x2, int y2, int x3, int y3);
|
||||
void drawCirclePoints(int centerX, int centerY, int radius, int x, int y, Color borderColor, Color fillColor);
|
||||
};
|
||||
|
||||
inline void Bitmap::drawFilledRect(int x1, int y1, int x2, int y2, Color color)
|
||||
{
|
||||
drawRect(x1, y1, x2, y2, color, color);
|
||||
}
|
||||
|
||||
inline void Bitmap::drawFilledCircle(int centerX, int centerY, int radius, Color color)
|
||||
{
|
||||
drawCircle(centerX, centerY, radius, color, color);
|
||||
}
|
||||
|
||||
inline void Bitmap::drawInvertedBitmap(int x, int y, const Bitmap &bitmap)
|
||||
{
|
||||
drawBitmap(x, y, bitmap, Black);
|
||||
}
|
||||
|
||||
inline void Bitmap::drawInvertedBitmap(int x, int y, Bitmap::ProgMem bitmap)
|
||||
{
|
||||
drawBitmap(x, y, bitmap, Black);
|
||||
}
|
||||
|
||||
inline void Bitmap::scroll(int dx, int dy, Color fillColor)
|
||||
{
|
||||
scroll(0, 0, _width, _height, dx, dy, fillColor);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,696 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "DMD.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
#include <pins_arduino.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/**
|
||||
* \class DMD DMD.h <DMD.h>
|
||||
* \brief Handle large dot matrix displays composed of LED's.
|
||||
*
|
||||
* This class is designed for use with
|
||||
* <a href="http://www.freetronics.com/dmd">Freetronics Large Dot Matrix
|
||||
* Displays</a>. These displays have 512 LED's arranged in a 32x16 matrix
|
||||
* and controlled by an SPI interface. The displays are available in
|
||||
* red, blue, green, yellow, and white variations (for which this class
|
||||
* always uses the constant \ref White regardless of the physical color).
|
||||
*
|
||||
* \section dmd_drawing Drawing
|
||||
*
|
||||
* DMD inherits from Bitmap so that any of the drawing functions in that
|
||||
* class can be used to draw directly to dot matrix displays. The following
|
||||
* example initializes a single display panel and draws a rectangle and a
|
||||
* circle into it at setup time:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* void setup() {
|
||||
* display.drawRect(5, 2, 27, 13);
|
||||
* display.drawCircle(16, 8, 4);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The display must be updated frequently from the application's main loop:
|
||||
*
|
||||
* \code
|
||||
* void loop() {
|
||||
* display.loop();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* \section dmd_interrupts Interrupt-driven display refresh
|
||||
*
|
||||
* The loop() method simplifies updating the display from the application's
|
||||
* main loop but it can sometimes be inconvenient to arrange for it to be
|
||||
* called regularly, especially if the application wishes to use
|
||||
* <tt>delay()</tt> or <tt>delayMicroseconds()</tt>.
|
||||
*
|
||||
* DMD provides an asynchronous display update mechanism using Timer1
|
||||
* interrupts. The application turns on interrupts using enableTimer1()
|
||||
* and then calls refresh() from the interrupt service routine:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* ISR(TIMER1_OVF_vect)
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* display.enableTimer1();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If Timer1 is already in use by some other part of your application,
|
||||
* then Timer2 can be used as an alternative interrupt source:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* ISR(TIMER2_OVF_vect)
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* display.enableTimer2();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* DMD can also be used with third-party timer libraries such as
|
||||
* <a href="http://code.google.com/p/arduino-timerone/downloads/list">TimerOne</a>:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
* #include <TimerOne.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* void refreshDisplay()
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* Timer1.initialize(5000);
|
||||
* Timer1.attachInterrupt(refreshDisplay);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* \section dmd_double_buffer Double buffering
|
||||
*
|
||||
* When using interrupts, the system can sometimes exhibit "tearing" artifacts
|
||||
* where half-finished images are displayed because an interrupt fired in
|
||||
* the middle of a screen update.
|
||||
*
|
||||
* This problem can be alleviated using double buffering: all rendering is done
|
||||
* to an off-screen buffer that is swapped onto the screen once it is ready
|
||||
* for display. Rendering then switches to the other buffer that is now
|
||||
* off-screen. The following example demonstrates this:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* ISR(TIMER1_OVF_vect)
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* display.setDoubleBuffer(true);
|
||||
* display.enableTimer1();
|
||||
* }
|
||||
*
|
||||
* void loop() {
|
||||
* updateDisplay();
|
||||
* display.swapBuffers();
|
||||
* delay(50); // Delay between frames.
|
||||
* }
|
||||
*
|
||||
* void updateDisplay() {
|
||||
* // Draw the new display contents into the off-screen buffer.
|
||||
* display.clear();
|
||||
* ...
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The downside of double buffering is that it uses twice as much main memory
|
||||
* to manage the contents of the screen.
|
||||
*
|
||||
* \section dmd_multi Multiple panels
|
||||
*
|
||||
* Multiple panels can be daisy-chained together using ribbon cables.
|
||||
* If there is a single row of panels, then they must be connected
|
||||
* to the Arduino board as follows:
|
||||
*
|
||||
* \image html dmd-4x1.png
|
||||
*
|
||||
* If there are multiple rows of panels, then alternating rows are
|
||||
* flipped upside-down so that the short ribbon cables provided by
|
||||
* Freetronics reach (this technique is thanks to Chris Debenham; see
|
||||
* http://www.adebenham.com/category/arduino/dmd/ for more details):
|
||||
*
|
||||
* \image html dmd-4x2.png
|
||||
*
|
||||
* This technique can be repeated for as many rows as required, with the
|
||||
* bottom row always right-way-up:
|
||||
*
|
||||
* \image html dmd-4x3.png
|
||||
*
|
||||
* DMD automatically takes care of flipping the data for panels in the
|
||||
* alternating rows. No special action is required by the user except
|
||||
* to physically connect the panels as shown and to initialize the DMD
|
||||
* class appropriately:
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display(4, 2); // 4 panels wide, 2 panels high
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
// Pins on the DMD connector board.
|
||||
#define DMD_PIN_PHASE_LSB 6 // A
|
||||
#define DMD_PIN_PHASE_MSB 7 // B
|
||||
#define DMD_PIN_LATCH 8 // SCLK
|
||||
#define DMD_PIN_OUTPUT_ENABLE 9 // nOE
|
||||
#define DMD_PIN_SPI_SS SS // SPI Slave Select
|
||||
#define DMD_PIN_SPI_MOSI MOSI // SPI Master Out, Slave In (R)
|
||||
#define DMD_PIN_SPI_MISO MISO // SPI Master In, Slave Out
|
||||
#define DMD_PIN_SPI_SCK SCK // SPI Serial Clock (CLK)
|
||||
|
||||
// Dimension information for the display.
|
||||
#define DMD_NUM_COLUMNS 32 // Number of columns in a panel.
|
||||
#define DMD_NUM_ROWS 16 // Number of rows in a panel.
|
||||
|
||||
// Refresh times.
|
||||
#define DMD_REFRESH_MS 5
|
||||
#define DMD_REFRESH_US 5000
|
||||
|
||||
/**
|
||||
* \brief Constructs a new dot matrix display handler for a display that
|
||||
* is \a widthPanels x \a heightPanels in size.
|
||||
*
|
||||
* Note: the parameters to this constructor are specified in panels,
|
||||
* whereas width() and height() are specified in pixels.
|
||||
*
|
||||
* \sa width(), height()
|
||||
*/
|
||||
DMD::DMD(int widthPanels, int heightPanels)
|
||||
: Bitmap(widthPanels * DMD_NUM_COLUMNS, heightPanels * DMD_NUM_ROWS)
|
||||
, _doubleBuffer(false)
|
||||
, phase(0)
|
||||
, fb0(0)
|
||||
, fb1(0)
|
||||
, displayfb(0)
|
||||
, lastRefresh(millis())
|
||||
{
|
||||
// Both rendering and display are to fb0 initially.
|
||||
fb0 = displayfb = fb;
|
||||
|
||||
// Initialize SPI to MSB-first, mode 0, clock divider = 2.
|
||||
pinMode(DMD_PIN_SPI_SCK, OUTPUT);
|
||||
pinMode(DMD_PIN_SPI_MOSI, OUTPUT);
|
||||
pinMode(DMD_PIN_SPI_SS, OUTPUT);
|
||||
digitalWrite(DMD_PIN_SPI_SCK, LOW);
|
||||
digitalWrite(DMD_PIN_SPI_MOSI, LOW);
|
||||
digitalWrite(DMD_PIN_SPI_SS, HIGH);
|
||||
SPCR |= _BV(MSTR);
|
||||
SPCR |= _BV(SPE);
|
||||
SPCR &= ~(_BV(DORD)); // MSB-first
|
||||
SPCR &= ~0x0C; // Mode 0
|
||||
SPCR &= ~0x03; // Clock divider rate 2
|
||||
SPSR |= 0x01; // MSB of clock divider rate
|
||||
|
||||
// Initialize the DMD-specific pins.
|
||||
pinMode(DMD_PIN_PHASE_LSB, OUTPUT);
|
||||
pinMode(DMD_PIN_PHASE_MSB, OUTPUT);
|
||||
pinMode(DMD_PIN_LATCH, OUTPUT);
|
||||
pinMode(DMD_PIN_OUTPUT_ENABLE, OUTPUT);
|
||||
digitalWrite(DMD_PIN_PHASE_LSB, LOW);
|
||||
digitalWrite(DMD_PIN_PHASE_MSB, LOW);
|
||||
digitalWrite(DMD_PIN_LATCH, LOW);
|
||||
digitalWrite(DMD_PIN_OUTPUT_ENABLE, LOW);
|
||||
digitalWrite(DMD_PIN_SPI_MOSI, HIGH);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Destroys this dot matrix display handler.
|
||||
*/
|
||||
DMD::~DMD()
|
||||
{
|
||||
if (fb0)
|
||||
free(fb0);
|
||||
if (fb1)
|
||||
free(fb1);
|
||||
fb = 0; // Don't free the buffer again in the base class.
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool DMD::doubleBuffer() const
|
||||
* \brief Returns true if the display is double-buffered; false if
|
||||
* single-buffered. The default is false.
|
||||
*
|
||||
* \sa setDoubleBuffer(), swapBuffers(), refresh()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Enables or disables double-buffering according to \a doubleBuffer.
|
||||
*
|
||||
* When double-buffering is enabled, rendering operations are sent to a
|
||||
* memory buffer that isn't currently displayed on-screen. Once the
|
||||
* application has completed the screen update, it calls swapBuffers()
|
||||
* to display the current buffer and switch rendering to the other
|
||||
* now invisible buffer.
|
||||
*
|
||||
* Double-buffering is recommended if refresh() is being called from an
|
||||
* interrupt service routine, to prevent "tearing" artifacts that result
|
||||
* from simultaneous update of a single shared buffer.
|
||||
*
|
||||
* This function will allocate memory for the extra buffer when
|
||||
* \a doubleBuffer is true. If there is insufficient memory for the
|
||||
* second screen buffer, then this class will revert to single-buffered mode.
|
||||
*
|
||||
* \sa doubleBuffer(), swapBuffers(), refresh()
|
||||
*/
|
||||
void DMD::setDoubleBuffer(bool doubleBuffer)
|
||||
{
|
||||
if (doubleBuffer != _doubleBuffer) {
|
||||
_doubleBuffer = doubleBuffer;
|
||||
if (doubleBuffer) {
|
||||
// Allocate a new back buffer.
|
||||
unsigned int size = _stride * _height;
|
||||
fb1 = (uint8_t *)malloc(size);
|
||||
|
||||
// Clear the new back buffer and then switch to it, leaving
|
||||
// the current contents of fb0 on the screen.
|
||||
if (fb1) {
|
||||
memset(fb1, 0xFF, size);
|
||||
cli();
|
||||
fb = fb1;
|
||||
displayfb = fb0;
|
||||
sei();
|
||||
} else {
|
||||
// Failed to allocate the memory, so revert to single-buffered.
|
||||
_doubleBuffer = false;
|
||||
}
|
||||
} else if (fb1) {
|
||||
// Disabling double-buffering, so forcibly switch to fb0.
|
||||
cli();
|
||||
fb = fb0;
|
||||
displayfb = fb0;
|
||||
sei();
|
||||
|
||||
// Free the unnecessary buffer.
|
||||
free(fb1);
|
||||
fb1 = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Swaps the buffers that are used for rendering to the display.
|
||||
*
|
||||
* When doubleBuffer() is false, this function does nothing.
|
||||
* Otherwise the front and back rendering buffers are swapped.
|
||||
* See the description of setDoubleBuffer() for more information.
|
||||
*
|
||||
* The new rendering back buffer will have undefined contents and will
|
||||
* probably need to be re-inialized with clear() or fill() before
|
||||
* drawing to it. The swapBuffersAndCopy() function can be used instead
|
||||
* to preserve the screen contents from one frame to the next.
|
||||
*
|
||||
* \sa swapBuffersAndCopy(), setDoubleBuffer()
|
||||
*/
|
||||
void DMD::swapBuffers()
|
||||
{
|
||||
if (_doubleBuffer) {
|
||||
// Turn off interrupts while swapping buffers so that we don't
|
||||
// accidentally try to refresh() in the middle of this code.
|
||||
cli();
|
||||
if (fb == fb0) {
|
||||
fb = fb1;
|
||||
displayfb = fb0;
|
||||
} else {
|
||||
fb = fb0;
|
||||
displayfb = fb1;
|
||||
}
|
||||
sei();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Swaps the buffers that are used for rendering to the display
|
||||
* and copies the former back buffer contents to the new back buffer.
|
||||
*
|
||||
* Normally when swapBuffers() is called, the new rendering back buffer
|
||||
* will have undefined contents from two frames prior and must be cleared
|
||||
* with clear() or fill() before writing new contents to it.
|
||||
* This function instead copies the previous frame into the new
|
||||
* rendering buffer so that it can be updated in-place.
|
||||
*
|
||||
* This function is useful if the screen does not change much from one
|
||||
* frame to the next. If the screen changes a lot between frames, then it
|
||||
* is usually better to explicitly clear() or fill() the new back buffer.
|
||||
*
|
||||
* \sa swapBuffers(), setDoubleBuffer()
|
||||
*/
|
||||
void DMD::swapBuffersAndCopy()
|
||||
{
|
||||
swapBuffers();
|
||||
if (_doubleBuffer)
|
||||
memcpy(fb, displayfb, _stride * _height);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Performs regular display refresh activities from the
|
||||
* application's main loop.
|
||||
*
|
||||
* \code
|
||||
* DMD display;
|
||||
*
|
||||
* void loop() {
|
||||
* display.loop();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If you are using a timer interrupt service routine, then call
|
||||
* refresh() in response to the interrupt instead of calling loop().
|
||||
*
|
||||
* \sa refresh()
|
||||
*/
|
||||
void DMD::loop()
|
||||
{
|
||||
unsigned long currentTime = millis();
|
||||
if ((currentTime - lastRefresh) >= DMD_REFRESH_MS) {
|
||||
lastRefresh = currentTime;
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
||||
// Send a single byte via SPI.
|
||||
static inline void spiSend(byte value)
|
||||
{
|
||||
SPDR = value;
|
||||
while (!(SPSR & _BV(SPIF)))
|
||||
; // Wait for the transfer to complete.
|
||||
}
|
||||
|
||||
// Flip the bits in a byte. Table generated by genflip.c
|
||||
static const uint8_t flipBits[256] PROGMEM = {
|
||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0,
|
||||
0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
|
||||
0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4,
|
||||
0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
|
||||
0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC,
|
||||
0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
|
||||
0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA,
|
||||
0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
|
||||
0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6,
|
||||
0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
|
||||
0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1,
|
||||
0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
|
||||
0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9,
|
||||
0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
|
||||
0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD,
|
||||
0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
|
||||
0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3,
|
||||
0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
|
||||
0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7,
|
||||
0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
|
||||
0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF,
|
||||
0x3F, 0xBF, 0x7F, 0xFF
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Refresh the display.
|
||||
*
|
||||
* This function must be called at least once every 5 milliseconds
|
||||
* for smooth non-flickering update of the display. It is usually
|
||||
* called by loop(), but can also be called in response to a
|
||||
* timer interrupt.
|
||||
*
|
||||
* If this function is called from an interrupt service routine,
|
||||
* then it is recommended that double-buffering be enabled with
|
||||
* setDoubleBuffer() to prevent "tearing" artifacts that result
|
||||
* from simultaneous update of a single shared buffer.
|
||||
*
|
||||
* \sa loop(), setDoubleBuffer(), enableTimer1()
|
||||
*/
|
||||
void DMD::refresh()
|
||||
{
|
||||
// Bail out if there is a conflict on the SPI bus.
|
||||
if (!digitalRead(DMD_PIN_SPI_SS))
|
||||
return;
|
||||
|
||||
// Transfer the data for the next group of interleaved rows.
|
||||
int stride4 = _stride * 4;
|
||||
uint8_t *data0;
|
||||
uint8_t *data1;
|
||||
uint8_t *data2;
|
||||
uint8_t *data3;
|
||||
bool flipRow = ((_height & 0x10) == 0);
|
||||
for (int y = 0; y < _height; y += 16) {
|
||||
if (!flipRow) {
|
||||
// The panels in this row are the right way up.
|
||||
data0 = displayfb + _stride * (y + phase);
|
||||
data1 = data0 + stride4;
|
||||
data2 = data1 + stride4;
|
||||
data3 = data2 + stride4;
|
||||
for (int x = _stride; x > 0; --x) {
|
||||
spiSend(*data3++);
|
||||
spiSend(*data2++);
|
||||
spiSend(*data1++);
|
||||
spiSend(*data0++);
|
||||
}
|
||||
flipRow = true;
|
||||
} else {
|
||||
// The panels in this row are upside-down and reversed.
|
||||
data0 = displayfb + _stride * (y + 16 - phase) - 1;
|
||||
data1 = data0 - stride4;
|
||||
data2 = data1 - stride4;
|
||||
data3 = data2 - stride4;
|
||||
for (int x = _stride; x > 0; --x) {
|
||||
spiSend(pgm_read_byte(&(flipBits[*data3--])));
|
||||
spiSend(pgm_read_byte(&(flipBits[*data2--])));
|
||||
spiSend(pgm_read_byte(&(flipBits[*data1--])));
|
||||
spiSend(pgm_read_byte(&(flipBits[*data0--])));
|
||||
}
|
||||
flipRow = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Latch the data from the shift registers onto the actual display.
|
||||
digitalWrite(DMD_PIN_OUTPUT_ENABLE, LOW);
|
||||
digitalWrite(DMD_PIN_LATCH, HIGH);
|
||||
digitalWrite(DMD_PIN_LATCH, LOW);
|
||||
if (phase & 0x02)
|
||||
digitalWrite(DMD_PIN_PHASE_MSB, HIGH);
|
||||
else
|
||||
digitalWrite(DMD_PIN_PHASE_MSB, LOW);
|
||||
if (phase & 0x01)
|
||||
digitalWrite(DMD_PIN_PHASE_LSB, HIGH);
|
||||
else
|
||||
digitalWrite(DMD_PIN_PHASE_LSB, LOW);
|
||||
digitalWrite(DMD_PIN_OUTPUT_ENABLE, HIGH);
|
||||
phase = (phase + 1) & 0x03;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enables Timer1 overflow interrupts for updating this display.
|
||||
*
|
||||
* The application must also provide an interrupt service routine for
|
||||
* Timer1 that calls refresh():
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* ISR(TIMER1_OVF_vect)
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* display.enableTimer1();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If timer interrupts are being used to update the display, then it is
|
||||
* unnecessary to call loop().
|
||||
*
|
||||
* \sa refresh(), disableTimer1(), enableTimer2(), setDoubleBuffer()
|
||||
*/
|
||||
void DMD::enableTimer1()
|
||||
{
|
||||
// Number of CPU cycles in the display's refresh period.
|
||||
unsigned long numCycles = (F_CPU / 2000000) * DMD_REFRESH_US;
|
||||
|
||||
// Determine the prescaler to be used.
|
||||
#define TIMER1_RESOLUTION 65536UL
|
||||
uint8_t prescaler;
|
||||
if (numCycles < TIMER1_RESOLUTION) {
|
||||
// No prescaling required.
|
||||
prescaler = _BV(CS10);
|
||||
} else if (numCycles < TIMER1_RESOLUTION * 8) {
|
||||
// Prescaler = 8.
|
||||
prescaler = _BV(CS11);
|
||||
numCycles >>= 3;
|
||||
} else if (numCycles < TIMER1_RESOLUTION * 64) {
|
||||
// Prescaler = 64.
|
||||
prescaler = _BV(CS11) | _BV(CS10);
|
||||
numCycles >>= 6;
|
||||
} else if (numCycles < TIMER1_RESOLUTION * 256) {
|
||||
// Prescaler = 256.
|
||||
prescaler = _BV(CS12);
|
||||
numCycles >>= 8;
|
||||
} else if (numCycles < TIMER1_RESOLUTION * 1024) {
|
||||
// Prescaler = 1024.
|
||||
prescaler = _BV(CS12) | _BV(CS10);
|
||||
numCycles >>= 10;
|
||||
} else {
|
||||
// Too long, so set the maximum timeout.
|
||||
prescaler = _BV(CS12) | _BV(CS10);
|
||||
numCycles = TIMER1_RESOLUTION - 1;
|
||||
}
|
||||
|
||||
// Configure Timer1 for the period we want.
|
||||
TCCR1A = 0;
|
||||
TCCR1B = _BV(WGM13);
|
||||
uint8_t saveSREG = SREG;
|
||||
cli();
|
||||
ICR1 = numCycles;
|
||||
SREG = saveSREG; // Implicit sei() if interrupts were on previously.
|
||||
TCCR1B = (TCCR1B & ~(_BV(CS12) | _BV(CS11) | _BV(CS10))) | prescaler;
|
||||
|
||||
// Turn on the Timer1 overflow interrupt.
|
||||
TIMSK1 |= _BV(TOIE1);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables Timer1 overflow interrupts.
|
||||
*
|
||||
* \sa enableTimer1()
|
||||
*/
|
||||
void DMD::disableTimer1()
|
||||
{
|
||||
// Turn off the Timer1 overflow interrupt.
|
||||
TIMSK1 &= ~_BV(TOIE1);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enables Timer2 overflow interrupts for updating this display.
|
||||
*
|
||||
* The application must also provide an interrupt service routine for
|
||||
* Timer2 that calls refresh():
|
||||
*
|
||||
* \code
|
||||
* #include <DMD.h>
|
||||
*
|
||||
* DMD display;
|
||||
*
|
||||
* ISR(TIMER2_OVF_vect)
|
||||
* {
|
||||
* display.refresh();
|
||||
* }
|
||||
*
|
||||
* void setup() {
|
||||
* display.enableTimer2();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If timer interrupts are being used to update the display, then it is
|
||||
* unnecessary to call loop().
|
||||
*
|
||||
* \sa refresh(), disableTimer2(), enableTimer1(), setDoubleBuffer()
|
||||
*/
|
||||
void DMD::enableTimer2()
|
||||
{
|
||||
// Configure Timer2 for the period we want. With the prescaler set
|
||||
// to 128, then 256 increments of Timer2 gives roughly 4 ms between
|
||||
// overflows on a system with a 16 MHz clock. We adjust the prescaler
|
||||
// accordingly for other clock frequencies.
|
||||
TCCR2A = 0;
|
||||
if (F_CPU >= 32000000)
|
||||
TCCR2B = _BV(CS22) | _BV(CS21); // Prescaler = 256
|
||||
else if (F_CPU >= 16000000)
|
||||
TCCR2B = _BV(CS22) | _BV(CS20); // Prescaler = 128
|
||||
else if (F_CPU >= 8000000)
|
||||
TCCR2B = _BV(CS22); // Prescaler = 64
|
||||
else
|
||||
TCCR2B = _BV(CS21) | _BV(CS20); // Prescaler = 32
|
||||
|
||||
// Reset Timer2 to kick off the process.
|
||||
TCNT2 = 0;
|
||||
|
||||
// Turn on the Timer2 overflow interrupt (also turn off OCIE2A and OCIE2B).
|
||||
TIMSK2 = _BV(TOIE2);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables Timer2 overflow interrupts.
|
||||
*
|
||||
* \sa enableTimer2()
|
||||
*/
|
||||
void DMD::disableTimer2()
|
||||
{
|
||||
// Turn off the Timer2 overflow interrupt.
|
||||
TIMSK2 &= ~_BV(TOIE2);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Converts an RGB value into a pixel color value.
|
||||
*
|
||||
* Returns \ref White if any of \a r, \a g, or \a b are non-zero;
|
||||
* otherwise returns \ref Black.
|
||||
*
|
||||
* This function is provided for upwards compatibility with future
|
||||
* displays that support full color. Monochrome applications should
|
||||
* use the \ref Black and \ref White constants directly.
|
||||
*/
|
||||
DMD::Color DMD::fromRGB(uint8_t r, uint8_t g, uint8_t b)
|
||||
{
|
||||
if (r || g || b)
|
||||
return White;
|
||||
else
|
||||
return Black;
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef DMD_h
|
||||
#define DMD_h
|
||||
|
||||
#include "Bitmap.h"
|
||||
|
||||
class DMD : public Bitmap
|
||||
{
|
||||
public:
|
||||
explicit DMD(int widthPanels = 1, int heightPanels = 1);
|
||||
~DMD();
|
||||
|
||||
bool doubleBuffer() const { return _doubleBuffer; }
|
||||
void setDoubleBuffer(bool doubleBuffer);
|
||||
void swapBuffers();
|
||||
void swapBuffersAndCopy();
|
||||
|
||||
void loop();
|
||||
void refresh();
|
||||
|
||||
void enableTimer1();
|
||||
void disableTimer1();
|
||||
|
||||
void enableTimer2();
|
||||
void disableTimer2();
|
||||
|
||||
static Color fromRGB(uint8_t r, uint8_t g, uint8_t b);
|
||||
|
||||
private:
|
||||
// Disable copy constructor and operator=().
|
||||
DMD(const DMD &other) : Bitmap(other) {}
|
||||
DMD &operator=(const DMD &) { return *this; }
|
||||
|
||||
bool _doubleBuffer;
|
||||
uint8_t phase;
|
||||
uint8_t *fb0;
|
||||
uint8_t *fb1;
|
||||
uint8_t *displayfb;
|
||||
unsigned long lastRefresh;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,166 +0,0 @@
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* DejaVuSans9
|
||||
*
|
||||
* created with FontCreator
|
||||
* written by F. Maximilian Thiele
|
||||
*
|
||||
* http://www.apetech.de/fontCreator
|
||||
* me@apetech.de
|
||||
*
|
||||
* File Name : DejaVuSans9.h
|
||||
* Date : 28.05.2012
|
||||
* Font size in bytes : 3962
|
||||
* Font width : 10
|
||||
* Font height : 10
|
||||
* Font first char : 32
|
||||
* Font last char : 128
|
||||
* Font used chars : 96
|
||||
*
|
||||
* The font data are defined as
|
||||
*
|
||||
* struct _FONT_ {
|
||||
* uint16_t font_Size_in_Bytes_over_all_included_Size_it_self;
|
||||
* uint8_t font_Width_in_Pixel_for_fixed_drawing;
|
||||
* uint8_t font_Height_in_Pixel_for_all_characters;
|
||||
* unit8_t font_First_Char;
|
||||
* uint8_t font_Char_Count;
|
||||
*
|
||||
* uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1];
|
||||
* // for each character the separate width in pixels,
|
||||
* // characters < 128 have an implicit virtual right empty row
|
||||
*
|
||||
* uint8_t font_data[];
|
||||
* // bit field of all characters
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifndef DEJAVUSANS9_H
|
||||
#define DEJAVUSANS9_H
|
||||
|
||||
#define DEJAVUSANS9_WIDTH 10
|
||||
#define DEJAVUSANS9_HEIGHT 10
|
||||
|
||||
static uint8_t const DejaVuSans9[] PROGMEM = {
|
||||
0x0F, 0x7A, // size
|
||||
0x0A, // width
|
||||
0x0A, // height
|
||||
0x20, // first char
|
||||
0x60, // char count
|
||||
|
||||
// char widths
|
||||
0x00, 0x01, 0x03, 0x06, 0x05, 0x08, 0x06, 0x01, 0x02, 0x02,
|
||||
0x05, 0x05, 0x01, 0x02, 0x01, 0x03, 0x04, 0x03, 0x04, 0x04,
|
||||
0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x06, 0x06,
|
||||
0x06, 0x04, 0x08, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05,
|
||||
0x05, 0x01, 0x02, 0x05, 0x04, 0x06, 0x05, 0x05, 0x04, 0x05,
|
||||
0x05, 0x05, 0x05, 0x05, 0x06, 0x07, 0x06, 0x05, 0x05, 0x02,
|
||||
0x03, 0x02, 0x04, 0x05, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04,
|
||||
0x03, 0x04, 0x04, 0x01, 0x02, 0x04, 0x01, 0x07, 0x04, 0x04,
|
||||
0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x05, 0x07, 0x05, 0x05,
|
||||
0x04, 0x03, 0x01, 0x03, 0x06, 0x05,
|
||||
|
||||
// font data
|
||||
0xBE, 0x00, // 33
|
||||
0x06, 0x00, 0x06, 0x00, 0x00, 0x00, // 34
|
||||
0x28, 0xE8, 0x3E, 0xE8, 0x3E, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35
|
||||
0x98, 0x94, 0xFE, 0xA4, 0x64, 0x00, 0x00, 0x40, 0x00, 0x00, // 36
|
||||
0x1E, 0x12, 0xDE, 0x30, 0x18, 0xF6, 0x90, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37
|
||||
0x60, 0x9C, 0x92, 0x62, 0xC4, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38
|
||||
0x06, 0x00, // 39
|
||||
0x7E, 0x81, 0x00, 0x00, // 40
|
||||
0xC3, 0x3C, 0x00, 0x00, // 41
|
||||
0x12, 0x0C, 0x1E, 0x0C, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, // 42
|
||||
0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // 43
|
||||
0x80, 0x40, // 44
|
||||
0x20, 0x20, 0x00, 0x00, // 45
|
||||
0x80, 0x00, // 46
|
||||
0xC0, 0x38, 0x06, 0x00, 0x00, 0x00, // 47
|
||||
0x7C, 0x82, 0x82, 0x7C, 0x00, 0x00, 0x00, 0x00, // 48
|
||||
0x82, 0xFE, 0x80, 0x00, 0x00, 0x00, // 49
|
||||
0xC4, 0xA2, 0x92, 0x8C, 0x00, 0x00, 0x00, 0x00, // 50
|
||||
0x84, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x00, // 51
|
||||
0x60, 0x58, 0x44, 0xFE, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // 52
|
||||
0x9E, 0x92, 0x92, 0x62, 0x00, 0x00, 0x00, 0x00, // 53
|
||||
0x7C, 0x96, 0x92, 0x62, 0x00, 0x00, 0x00, 0x00, // 54
|
||||
0x02, 0xC2, 0x3A, 0x06, 0x00, 0x00, 0x00, 0x00, // 55
|
||||
0x6C, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x00, // 56
|
||||
0x9C, 0x92, 0xD2, 0x7C, 0x00, 0x00, 0x00, 0x00, // 57
|
||||
0x88, 0x00, // 58
|
||||
0x88, 0x40, // 59
|
||||
0x20, 0x20, 0x50, 0x50, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 60
|
||||
0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61
|
||||
0x88, 0x50, 0x50, 0x50, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 62
|
||||
0x02, 0xB2, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, // 63
|
||||
0x78, 0x84, 0x32, 0x4A, 0x4A, 0xFA, 0x44, 0x38, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // 64
|
||||
0xC0, 0x38, 0x26, 0x26, 0x38, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65
|
||||
0xFE, 0x92, 0x92, 0x92, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, // 66
|
||||
0x7C, 0xC6, 0x82, 0x82, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, // 67
|
||||
0xFE, 0x82, 0x82, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, // 68
|
||||
0xFE, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, // 69
|
||||
0xFE, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, // 70
|
||||
0x7C, 0xC6, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, // 71
|
||||
0xFE, 0x10, 0x10, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, // 72
|
||||
0xFE, 0x00, // 73
|
||||
0x00, 0xFE, 0x80, 0x40, // 74
|
||||
0xFE, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, // 75
|
||||
0xFE, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, // 76
|
||||
0xFE, 0x0C, 0x30, 0x30, 0x0C, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77
|
||||
0xFE, 0x0C, 0x10, 0x60, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, // 78
|
||||
0x7C, 0xC6, 0x82, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, // 79
|
||||
0xFE, 0x12, 0x12, 0x0C, 0x00, 0x00, 0x00, 0x00, // 80
|
||||
0x7C, 0xC6, 0x82, 0xC6, 0x7C, 0x00, 0x00, 0x00, 0x40, 0x00, // 81
|
||||
0xFE, 0x12, 0x32, 0x4E, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // 82
|
||||
0x4C, 0x92, 0x92, 0x92, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, // 83
|
||||
0x02, 0x02, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 84
|
||||
0x7E, 0x80, 0x80, 0x80, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, // 85
|
||||
0x06, 0x38, 0xC0, 0xC0, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 86
|
||||
0x06, 0x38, 0xE0, 0x1E, 0xE0, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87
|
||||
0x82, 0x46, 0x38, 0x38, 0xC6, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88
|
||||
0x02, 0x0C, 0xF0, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 89
|
||||
0xC2, 0xA2, 0x92, 0x8A, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, // 90
|
||||
0xFE, 0x02, 0x40, 0x40, // 91
|
||||
0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, // 92
|
||||
0x02, 0xFE, 0x40, 0x40, // 93
|
||||
0x04, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, // 94
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, // 95
|
||||
0x01, 0x02, 0x00, 0x00, // 96
|
||||
0xE0, 0xA8, 0xA8, 0xF8, 0x00, 0x00, 0x00, 0x00, // 97
|
||||
0xFF, 0x88, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, // 98
|
||||
0x70, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // 99
|
||||
0x70, 0x88, 0x88, 0xFF, 0x00, 0x00, 0x00, 0x00, // 100
|
||||
0x70, 0xA8, 0xA8, 0xB0, 0x00, 0x00, 0x00, 0x00, // 101
|
||||
0x08, 0xFF, 0x09, 0x00, 0x00, 0x00, // 102
|
||||
0x70, 0x88, 0x88, 0xF8, 0x00, 0x80, 0x80, 0x40, // 103
|
||||
0xFF, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, // 104
|
||||
0xFA, 0x00, // 105
|
||||
0x00, 0xFA, 0x80, 0xC0, // 106
|
||||
0xFF, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, // 107
|
||||
0xFF, 0x00, // 108
|
||||
0xF8, 0x08, 0x08, 0xF8, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109
|
||||
0xF8, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, // 110
|
||||
0x70, 0x88, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, // 111
|
||||
0xF8, 0x88, 0x88, 0x70, 0xC0, 0x00, 0x00, 0x00, // 112
|
||||
0x70, 0x88, 0x88, 0xF8, 0x00, 0x00, 0x00, 0xC0, // 113
|
||||
0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, // 114
|
||||
0x98, 0xA8, 0xE8, 0x00, 0x00, 0x00, // 115
|
||||
0x08, 0xFC, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // 116
|
||||
0xF8, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, 0x00, // 117
|
||||
0x18, 0x60, 0x80, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, // 118
|
||||
0x38, 0xC0, 0x30, 0x08, 0x30, 0xC0, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119
|
||||
0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // 120
|
||||
0x18, 0x60, 0x80, 0x60, 0x18, 0x80, 0x80, 0x40, 0x00, 0x00, // 121
|
||||
0x88, 0xC8, 0xA8, 0x98, 0x00, 0x00, 0x00, 0x00, // 122
|
||||
0x10, 0xEE, 0x02, 0x00, 0x40, 0x40, // 123
|
||||
0xFE, 0xC0, // 124
|
||||
0x02, 0xEE, 0x10, 0x40, 0x40, 0x00, // 125
|
||||
0x20, 0x10, 0x10, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126
|
||||
0xFC, 0x04, 0x04, 0x04, 0xFC, 0xC0, 0x80, 0x80, 0x80, 0xC0 // 127
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,166 +0,0 @@
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* DejaVuSansBold9
|
||||
*
|
||||
* created with FontCreator
|
||||
* written by F. Maximilian Thiele
|
||||
*
|
||||
* http://www.apetech.de/fontCreator
|
||||
* me@apetech.de
|
||||
*
|
||||
* File Name : DejaVuSansBold9.h
|
||||
* Date : 28.05.2012
|
||||
* Font size in bytes : 4662
|
||||
* Font width : 10
|
||||
* Font height : 10
|
||||
* Font first char : 32
|
||||
* Font last char : 128
|
||||
* Font used chars : 96
|
||||
*
|
||||
* The font data are defined as
|
||||
*
|
||||
* struct _FONT_ {
|
||||
* uint16_t font_Size_in_Bytes_over_all_included_Size_it_self;
|
||||
* uint8_t font_Width_in_Pixel_for_fixed_drawing;
|
||||
* uint8_t font_Height_in_Pixel_for_all_characters;
|
||||
* unit8_t font_First_Char;
|
||||
* uint8_t font_Char_Count;
|
||||
*
|
||||
* uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1];
|
||||
* // for each character the separate width in pixels,
|
||||
* // characters < 128 have an implicit virtual right empty row
|
||||
*
|
||||
* uint8_t font_data[];
|
||||
* // bit field of all characters
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifndef DEJAVUSANSBOLD9_H
|
||||
#define DEJAVUSANSBOLD9_H
|
||||
|
||||
#define DEJAVUSANSBOLD9_WIDTH 10
|
||||
#define DEJAVUSANSBOLD9_HEIGHT 10
|
||||
|
||||
static uint8_t const DejaVuSansBold9[] PROGMEM = {
|
||||
0x12, 0x36, // size
|
||||
0x0A, // width
|
||||
0x0A, // height
|
||||
0x20, // first char
|
||||
0x60, // char count
|
||||
|
||||
// char widths
|
||||
0x00, 0x02, 0x03, 0x06, 0x05, 0x08, 0x07, 0x01, 0x03, 0x03,
|
||||
0x05, 0x05, 0x02, 0x03, 0x02, 0x03, 0x05, 0x05, 0x05, 0x05,
|
||||
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 0x02, 0x06, 0x06,
|
||||
0x06, 0x04, 0x08, 0x07, 0x05, 0x06, 0x06, 0x05, 0x05, 0x06,
|
||||
0x07, 0x02, 0x03, 0x06, 0x05, 0x07, 0x06, 0x06, 0x05, 0x06,
|
||||
0x06, 0x05, 0x06, 0x06, 0x07, 0x09, 0x07, 0x06, 0x06, 0x03,
|
||||
0x03, 0x03, 0x04, 0x05, 0x02, 0x05, 0x05, 0x04, 0x05, 0x05,
|
||||
0x04, 0x05, 0x05, 0x02, 0x03, 0x05, 0x02, 0x08, 0x05, 0x05,
|
||||
0x05, 0x05, 0x03, 0x04, 0x03, 0x05, 0x06, 0x08, 0x06, 0x06,
|
||||
0x04, 0x04, 0x01, 0x04, 0x06, 0x05,
|
||||
|
||||
// font data
|
||||
0xDE, 0xDE, 0x00, 0x00, // 33
|
||||
0x06, 0x00, 0x06, 0x00, 0x00, 0x00, // 34
|
||||
0x28, 0xF8, 0x2E, 0xF8, 0x2E, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35
|
||||
0x98, 0xB4, 0xFE, 0xB4, 0x64, 0x00, 0x00, 0x40, 0x00, 0x00, // 36
|
||||
0x0C, 0x12, 0xD2, 0x7C, 0x78, 0x96, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37
|
||||
0x60, 0xFC, 0x9E, 0xB2, 0x62, 0xE0, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38
|
||||
0x06, 0x00, // 39
|
||||
0x3C, 0xFF, 0x81, 0x00, 0x00, 0x00, // 40
|
||||
0x81, 0xFF, 0x3C, 0x00, 0x00, 0x00, // 41
|
||||
0x14, 0x18, 0x3E, 0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, // 42
|
||||
0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // 43
|
||||
0xC0, 0xC0, 0x40, 0x00, // 44
|
||||
0x20, 0x20, 0x20, 0x00, 0x00, 0x00, // 45
|
||||
0xC0, 0xC0, 0x00, 0x00, // 46
|
||||
0xC0, 0x38, 0x06, 0x00, 0x00, 0x00, // 47
|
||||
0x7C, 0xFE, 0x82, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, // 48
|
||||
0x82, 0x82, 0xFE, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // 49
|
||||
0xC2, 0xE2, 0xB2, 0x9E, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, // 50
|
||||
0x82, 0x92, 0x92, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, // 51
|
||||
0x60, 0x58, 0x44, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, // 52
|
||||
0x9E, 0x9E, 0x92, 0xF2, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, // 53
|
||||
0x7C, 0xFE, 0x96, 0xF2, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, // 54
|
||||
0x82, 0xE2, 0x7A, 0x1E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, // 55
|
||||
0x6C, 0xEE, 0x92, 0xEE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, // 56
|
||||
0x8C, 0x9E, 0xD2, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, // 57
|
||||
0xD8, 0xD8, 0x00, 0x00, // 58
|
||||
0xD8, 0xD8, 0x40, 0x00, // 59
|
||||
0x20, 0x50, 0x50, 0x50, 0xD8, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 60
|
||||
0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61
|
||||
0x88, 0xD8, 0x50, 0x50, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 62
|
||||
0x02, 0xDA, 0xDE, 0x0E, 0x00, 0x00, 0x00, 0x00, // 63
|
||||
0x78, 0x84, 0x32, 0x4A, 0x4A, 0xFA, 0x44, 0x38, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, // 64
|
||||
0x80, 0xF0, 0x7E, 0x4E, 0x7E, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65
|
||||
0xFE, 0xFE, 0x92, 0xFE, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, // 66
|
||||
0x38, 0x7C, 0xC6, 0x82, 0x82, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 67
|
||||
0xFE, 0xFE, 0x82, 0x82, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 68
|
||||
0xFE, 0xFE, 0x92, 0x92, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, // 69
|
||||
0xFE, 0xFE, 0x12, 0x12, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, // 70
|
||||
0x78, 0xFC, 0x86, 0x92, 0xF2, 0xF6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 71
|
||||
0xFE, 0xFE, 0x10, 0x10, 0x10, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 72
|
||||
0xFE, 0xFE, 0x00, 0x00, // 73
|
||||
0x00, 0xFE, 0xFE, 0x80, 0xC0, 0x40, // 74
|
||||
0xFE, 0xFE, 0x38, 0x6C, 0xC6, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 75
|
||||
0xFE, 0xFE, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, // 76
|
||||
0xFE, 0xFE, 0x0C, 0x30, 0x0C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77
|
||||
0xFE, 0xFE, 0x0C, 0x30, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78
|
||||
0x7C, 0xFE, 0x82, 0x82, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 79
|
||||
0xFE, 0xFE, 0x12, 0x1E, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, // 80
|
||||
0x7C, 0xFE, 0x82, 0x82, 0xFE, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, // 81
|
||||
0xFE, 0xFE, 0x12, 0x7E, 0xEC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 82
|
||||
0xCC, 0x9E, 0x92, 0xF2, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, // 83
|
||||
0x02, 0x02, 0xFE, 0xFE, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 84
|
||||
0x7E, 0xFE, 0x80, 0x80, 0xFE, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 85
|
||||
0x02, 0x1E, 0xF8, 0xC0, 0xF8, 0x1E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 86
|
||||
0x0E, 0xFE, 0xE0, 0x3C, 0x06, 0x3C, 0xE0, 0xFE, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87
|
||||
0x82, 0xC6, 0x7C, 0x10, 0x7C, 0xC6, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88
|
||||
0x06, 0x0E, 0xF8, 0xF8, 0x0E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89
|
||||
0xC2, 0xE2, 0xB2, 0x9A, 0x8E, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90
|
||||
0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, // 91
|
||||
0x06, 0x38, 0xC0, 0x00, 0x00, 0x00, // 92
|
||||
0x81, 0xFF, 0xFF, 0x00, 0x00, 0x00, // 93
|
||||
0x04, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, // 94
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, // 95
|
||||
0x01, 0x02, 0x00, 0x00, // 96
|
||||
0xE8, 0xE8, 0xA8, 0xF8, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, // 97
|
||||
0xFF, 0xFF, 0x88, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, // 98
|
||||
0x70, 0xF8, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, // 99
|
||||
0x70, 0xF8, 0x88, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, // 100
|
||||
0x70, 0xF8, 0xA8, 0xB8, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, // 101
|
||||
0x08, 0xFE, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, // 102
|
||||
0x70, 0xF8, 0x88, 0xF8, 0xF8, 0x00, 0x80, 0x80, 0xC0, 0x40, // 103
|
||||
0xFF, 0xFF, 0x08, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, // 104
|
||||
0xFB, 0xFB, 0x00, 0x00, // 105
|
||||
0x00, 0xFB, 0xFB, 0x80, 0xC0, 0x40, // 106
|
||||
0xFF, 0xFF, 0x70, 0xD8, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // 107
|
||||
0xFF, 0xFF, 0x00, 0x00, // 108
|
||||
0xF8, 0xF8, 0x08, 0xF8, 0xF8, 0x08, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109
|
||||
0xF8, 0xF8, 0x08, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, // 110
|
||||
0x70, 0xF8, 0x88, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, // 111
|
||||
0xF8, 0xF8, 0x88, 0xF8, 0x70, 0xC0, 0xC0, 0x00, 0x00, 0x00, // 112
|
||||
0x70, 0xF8, 0x88, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0xC0, 0xC0, // 113
|
||||
0xF8, 0xF8, 0x08, 0x00, 0x00, 0x00, // 114
|
||||
0xB0, 0xB8, 0xE8, 0x68, 0x00, 0x00, 0x00, 0x00, // 115
|
||||
0xFC, 0xFC, 0x88, 0x00, 0x00, 0x00, // 116
|
||||
0xF8, 0xF8, 0x80, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, // 117
|
||||
0x18, 0x78, 0xC0, 0xC0, 0x78, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 118
|
||||
0x18, 0xF8, 0xE0, 0x38, 0x38, 0xE0, 0xF8, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119
|
||||
0x88, 0xD8, 0x70, 0x70, 0xD8, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 120
|
||||
0x08, 0x38, 0xE0, 0xE0, 0x38, 0x08, 0x00, 0x80, 0xC0, 0x00, 0x00, 0x00, // 121
|
||||
0xC8, 0xE8, 0xB8, 0x98, 0x00, 0x00, 0x00, 0x00, // 122
|
||||
0x08, 0xFF, 0xF7, 0x81, 0x00, 0x00, 0x00, 0x00, // 123
|
||||
0xFE, 0xC0, // 124
|
||||
0x81, 0xF7, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, // 125
|
||||
0x20, 0x10, 0x10, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126
|
||||
0xFC, 0x04, 0x04, 0x04, 0xFC, 0xC0, 0x80, 0x80, 0x80, 0xC0 // 127
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,166 +0,0 @@
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* DejaVuSansItalic9
|
||||
*
|
||||
* created with FontCreator
|
||||
* written by F. Maximilian Thiele
|
||||
*
|
||||
* http://www.apetech.de/fontCreator
|
||||
* me@apetech.de
|
||||
*
|
||||
* File Name : DejaVuSansItalic9.h
|
||||
* Date : 28.05.2012
|
||||
* Font size in bytes : 4572
|
||||
* Font width : 10
|
||||
* Font height : 10
|
||||
* Font first char : 32
|
||||
* Font last char : 128
|
||||
* Font used chars : 96
|
||||
*
|
||||
* The font data are defined as
|
||||
*
|
||||
* struct _FONT_ {
|
||||
* uint16_t font_Size_in_Bytes_over_all_included_Size_it_self;
|
||||
* uint8_t font_Width_in_Pixel_for_fixed_drawing;
|
||||
* uint8_t font_Height_in_Pixel_for_all_characters;
|
||||
* unit8_t font_First_Char;
|
||||
* uint8_t font_Char_Count;
|
||||
*
|
||||
* uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1];
|
||||
* // for each character the separate width in pixels,
|
||||
* // characters < 128 have an implicit virtual right empty row
|
||||
*
|
||||
* uint8_t font_data[];
|
||||
* // bit field of all characters
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifndef DEJAVUSANSITALIC9_H
|
||||
#define DEJAVUSANSITALIC9_H
|
||||
|
||||
#define DEJAVUSANSITALIC9_WIDTH 10
|
||||
#define DEJAVUSANSITALIC9_HEIGHT 10
|
||||
|
||||
static uint8_t const DejaVuSansItalic9[] PROGMEM = {
|
||||
0x11, 0xDC, // size
|
||||
0x0A, // width
|
||||
0x0A, // height
|
||||
0x20, // first char
|
||||
0x60, // char count
|
||||
|
||||
// char widths
|
||||
0x00, 0x03, 0x03, 0x06, 0x04, 0x07, 0x06, 0x01, 0x03, 0x03,
|
||||
0x05, 0x05, 0x01, 0x03, 0x01, 0x03, 0x05, 0x04, 0x05, 0x05,
|
||||
0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x02, 0x02, 0x06, 0x06,
|
||||
0x06, 0x04, 0x08, 0x06, 0x05, 0x06, 0x06, 0x05, 0x05, 0x06,
|
||||
0x07, 0x03, 0x03, 0x06, 0x04, 0x08, 0x07, 0x06, 0x05, 0x06,
|
||||
0x05, 0x06, 0x05, 0x06, 0x05, 0x08, 0x06, 0x05, 0x06, 0x04,
|
||||
0x02, 0x04, 0x04, 0x05, 0x02, 0x05, 0x05, 0x04, 0x06, 0x05,
|
||||
0x03, 0x05, 0x05, 0x03, 0x03, 0x05, 0x03, 0x08, 0x05, 0x05,
|
||||
0x05, 0x05, 0x04, 0x04, 0x03, 0x05, 0x05, 0x07, 0x05, 0x05,
|
||||
0x05, 0x04, 0x01, 0x05, 0x06, 0x05,
|
||||
|
||||
// font data
|
||||
0x80, 0x38, 0x06, 0x00, 0x00, 0x00, // 33
|
||||
0x06, 0x00, 0x06, 0x00, 0x00, 0x00, // 34
|
||||
0x20, 0xF8, 0x2E, 0xF8, 0x2E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 35
|
||||
0x98, 0xDC, 0xA6, 0x64, 0x00, 0x40, 0x00, 0x00, // 36
|
||||
0x1C, 0xD2, 0x2E, 0x10, 0xEC, 0x92, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 37
|
||||
0x60, 0x9C, 0x92, 0xA2, 0x64, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 38
|
||||
0x06, 0x00, // 39
|
||||
0xF8, 0x06, 0x01, 0x00, 0x00, 0x00, // 40
|
||||
0x80, 0x61, 0x1E, 0x00, 0x00, 0x00, // 41
|
||||
0x12, 0x0C, 0x1E, 0x0C, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, // 42
|
||||
0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // 43
|
||||
0x80, 0x00, // 44
|
||||
0x20, 0x20, 0x20, 0x00, 0x00, 0x00, // 45
|
||||
0x80, 0x00, // 46
|
||||
0x60, 0x30, 0x0C, 0x00, 0x00, 0x00, // 47
|
||||
0x78, 0x84, 0x82, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, // 48
|
||||
0x80, 0x82, 0xF2, 0x8E, 0x00, 0x00, 0x00, 0x00, // 49
|
||||
0x80, 0xC4, 0xA2, 0x92, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, // 50
|
||||
0x40, 0x84, 0x92, 0x92, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, // 51
|
||||
0x40, 0x70, 0xC8, 0x7C, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, // 52
|
||||
0x80, 0x9C, 0x92, 0x92, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, // 53
|
||||
0x78, 0x94, 0x92, 0x72, 0x00, 0x00, 0x00, 0x00, // 54
|
||||
0x82, 0x42, 0x32, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 55
|
||||
0x60, 0xAC, 0x92, 0x92, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, // 56
|
||||
0x80, 0x9C, 0x92, 0x72, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, // 57
|
||||
0x80, 0x08, 0x00, 0x00, // 58
|
||||
0x80, 0x08, 0x00, 0x00, // 59
|
||||
0x20, 0x20, 0x50, 0x50, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 60
|
||||
0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 61
|
||||
0x88, 0x50, 0x50, 0x50, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 62
|
||||
0x82, 0x32, 0x0A, 0x06, 0x00, 0x00, 0x00, 0x00, // 63
|
||||
0xE0, 0x18, 0xE8, 0x94, 0x94, 0xF4, 0xCC, 0x78, 0x40, 0xC0, 0x80, 0x80, 0x80, 0x40, 0x00, 0x00, // 64
|
||||
0x80, 0x60, 0x38, 0x24, 0x3E, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 65
|
||||
0xC0, 0xB8, 0x96, 0x92, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, // 66
|
||||
0x78, 0x84, 0x82, 0x82, 0x82, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 67
|
||||
0xC0, 0xB8, 0x86, 0x82, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 68
|
||||
0xC0, 0xB8, 0x96, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 69
|
||||
0xC0, 0x38, 0x16, 0x12, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 70
|
||||
0x78, 0x84, 0x82, 0x82, 0x92, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 71
|
||||
0xC0, 0x38, 0x16, 0x10, 0xD0, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 72
|
||||
0xC0, 0x38, 0x06, 0x00, 0x00, 0x00, // 73
|
||||
0x00, 0xF0, 0x0E, 0xC0, 0x00, 0x00, // 74
|
||||
0xC0, 0x38, 0x16, 0x68, 0x84, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 75
|
||||
0xC0, 0xB8, 0x86, 0x80, 0x00, 0x00, 0x00, 0x00, // 76
|
||||
0xC0, 0x38, 0x06, 0x38, 0x10, 0xC8, 0x3C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 77
|
||||
0xC0, 0x38, 0x06, 0x38, 0xC0, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 78
|
||||
0x78, 0x84, 0x82, 0x82, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 79
|
||||
0xC0, 0x38, 0x16, 0x12, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, // 80
|
||||
0x78, 0x84, 0x82, 0x82, 0x42, 0x3C, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, // 81
|
||||
0xC0, 0x38, 0x16, 0x72, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, // 82
|
||||
0x40, 0x8C, 0x92, 0x92, 0x62, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 83
|
||||
0x02, 0xC2, 0x3A, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 84
|
||||
0x78, 0x86, 0x80, 0x80, 0x78, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 85
|
||||
0x0E, 0xF0, 0x40, 0x30, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, // 86
|
||||
0xFE, 0x60, 0x1C, 0x02, 0xFE, 0x60, 0x1C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 87
|
||||
0x80, 0x42, 0x2C, 0x10, 0x6C, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 88
|
||||
0x02, 0xCC, 0x30, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 89
|
||||
0x80, 0xC2, 0xA2, 0x92, 0x8A, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 90
|
||||
0xC0, 0xBC, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, // 91
|
||||
0x1E, 0xE0, 0x00, 0x00, // 92
|
||||
0x80, 0xC0, 0x3D, 0x03, 0x00, 0x00, 0x00, 0x00, // 93
|
||||
0x04, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, // 94
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, // 95
|
||||
0x01, 0x02, 0x00, 0x00, // 96
|
||||
0xC0, 0xA8, 0xA8, 0xE8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, // 97
|
||||
0xC0, 0x7C, 0x93, 0x88, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, // 98
|
||||
0xF0, 0x98, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, // 99
|
||||
0xF0, 0x98, 0x88, 0xC8, 0x3C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 100
|
||||
0x70, 0xB8, 0xA8, 0xA8, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // 101
|
||||
0xC8, 0x3E, 0x09, 0x00, 0x00, 0x00, // 102
|
||||
0xF0, 0x98, 0x88, 0xC8, 0x38, 0x80, 0x80, 0x80, 0x40, 0x00, // 103
|
||||
0xC0, 0x3C, 0x13, 0xC8, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, // 104
|
||||
0xE0, 0x38, 0x01, 0x00, 0x00, 0x00, // 105
|
||||
0xC0, 0x38, 0x01, 0xC0, 0x00, 0x00, // 106
|
||||
0xC0, 0x3C, 0x23, 0xD0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // 107
|
||||
0xC0, 0x3C, 0x03, 0x00, 0x00, 0x00, // 108
|
||||
0xE0, 0x18, 0x08, 0xC8, 0x78, 0x10, 0xC8, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 109
|
||||
0xE0, 0x38, 0x08, 0xC8, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, // 110
|
||||
0x70, 0x98, 0x88, 0xC8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, // 111
|
||||
0xE0, 0x98, 0x88, 0xC8, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, // 112
|
||||
0xF0, 0x88, 0x88, 0xF0, 0x18, 0x00, 0x00, 0xC0, 0x00, 0x00, // 113
|
||||
0xE0, 0x38, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, // 114
|
||||
0x80, 0xB8, 0xA8, 0xE8, 0x00, 0x00, 0x00, 0x00, // 115
|
||||
0xF8, 0x8C, 0x08, 0x00, 0x00, 0x00, // 116
|
||||
0xE0, 0x98, 0x80, 0xE0, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, // 117
|
||||
0x38, 0xC0, 0x60, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // 118
|
||||
0xF8, 0x60, 0x10, 0xF8, 0x40, 0x30, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 119
|
||||
0x80, 0x48, 0x30, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, // 120
|
||||
0x00, 0xF8, 0x60, 0x10, 0x08, 0x80, 0x40, 0x00, 0x00, 0x00, // 121
|
||||
0x80, 0xC8, 0xA8, 0x98, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // 122
|
||||
0x08, 0xF8, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, // 123
|
||||
0xFE, 0xC0, // 124
|
||||
0x80, 0x80, 0x71, 0x0F, 0x08, 0x00, 0x00, 0x40, 0x00, 0x00, // 125
|
||||
0x20, 0x10, 0x10, 0x20, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 126
|
||||
0xFC, 0x04, 0x04, 0x04, 0xFC, 0xC0, 0x80, 0x80, 0x80, 0xC0 // 127
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,155 +0,0 @@
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* Mono5x7
|
||||
*
|
||||
* created with FontCreator
|
||||
* written by F. Maximilian Thiele
|
||||
*
|
||||
* http://www.apetech.de/fontCreator
|
||||
* me@apetech.de
|
||||
*
|
||||
* File Name : Mono5x7.h
|
||||
* Date : 29.05.2012
|
||||
* Font size in bytes : 3462
|
||||
* Font width : 5
|
||||
* Font height : 7
|
||||
* Font first char : 32
|
||||
* Font last char : 128
|
||||
* Font used chars : 96
|
||||
*
|
||||
* The font data are defined as
|
||||
*
|
||||
* struct _FONT_ {
|
||||
* uint16_t font_Size_in_Bytes_over_all_included_Size_it_self;
|
||||
* uint8_t font_Width_in_Pixel_for_fixed_drawing;
|
||||
* uint8_t font_Height_in_Pixel_for_all_characters;
|
||||
* unit8_t font_First_Char;
|
||||
* uint8_t font_Char_Count;
|
||||
*
|
||||
* uint8_t font_Char_Widths[font_Last_Char - font_First_Char +1];
|
||||
* // for each character the separate width in pixels,
|
||||
* // characters < 128 have an implicit virtual right empty row
|
||||
*
|
||||
* uint8_t font_data[];
|
||||
* // bit field of all characters
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
#ifndef MONO5X7_H
|
||||
#define MONO5X7_H
|
||||
|
||||
#define MONO5X7_WIDTH 5
|
||||
#define MONO5X7_HEIGHT 7
|
||||
|
||||
static uint8_t const Mono5x7[] PROGMEM = {
|
||||
0x00, 0x00, // size
|
||||
0x05, // width
|
||||
0x07, // height
|
||||
0x20, // first char
|
||||
0x60, // char count
|
||||
|
||||
// font data
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, // 32
|
||||
0x00, 0x00, 0x5F, 0x00, 0x00, // 33
|
||||
0x00, 0x07, 0x00, 0x07, 0x00, // 34
|
||||
0x14, 0x7F, 0x14, 0x7F, 0x14, // 35
|
||||
0x24, 0x2A, 0x7F, 0x2A, 0x12, // 36
|
||||
0x23, 0x13, 0x08, 0x64, 0x62, // 37
|
||||
0x36, 0x49, 0x55, 0x22, 0x50, // 38
|
||||
0x00, 0x05, 0x03, 0x00, 0x00, // 39
|
||||
0x00, 0x1C, 0x22, 0x41, 0x00, // 40
|
||||
0x00, 0x41, 0x22, 0x1C, 0x00, // 41
|
||||
0x14, 0x08, 0x3E, 0x08, 0x14, // 42
|
||||
0x08, 0x08, 0x3E, 0x08, 0x08, // 43
|
||||
0x00, 0x50, 0x30, 0x00, 0x00, // 44
|
||||
0x08, 0x08, 0x08, 0x08, 0x08, // 45
|
||||
0x00, 0x60, 0x60, 0x00, 0x00, // 46
|
||||
0x20, 0x10, 0x08, 0x04, 0x02, // 47
|
||||
0x3E, 0x51, 0x49, 0x45, 0x3E, // 48
|
||||
0x00, 0x42, 0x7F, 0x40, 0x00, // 49
|
||||
0x42, 0x61, 0x51, 0x49, 0x46, // 50
|
||||
0x21, 0x41, 0x45, 0x4B, 0x31, // 51
|
||||
0x18, 0x14, 0x12, 0x7F, 0x10, // 52
|
||||
0x27, 0x45, 0x45, 0x45, 0x39, // 53
|
||||
0x3C, 0x4A, 0x49, 0x49, 0x30, // 54
|
||||
0x01, 0x71, 0x09, 0x05, 0x03, // 55
|
||||
0x36, 0x49, 0x49, 0x49, 0x36, // 56
|
||||
0x06, 0x49, 0x49, 0x29, 0x1E, // 57
|
||||
0x00, 0x36, 0x36, 0x00, 0x00, // 58
|
||||
0x00, 0x56, 0x36, 0x00, 0x00, // 59
|
||||
0x08, 0x14, 0x22, 0x41, 0x00, // 60
|
||||
0x14, 0x14, 0x14, 0x14, 0x14, // 61
|
||||
0x00, 0x41, 0x22, 0x14, 0x08, // 62
|
||||
0x02, 0x01, 0x51, 0x09, 0x06, // 63
|
||||
0x32, 0x49, 0x79, 0x41, 0x3E, // 64
|
||||
0x7E, 0x11, 0x11, 0x11, 0x7E, // 65
|
||||
0x7F, 0x49, 0x49, 0x49, 0x36, // 66
|
||||
0x3E, 0x41, 0x41, 0x41, 0x22, // 67
|
||||
0x7F, 0x41, 0x41, 0x22, 0x1C, // 68
|
||||
0x7F, 0x49, 0x49, 0x49, 0x41, // 69
|
||||
0x7F, 0x09, 0x09, 0x09, 0x01, // 70
|
||||
0x3E, 0x41, 0x49, 0x49, 0x78, // 71
|
||||
0x7F, 0x08, 0x08, 0x08, 0x7F, // 72
|
||||
0x00, 0x41, 0x7F, 0x41, 0x00, // 73
|
||||
0x20, 0x40, 0x41, 0x3F, 0x01, // 74
|
||||
0x7F, 0x08, 0x14, 0x22, 0x41, // 75
|
||||
0x7F, 0x40, 0x40, 0x40, 0x40, // 76
|
||||
0x7F, 0x02, 0x0C, 0x02, 0x7F, // 77
|
||||
0x7F, 0x04, 0x08, 0x10, 0x7F, // 78
|
||||
0x3E, 0x41, 0x41, 0x41, 0x3E, // 79
|
||||
0x7F, 0x09, 0x09, 0x09, 0x06, // 80
|
||||
0x3E, 0x41, 0x51, 0x21, 0x5E, // 81
|
||||
0x7F, 0x09, 0x19, 0x29, 0x46, // 82
|
||||
0x46, 0x49, 0x49, 0x49, 0x31, // 83
|
||||
0x01, 0x01, 0x7F, 0x01, 0x01, // 84
|
||||
0x3F, 0x40, 0x40, 0x40, 0x3F, // 85
|
||||
0x1F, 0x20, 0x40, 0x20, 0x1F, // 86
|
||||
0x3F, 0x40, 0x38, 0x40, 0x3F, // 87
|
||||
0x63, 0x14, 0x08, 0x14, 0x63, // 88
|
||||
0x07, 0x08, 0x70, 0x08, 0x07, // 89
|
||||
0x61, 0x51, 0x49, 0x45, 0x43, // 90
|
||||
0x00, 0x7F, 0x41, 0x41, 0x00, // 91
|
||||
0x02, 0x04, 0x08, 0x10, 0x20, // 92
|
||||
0x00, 0x41, 0x41, 0x7F, 0x00, // 93
|
||||
0x04, 0x02, 0x01, 0x02, 0x04, // 94
|
||||
0x40, 0x40, 0x40, 0x40, 0x40, // 95
|
||||
0x00, 0x02, 0x04, 0x08, 0x00, // 96
|
||||
0x20, 0x54, 0x54, 0x54, 0x78, // 97
|
||||
0x7F, 0x48, 0x44, 0x44, 0x38, // 98
|
||||
0x38, 0x44, 0x44, 0x44, 0x20, // 99
|
||||
0x38, 0x44, 0x44, 0x48, 0x7F, // 100
|
||||
0x38, 0x54, 0x54, 0x54, 0x18, // 101
|
||||
0x08, 0x7E, 0x09, 0x01, 0x02, // 102
|
||||
0x0C, 0x52, 0x52, 0x52, 0x3E, // 103
|
||||
0x7F, 0x08, 0x04, 0x04, 0x78, // 104
|
||||
0x00, 0x44, 0x7D, 0x40, 0x00, // 105
|
||||
0x20, 0x40, 0x44, 0x3D, 0x00, // 106
|
||||
0x7F, 0x10, 0x28, 0x44, 0x00, // 107
|
||||
0x00, 0x41, 0x7F, 0x40, 0x00, // 108
|
||||
0x7C, 0x04, 0x18, 0x04, 0x78, // 109
|
||||
0x7C, 0x08, 0x04, 0x04, 0x78, // 110
|
||||
0x38, 0x44, 0x44, 0x44, 0x38, // 111
|
||||
0x7C, 0x14, 0x14, 0x14, 0x08, // 112
|
||||
0x08, 0x14, 0x14, 0x18, 0x7C, // 113
|
||||
0x7C, 0x08, 0x04, 0x04, 0x08, // 114
|
||||
0x48, 0x54, 0x54, 0x54, 0x20, // 115
|
||||
0x04, 0x3F, 0x44, 0x40, 0x00, // 116
|
||||
0x3C, 0x40, 0x40, 0x20, 0x7C, // 117
|
||||
0x1C, 0x20, 0x40, 0x20, 0x1C, // 118
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, // 119
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, // 120
|
||||
0x0C, 0x50, 0x50, 0x50, 0x3C, // 121
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, // 122
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, // 123
|
||||
0x00, 0x00, 0x7F, 0x00, 0x00, // 124
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, // 125
|
||||
0x08, 0x04, 0x08, 0x10, 0x08, // 126
|
||||
0x00, 0x00, 0x00, 0x00, 0x00 // 127
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,36 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 2700 4500 2700 4500 3375 3375 3375 3375 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 2700 6075 2700 6075 3375 4950 3375 4950 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 2700 7650 2700 7650 3375 6525 3375 6525 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 2700 9225 2700 9225 3375 8100 3375 8100 2700
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4950 3060 4500 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6525 3060 6075 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
8100 3060 7650 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
9900 3060 9225 3060
|
||||
2 2 0 1 0 26 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
9900 2835 10800 2835 10800 3285 9900 3285 9900 2835
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 675 10035 3105 Arduino\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 8370 3105 Panel 4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 6795 3105 Panel 3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 5220 3105 Panel 2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 3645 3105 Panel 1\001
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@@ -1,60 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
9900 3060 9225 3060
|
||||
2 2 0 1 0 26 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
9900 2835 10800 2835 10800 3285 9900 3285 9900 2835
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 1575 4500 1575 4500 2250 3375 2250 3375 1575
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 1575 6075 1575 6075 2250 4950 2250 4950 1575
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 1575 9225 1575 9225 2250 8100 2250 8100 1575
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
7650 1935 8100 1935
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 1575 7650 1575 7650 2250 6525 2250 6525 1575
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6075 1935 6525 1935
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4500 1935 4950 1935
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 4
|
||||
1 1 3.00 60.00 120.00
|
||||
3375 3015 2925 3015 2925 1890 3375 1890
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 2700 4500 2700 4500 3375 3375 3375 3375 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 2700 6075 2700 6075 3375 4950 3375 4950 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 2700 7650 2700 7650 3375 6525 3375 6525 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 2700 9225 2700 9225 3375 8100 3375 8100 2700
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4950 3060 4500 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6525 3060 6075 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
8100 3060 7650 3060
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 675 10035 3105 Arduino\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 8370 3105 Panel 8\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 6795 3105 Panel 7\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 5220 3105 Panel 6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 3645 3105 Panel 5\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 4230 1845 Panel 4\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 5805 1845 Panel 3\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 7380 1845 Panel 2\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 8955 1845 Panel 1\001
|
||||
|
Before Width: | Height: | Size: 4.7 KiB |
@@ -1,84 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
9900 3060 9225 3060
|
||||
2 2 0 1 0 26 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
9900 2835 10800 2835 10800 3285 9900 3285 9900 2835
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 1575 4500 1575 4500 2250 3375 2250 3375 1575
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 1575 6075 1575 6075 2250 4950 2250 4950 1575
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 1575 9225 1575 9225 2250 8100 2250 8100 1575
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
7650 1935 8100 1935
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 1575 7650 1575 7650 2250 6525 2250 6525 1575
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6075 1935 6525 1935
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4500 1935 4950 1935
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 4
|
||||
1 1 3.00 60.00 120.00
|
||||
3375 3015 2925 3015 2925 1890 3375 1890
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 4
|
||||
1 1 3.00 60.00 120.00
|
||||
9225 1890 9675 1890 9675 765 9225 765
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 450 4500 450 4500 1125 3375 1125 3375 450
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 450 6075 450 6075 1125 4950 1125 4950 450
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 450 7650 450 7650 1125 6525 1125 6525 450
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 450 9225 450 9225 1125 8100 1125 8100 450
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4950 810 4500 810
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6525 810 6075 810
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
8100 810 7650 810
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
3375 2700 4500 2700 4500 3375 3375 3375 3375 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
4950 2700 6075 2700 6075 3375 4950 3375 4950 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
6525 2700 7650 2700 7650 3375 6525 3375 6525 2700
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 1 0 -1 0 0 5
|
||||
8100 2700 9225 2700 9225 3375 8100 3375 8100 2700
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
4950 3060 4500 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
6525 3060 6075 3060
|
||||
2 1 0 4 11 7 50 -1 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 3.00 60.00 120.00
|
||||
8100 3060 7650 3060
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 675 10035 3105 Arduino\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 3645 3105 Panel 9\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 705 5175 3105 Panel 10\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 705 6750 3105 Panel 11\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 705 8325 3105 Panel 12\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 8955 1845 Panel 5\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 7380 1845 Panel 6\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 5805 1845 Panel 7\001
|
||||
4 0 0 50 -1 0 12 3.1416 4 135 600 4230 1845 Panel 8\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 3645 855 Panel 1\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 5220 855 Panel 2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 6795 855 Panel 3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 600 8370 855 Panel 4\001
|
||||
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,53 +0,0 @@
|
||||
Description of the interface to the Freetronics Dot Matrix Display (DMD)
|
||||
========================================================================
|
||||
|
||||
Pins:
|
||||
D6: A - interleave phase select LSB
|
||||
D7: B - interleave phase select MSB (set the MSB first)
|
||||
D8: SCLK - this is the "latch" pin that copies all previously transferred
|
||||
data from the shift register to the actual display. Normally low,
|
||||
then flip to high and then low again to latch the data.
|
||||
D9: nOE - Output enable (when low).
|
||||
D10: Conflict detect (if it goes low, something else is using SPI)
|
||||
This is the standard SPI SS - Slave select - pin.
|
||||
D11: R - this is the standard SPI MOSI - Master out, slave in - pin.
|
||||
D12: MISO - master in, slave out - unused
|
||||
D13: CLK - standard Serial Clock pin for SPI
|
||||
|
||||
Initialisation:
|
||||
SPI: bit order = MSB-first, data mode = 0, clock divider = 128
|
||||
(use a smaller clock divider, such as 2, for better performance
|
||||
when driving multiple displays)
|
||||
|
||||
Set A, B, CLK, SCLK, and nOE to LOW outputs
|
||||
Set R to HIGH output
|
||||
|
||||
phase = 0
|
||||
|
||||
Every 5ms, do the following to refresh the display:
|
||||
Send the bytes for 4 interleaved rows based on phase, via SPI:
|
||||
phase == 0: 0, 4, 8, 12 (actually sent in the order 12, 8, 4, 0)
|
||||
phase == 1: 1, 5, 9, 13
|
||||
phase == 2: 2, 6, 10, 14
|
||||
phase == 3: 3, 7, 11, 15
|
||||
Then latch the data for the rows as follows:
|
||||
Set nOE to LOW
|
||||
Set SCLK to HIGH and then back to LOW
|
||||
Set A and B to indicate the current phase
|
||||
Set nOE to HIGH
|
||||
Finally, increment the phase, wrapping around from 3 to 0
|
||||
The above code assumes the following memory organisation:
|
||||
The display is W panels wide and H panels high.
|
||||
Each panel is 32 pixels wide (4 bytes) and 16 pixels high.
|
||||
Memory is organised as W * H * 4 bytes for each row, and 16 rows.
|
||||
That is, the 2D arrangement of panels is flattened into 1D for
|
||||
clocking the data out.
|
||||
In addition, a 1 bit in memory is a LED that is *off*.
|
||||
|
||||
Other things:
|
||||
Multiple panels need to be daisy-chained in the order N, ..., 1 with N
|
||||
plugged into the connector board on the Arduino and 1 at the end of
|
||||
the daisy-chain. Because the shipped cables are short, multiple rows
|
||||
can be oriented in alternating order with odd-numbered rows
|
||||
(counting from 1) upside-down and reversed. More details here:
|
||||
http://www.adebenham.com/category/arduino/dmd/
|
||||
@@ -1,144 +0,0 @@
|
||||
/*
|
||||
This example demonstrates how to use the DMD and related classes to
|
||||
draw things on a Freetronics Large Dot Matrix Display.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <DMD.h>
|
||||
#include <DejaVuSans9.h>
|
||||
#include <DejaVuSansBold9.h>
|
||||
#include <DejaVuSansItalic9.h>
|
||||
#include <Mono5x7.h>
|
||||
|
||||
DMD display;
|
||||
|
||||
ISR(TIMER1_OVF_vect)
|
||||
{
|
||||
display.refresh();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
display.enableTimer1();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
drawShapes();
|
||||
delay(1000);
|
||||
|
||||
drawBricks();
|
||||
delay(1000);
|
||||
|
||||
drawStickFigures();
|
||||
delay(1000);
|
||||
|
||||
drawText();
|
||||
delay(1000);
|
||||
|
||||
drawBoldText();
|
||||
delay(1000);
|
||||
|
||||
drawItalicText();
|
||||
delay(1000);
|
||||
|
||||
drawMonoText();
|
||||
delay(1000);
|
||||
|
||||
drawMarquee();
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void drawShapes()
|
||||
{
|
||||
display.clear();
|
||||
display.drawCircle(6, 8, 3);
|
||||
display.drawFilledCircle(16, 8, 3);
|
||||
display.drawLine(22, 5, 28, 11);
|
||||
display.drawLine(28, 5, 22, 11);
|
||||
display.drawRect(0, 0, display.width() - 1, display.height() - 1);
|
||||
}
|
||||
|
||||
void drawBricks()
|
||||
{
|
||||
static const uint8_t bricks[] PROGMEM = {
|
||||
16, 6,
|
||||
B11111111, B11111111,
|
||||
B10000000, B10000000,
|
||||
B10000000, B10000000,
|
||||
B11111111, B11111111,
|
||||
B00001000, B00001000,
|
||||
B00001000, B00001000
|
||||
};
|
||||
display.fill(0, 0, display.width(), display.height(), bricks);
|
||||
}
|
||||
|
||||
void drawStickFigures()
|
||||
{
|
||||
static const uint8_t stickFigure[] PROGMEM = {
|
||||
9, 13,
|
||||
B00111110, B00000000,
|
||||
B01000001, B00000000,
|
||||
B01000001, B00000000,
|
||||
B00111110, B00000000,
|
||||
B00001000, B00000000,
|
||||
B00001000, B00000000,
|
||||
B11111111, B10000000,
|
||||
B00001000, B00000000,
|
||||
B00001000, B00000000,
|
||||
B00010100, B00000000,
|
||||
B00100010, B00000000,
|
||||
B01000001, B00000000,
|
||||
B10000000, B10000000
|
||||
};
|
||||
display.clear();
|
||||
display.drawBitmap(2, 1, stickFigure);
|
||||
display.drawInvertedBitmap(12, 1, stickFigure);
|
||||
display.drawBitmap(22, 1, stickFigure);
|
||||
}
|
||||
|
||||
void drawText()
|
||||
{
|
||||
display.clear();
|
||||
display.setFont(DejaVuSans9);
|
||||
display.drawText(0, 0, "Hello");
|
||||
display.drawText(9, 8, "World");
|
||||
}
|
||||
|
||||
void drawBoldText()
|
||||
{
|
||||
display.clear();
|
||||
display.setFont(DejaVuSansBold9);
|
||||
display.drawText(0, 0, "Hello");
|
||||
display.drawText(4, 8, "World");
|
||||
}
|
||||
|
||||
void drawItalicText()
|
||||
{
|
||||
display.clear();
|
||||
display.setFont(DejaVuSansItalic9);
|
||||
display.drawText(0, 0, "Hello");
|
||||
display.drawText(2, 8, "World");
|
||||
}
|
||||
|
||||
void drawMonoText()
|
||||
{
|
||||
display.clear();
|
||||
display.setFont(Mono5x7);
|
||||
display.drawText(0, 0, "Hello");
|
||||
display.drawText(3, 8, "World");
|
||||
}
|
||||
|
||||
static const char message[] = "Eat at Joes!";
|
||||
|
||||
void drawMarquee()
|
||||
{
|
||||
int width = display.width();
|
||||
display.setFont(DejaVuSans9);
|
||||
int msgWidth = display.textWidth(message);
|
||||
int fullScroll = msgWidth + width + 1;
|
||||
for (int x = 0; x < fullScroll; ++x) {
|
||||
display.clear();
|
||||
display.drawText(width - x, 3, message);
|
||||
delay(50);
|
||||
}
|
||||
}
|
||||
@@ -1,261 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 <DMD.h>
|
||||
|
||||
DMD display;
|
||||
|
||||
// Running stick figure pictures are loosely based on those from this tutorial:
|
||||
// http://www.fluidanims.com/FAelite/phpBB3/viewtopic.php?f=10&t=102
|
||||
|
||||
byte const run1[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00001100,
|
||||
B00000000, B00011110,
|
||||
B00000111, B11111110,
|
||||
B00001111, B11111110,
|
||||
B00011100, B11111100,
|
||||
B00000001, B11111100,
|
||||
B00000001, B11110000,
|
||||
B00000011, B11111000,
|
||||
B00000111, B00011000,
|
||||
B00001110, B01110000,
|
||||
B00011100, B01100000,
|
||||
B00111000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B01000000, B00000000,
|
||||
B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run2[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B01110011, B10000000,
|
||||
B00000000, B11111111, B10000000,
|
||||
B00000000, B00011111, B10000000,
|
||||
B00000000, B00111111, B11000000,
|
||||
B00000000, B01111011, B11000000,
|
||||
B00000000, B11110011, B10000000,
|
||||
B00000001, B11100000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B00000111, B01110000, B00000000,
|
||||
B01111110, B00111000, B00000000,
|
||||
B11111100, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B00000001, B00000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run3[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00110000, B00000000,
|
||||
B00000000, B01111000, B00000000,
|
||||
B00000000, B00011111, B00000000,
|
||||
B00000000, B00011111, B00000000,
|
||||
B00000000, B00111111, B10000000,
|
||||
B00000000, B01111111, B11000000,
|
||||
B00000000, B11100011, B10000000,
|
||||
B00000001, B11000000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B11111111, B01110000, B00000000,
|
||||
B11111110, B00111000, B00000000,
|
||||
B00000000, B00011000, B00000000,
|
||||
B00000000, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000100, B00000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run4[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000001, B11100000,
|
||||
B00000011, B11111100,
|
||||
B00000000, B00111110,
|
||||
B00000000, B01111110,
|
||||
B00000000, B11111100,
|
||||
B00000001, B10011111,
|
||||
B00000011, B00001110,
|
||||
B00000011, B00000000,
|
||||
B00000011, B10000000,
|
||||
B11111111, B10000000,
|
||||
B11111000, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000011, B10000000,
|
||||
B00000111, B00000000,
|
||||
B00000110, B00000000,
|
||||
B00000100, B00000000
|
||||
};
|
||||
|
||||
byte const run5[] PROGMEM = {
|
||||
13, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00110000,
|
||||
B00000111, B11111000,
|
||||
B00000111, B11111000,
|
||||
B00000111, B11110000,
|
||||
B00001111, B11100000,
|
||||
B00000111, B00000000,
|
||||
B00001111, B00000000,
|
||||
B00001111, B00000000,
|
||||
B00001111, B10000000,
|
||||
B00011100, B00000000,
|
||||
B00111000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B11100000, B00000000,
|
||||
B11000000, B00000000,
|
||||
B10000000, B00000000
|
||||
};
|
||||
|
||||
byte const run6[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00011100,
|
||||
B00000000, B00111110,
|
||||
B00000001, B11111110,
|
||||
B00000000, B11100000,
|
||||
B00000001, B11100000,
|
||||
B00000001, B11111000,
|
||||
B00000011, B00011100,
|
||||
B00000110, B00111000,
|
||||
B00000110, B01110000,
|
||||
B00001100, B00100000,
|
||||
B00111000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B11000000, B00000000,
|
||||
B10000000, B00000000,
|
||||
B10000000, B00000000
|
||||
};
|
||||
|
||||
byte const run7[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B01111011, B10000000,
|
||||
B00000000, B01111111, B10000000,
|
||||
B00000000, B00001111, B00100000,
|
||||
B00000000, B00011001, B11000000,
|
||||
B00000000, B00110000, B11000000,
|
||||
B00000000, B01110000, B00000000,
|
||||
B00000001, B11110000, B00000000,
|
||||
B11111111, B10111000, B00000000,
|
||||
B11111111, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B00000001, B11000000,
|
||||
B00000000, B00000000, B01000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run8[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000001, B11101111, B00000000,
|
||||
B00000001, B11111111, B00000000,
|
||||
B00000000, B00111110, B00000000,
|
||||
B00000000, B01111111, B11000000,
|
||||
B00000000, B11100011, B10000000,
|
||||
B00000001, B11000000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B11111111, B01110000, B00000000,
|
||||
B11111110, B00111000, B00000000,
|
||||
B00000000, B00011100, B00000000,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B00000000,
|
||||
B00000000, B00000001, B00000000
|
||||
};
|
||||
|
||||
byte const run9[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B01001110,
|
||||
B00000001, B11101110,
|
||||
B00000011, B11111110,
|
||||
B00000011, B11111110,
|
||||
B00000001, B10111100,
|
||||
B00000011, B00000000,
|
||||
B00000111, B00000000,
|
||||
B11111111, B10000000,
|
||||
B11111100, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000
|
||||
};
|
||||
|
||||
byte const run10[] PROGMEM = {
|
||||
13, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00110000,
|
||||
B00000000, B01111000,
|
||||
B00000111, B11111000,
|
||||
B00001111, B11111000,
|
||||
B00000111, B11000000,
|
||||
B00001110, B00000000,
|
||||
B00001100, B00000000,
|
||||
B00001100, B00000000,
|
||||
B01111100, B00000000,
|
||||
B11111100, B00000000,
|
||||
B00011000, B00000000,
|
||||
B00110000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B01000000, B00000000
|
||||
};
|
||||
|
||||
Bitmap::ProgMem frames[] = {
|
||||
run1,
|
||||
run2,
|
||||
run3,
|
||||
run4,
|
||||
run5,
|
||||
run6,
|
||||
run7,
|
||||
run8,
|
||||
run9,
|
||||
run10
|
||||
};
|
||||
#define NUM_FRAMES (sizeof(frames) / sizeof(frames[0]))
|
||||
unsigned int frame = 0;
|
||||
|
||||
#define ADVANCE_MS (1000 / NUM_FRAMES)
|
||||
unsigned long lastFrame;
|
||||
|
||||
void setup() {
|
||||
lastFrame = millis() - ADVANCE_MS;
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if ((millis() - lastFrame) >= ADVANCE_MS) {
|
||||
display.clear();
|
||||
int x = (32 - pgm_read_byte(frames[frame])) / 2;
|
||||
display.drawBitmap(x, 0, frames[frame]);
|
||||
lastFrame += ADVANCE_MS;
|
||||
frame = (frame + 1) % NUM_FRAMES;
|
||||
}
|
||||
display.loop();
|
||||
}
|
||||
@@ -1,263 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 <DMD.h>
|
||||
|
||||
DMD display;
|
||||
|
||||
// Running stick figure pictures are loosely based on those from this tutorial:
|
||||
// http://www.fluidanims.com/FAelite/phpBB3/viewtopic.php?f=10&t=102
|
||||
|
||||
byte const run1[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00001100,
|
||||
B00000000, B00011110,
|
||||
B00000111, B11111110,
|
||||
B00001111, B11111110,
|
||||
B00011100, B11111100,
|
||||
B00000001, B11111100,
|
||||
B00000001, B11110000,
|
||||
B00000011, B11111000,
|
||||
B00000111, B00011000,
|
||||
B00001110, B01110000,
|
||||
B00011100, B01100000,
|
||||
B00111000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B01000000, B00000000,
|
||||
B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run2[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B01110011, B10000000,
|
||||
B00000000, B11111111, B10000000,
|
||||
B00000000, B00011111, B10000000,
|
||||
B00000000, B00111111, B11000000,
|
||||
B00000000, B01111011, B11000000,
|
||||
B00000000, B11110011, B10000000,
|
||||
B00000001, B11100000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B00000111, B01110000, B00000000,
|
||||
B01111110, B00111000, B00000000,
|
||||
B11111100, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B00000001, B00000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run3[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00110000, B00000000,
|
||||
B00000000, B01111000, B00000000,
|
||||
B00000000, B00011111, B00000000,
|
||||
B00000000, B00011111, B00000000,
|
||||
B00000000, B00111111, B10000000,
|
||||
B00000000, B01111111, B11000000,
|
||||
B00000000, B11100011, B10000000,
|
||||
B00000001, B11000000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B11111111, B01110000, B00000000,
|
||||
B11111110, B00111000, B00000000,
|
||||
B00000000, B00011000, B00000000,
|
||||
B00000000, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000100, B00000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run4[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000001, B11100000,
|
||||
B00000011, B11111100,
|
||||
B00000000, B00111110,
|
||||
B00000000, B01111110,
|
||||
B00000000, B11111100,
|
||||
B00000001, B10011111,
|
||||
B00000011, B00001110,
|
||||
B00000011, B00000000,
|
||||
B00000011, B10000000,
|
||||
B11111111, B10000000,
|
||||
B11111000, B11000000,
|
||||
B00000001, B11000000,
|
||||
B00000011, B10000000,
|
||||
B00000111, B00000000,
|
||||
B00000110, B00000000,
|
||||
B00000100, B00000000
|
||||
};
|
||||
|
||||
byte const run5[] PROGMEM = {
|
||||
13, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00110000,
|
||||
B00000111, B11111000,
|
||||
B00000111, B11111000,
|
||||
B00000111, B11110000,
|
||||
B00001111, B11100000,
|
||||
B00000111, B00000000,
|
||||
B00001111, B00000000,
|
||||
B00001111, B00000000,
|
||||
B00001111, B10000000,
|
||||
B00011100, B00000000,
|
||||
B00111000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B11100000, B00000000,
|
||||
B11000000, B00000000,
|
||||
B10000000, B00000000
|
||||
};
|
||||
|
||||
byte const run6[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00011100,
|
||||
B00000000, B00111110,
|
||||
B00000001, B11111110,
|
||||
B00000000, B11100000,
|
||||
B00000001, B11100000,
|
||||
B00000001, B11111000,
|
||||
B00000011, B00011100,
|
||||
B00000110, B00111000,
|
||||
B00000110, B01110000,
|
||||
B00001100, B00100000,
|
||||
B00111000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B11000000, B00000000,
|
||||
B10000000, B00000000,
|
||||
B10000000, B00000000
|
||||
};
|
||||
|
||||
byte const run7[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B01111011, B10000000,
|
||||
B00000000, B01111111, B10000000,
|
||||
B00000000, B00001111, B00100000,
|
||||
B00000000, B00011001, B11000000,
|
||||
B00000000, B00110000, B11000000,
|
||||
B00000000, B01110000, B00000000,
|
||||
B00000001, B11110000, B00000000,
|
||||
B11111111, B10111000, B00000000,
|
||||
B11111111, B00011100, B00000000,
|
||||
B00000000, B00001110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B10000000,
|
||||
B00000000, B00000001, B11000000,
|
||||
B00000000, B00000000, B01000000,
|
||||
B00000000, B00000000, B00000000
|
||||
};
|
||||
|
||||
byte const run8[] PROGMEM = {
|
||||
18, 16,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000001, B11101111, B00000000,
|
||||
B00000001, B11111111, B00000000,
|
||||
B00000000, B00111110, B00000000,
|
||||
B00000000, B01111111, B11000000,
|
||||
B00000000, B11100011, B10000000,
|
||||
B00000001, B11000000, B00000000,
|
||||
B00000011, B11100000, B00000000,
|
||||
B11111111, B01110000, B00000000,
|
||||
B11111110, B00111000, B00000000,
|
||||
B00000000, B00011100, B00000000,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000000, B00000110, B00000000,
|
||||
B00000000, B00000111, B00000000,
|
||||
B00000000, B00000011, B00000000,
|
||||
B00000000, B00000001, B00000000
|
||||
};
|
||||
|
||||
byte const run9[] PROGMEM = {
|
||||
16, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B01001110,
|
||||
B00000001, B11101110,
|
||||
B00000011, B11111110,
|
||||
B00000011, B11111110,
|
||||
B00000001, B10111100,
|
||||
B00000011, B00000000,
|
||||
B00000111, B00000000,
|
||||
B11111111, B10000000,
|
||||
B11111100, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000,
|
||||
B00000000, B11000000
|
||||
};
|
||||
|
||||
byte const run10[] PROGMEM = {
|
||||
13, 16,
|
||||
B00000000, B00000000,
|
||||
B00000000, B00110000,
|
||||
B00000000, B01111000,
|
||||
B00000111, B11111000,
|
||||
B00001111, B11111000,
|
||||
B00000111, B11000000,
|
||||
B00001110, B00000000,
|
||||
B00001100, B00000000,
|
||||
B00001100, B00000000,
|
||||
B01111100, B00000000,
|
||||
B11111100, B00000000,
|
||||
B00011000, B00000000,
|
||||
B00110000, B00000000,
|
||||
B01110000, B00000000,
|
||||
B01100000, B00000000,
|
||||
B01000000, B00000000
|
||||
};
|
||||
|
||||
Bitmap::ProgMem frames[] = {
|
||||
run1,
|
||||
run2,
|
||||
run3,
|
||||
run4,
|
||||
run5,
|
||||
run6,
|
||||
run7,
|
||||
run8,
|
||||
run9,
|
||||
run10
|
||||
};
|
||||
#define NUM_FRAMES (sizeof(frames) / sizeof(frames[0]))
|
||||
unsigned int frame = 0;
|
||||
|
||||
#define ADVANCE_MS (1000 / NUM_FRAMES)
|
||||
|
||||
ISR(TIMER1_OVF_vect)
|
||||
{
|
||||
display.refresh();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
display.enableTimer1();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
display.clear();
|
||||
int x = (32 - pgm_read_byte(frames[frame])) / 2;
|
||||
display.drawBitmap(x, 0, frames[frame]);
|
||||
frame = (frame + 1) % NUM_FRAMES;
|
||||
|
||||
delay(ADVANCE_MS);
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
DMD KEYWORD1
|
||||
Bitmap KEYWORD1
|
||||
|
||||
doubleBuffer KEYWORD2
|
||||
setDoubleBuffer KEYWORD2
|
||||
swapBuffers KEYWORD2
|
||||
swapBuffersAndCopy KEYWORD2
|
||||
refresh KEYWORD2
|
||||
enableTimer1 KEYWORD2
|
||||
disableTimer1 KEYWORD2
|
||||
|
||||
isValid KEYWORD2
|
||||
width KEYWORD2
|
||||
height KEYWORD2
|
||||
stride KEYWORD2
|
||||
bitsPerPixel KEYWORD2
|
||||
clear KEYWORD2
|
||||
pixel KEYWORD2
|
||||
setPixel KEYWORD2
|
||||
drawLine KEYWORD2
|
||||
drawRect KEYWORD2
|
||||
drawFilledRect KEYWORD2
|
||||
drawCircle KEYWORD2
|
||||
drawFilledCircle KEYWORD2
|
||||
drawBitmap KEYWORD2
|
||||
drawInvertedBitmap KEYWORD2
|
||||
font KEYWORD2
|
||||
setFont KEYWORD2
|
||||
textColor KEYWORD2
|
||||
setTextColor KEYWORD2
|
||||
drawText KEYWORD2
|
||||
drawChar KEYWORD2
|
||||
charWidth KEYWORD2
|
||||
textWidth KEYWORD2
|
||||
textHeight KEYWORD2
|
||||
copy KEYWORD2
|
||||
fill KEYWORD2
|
||||
scroll KEYWORD2
|
||||
invert KEYWORD2
|
||||
|
||||
Black LITERAL1
|
||||
White LITERAL1
|
||||
NoFill LITERAL1
|
||||
@@ -1,310 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "EEPROM24.h"
|
||||
#include "I2CMaster.h"
|
||||
|
||||
/**
|
||||
* \class EEPROM24 EEPROM24.h <EEPROM24.h>
|
||||
* \brief Reading and writing EEPROM's from the 24LCXX family.
|
||||
*
|
||||
* The 24LCXX family of EEPROM's provide a variety of memory sizes from
|
||||
* 16 bytes up to 128 kBytes that can be accessed via the I2C protocol.
|
||||
* These chips can be used to augment the 1 kByte or so of builtin EEPROM
|
||||
* memory that is typical on Arduino boards. The EEPROM should be wired
|
||||
* to an Arduino Uno as follows:
|
||||
*
|
||||
* \image html eeprom_circuit.png
|
||||
*
|
||||
* Access to a 24LCXX chip is initialized as follows:
|
||||
*
|
||||
* \code
|
||||
* SoftI2C i2c(A4, A5);
|
||||
* EEPROM24 eeprom(i2c, EEPROM_24LC256);
|
||||
* \endcode
|
||||
*
|
||||
* Once initialized, read() and write() can be used to manipulate the
|
||||
* contents of the EEPROM's memory.
|
||||
*
|
||||
* The following EEPROM types are supported by this class:
|
||||
*
|
||||
* <table>
|
||||
* <tr><td>Chip</td><td>Type</td><td>Size</td></tr>
|
||||
* <tr><td>24lc00</td><td>\c EEPROM_24LC00</td><td>16 bytes</td></tr>
|
||||
* <tr><td>24lc01</td><td>\c EEPROM_24LC01</td><td>128 bytes</td></tr>
|
||||
* <tr><td>24lc014</td><td>\c EEPROM_24LC014</td><td>128 bytes</td></tr>
|
||||
* <tr><td>24lc02</td><td>\c EEPROM_24LC02</td><td>256 bytes</td></tr>
|
||||
* <tr><td>24lc024</td><td>\c EEPROM_24LC024</td><td>256 bytes</td></tr>
|
||||
* <tr><td>24lc025</td><td>\c EEPROM_24LC025</td><td>256 bytes</td></tr>
|
||||
* <tr><td>24lc04</td><td>\c EEPROM_24LC04</td><td>512 bytes</td></tr>
|
||||
* <tr><td>24lc08</td><td>\c EEPROM_24LC08</td><td>1 kByte</td></tr>
|
||||
* <tr><td>24lc16</td><td>\c EEPROM_24LC16</td><td>2 kBytes</td></tr>
|
||||
* <tr><td>24lc32</td><td>\c EEPROM_24LC32</td><td>4 kBytes</td></tr>
|
||||
* <tr><td>24lc64</td><td>\c EEPROM_24LC64</td><td>8 kBytes</td></tr>
|
||||
* <tr><td>24lc128</td><td>\c EEPROM_24LC128</td><td>16 kBytes</td></tr>
|
||||
* <tr><td>24lc256</td><td>\c EEPROM_24LC256</td><td>32 kBytes</td></tr>
|
||||
* <tr><td>24lc512</td><td>\c EEPROM_24LC512</td><td>64 kBytes</td></tr>
|
||||
* <tr><td>24lc1025</td><td>\c EEPROM_24LC1025</td><td>128 kBytes</td></tr>
|
||||
* <tr><td>24lc1026</td><td>\c EEPROM_24LC1026</td><td>128 kBytes</td></tr>
|
||||
* </table>
|
||||
*
|
||||
* There can be multiple 24LCXX chips on the same I2C bus, as long as their
|
||||
* A0, A1, and A2 address pins are set to different values. For example,
|
||||
* two 24LC256 chips can be used to provide the same memory capacity as a
|
||||
* single 24LC512 chip. The optional <i>bank</i> parameter to the constructor
|
||||
* is used to assign different bank addresses to each chip:
|
||||
*
|
||||
* \code
|
||||
* SoftI2C i2c(A4, A5);
|
||||
* EEPROM24 eeprom0(i2c, EEPROM_24LC256, 0);
|
||||
* EEPROM24 eeprom1(i2c, EEPROM_24LC256, 1);
|
||||
* \endcode
|
||||
*
|
||||
* \sa I2CMaster
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new EEPROM access object on \a bus for an EEPROM
|
||||
* of the specified \a type.
|
||||
*
|
||||
* The \a bank can be used to choose between multiple EEPROM's on
|
||||
* \a bus of the specified \a type. The \a bank corresponds to the value
|
||||
* that is set on the EEPROM's A0, A1, and A2 address pins. Note that
|
||||
* some EEPROM's have less than 3 address pins; consult the datasheet
|
||||
* for more information.
|
||||
*/
|
||||
EEPROM24::EEPROM24(I2CMaster &bus, unsigned long type, uint8_t bank)
|
||||
: _bus(&bus)
|
||||
, _size((type & 0xFFFF) * ((type >> 16) & 0x0FFF))
|
||||
, _pageSize((type >> 16) & 0x0FFF)
|
||||
, _mode((uint8_t)((type >> 28) & 0x0F))
|
||||
, i2cAddress(0x50)
|
||||
{
|
||||
// Adjust the I2C address for the memory bank of the chip.
|
||||
switch (_mode) {
|
||||
case EE_BSEL_NONE:
|
||||
i2cAddress += (bank & 0x07);
|
||||
break;
|
||||
case EE_BSEL_8BIT_ADDR: {
|
||||
uint8_t addrBits = 8;
|
||||
unsigned long size = 0x0100;
|
||||
while (size < _size) {
|
||||
++addrBits;
|
||||
size <<= 1;
|
||||
}
|
||||
if (addrBits < 11)
|
||||
i2cAddress += ((bank << (addrBits - 8)) & 0x07);
|
||||
break; }
|
||||
case EE_BSEL_17BIT_ADDR:
|
||||
i2cAddress += ((bank << 1) & 0x06);
|
||||
break;
|
||||
case EE_BSEL_17BIT_ADDR_ALT:
|
||||
i2cAddress += bank & 0x03;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn unsigned long EEPROM24::size() const
|
||||
* \brief Returns the size of the EEPROM in bytes.
|
||||
*
|
||||
* \sa pageSize()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn unsigned long EEPROM24::pageSize() const
|
||||
* \brief Returns the size of a single EEPROM page in bytes.
|
||||
*
|
||||
* Writes that are a multiple of the page size and aligned on a page
|
||||
* boundary will typically be more efficient than non-aligned writes.
|
||||
*
|
||||
* \sa size()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Returns true if the EEPROM is available on the I2C bus;
|
||||
* false otherwise.
|
||||
*
|
||||
* This function can be used to probe the I2C bus to determine if the
|
||||
* EEPROM is present or not.
|
||||
*
|
||||
* \sa read(), write()
|
||||
*/
|
||||
bool EEPROM24::available()
|
||||
{
|
||||
// Perform a "Current Address Read" on the EEPROM. We don't care about
|
||||
// the returned byte. We only care if the read request was ACK'ed or not.
|
||||
if (!_bus->startRead(i2cAddress, 1))
|
||||
return false;
|
||||
_bus->read();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Reads a single byte from the EEPROM at \a address.
|
||||
*
|
||||
* \sa write()
|
||||
*/
|
||||
uint8_t EEPROM24::read(unsigned long address)
|
||||
{
|
||||
if (address >= _size)
|
||||
return 0;
|
||||
writeAddress(address);
|
||||
if (!_bus->startRead(i2cAddress, 1))
|
||||
return 0;
|
||||
return _bus->read();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Reads a block of \a length bytes from the EEPROM at \a address
|
||||
* into the specified \a data buffer.
|
||||
*
|
||||
* Returns the number of bytes that were read, which may be short if
|
||||
* \a address + \a length is greater than size() or the EEPROM is
|
||||
* not available on the I2C bus.
|
||||
*
|
||||
* \sa write(), available()
|
||||
*/
|
||||
size_t EEPROM24::read(unsigned long address, void *data, size_t length)
|
||||
{
|
||||
if (address >= _size || !length)
|
||||
return 0;
|
||||
if ((address + length) > _size)
|
||||
length = (size_t)(_size - address);
|
||||
writeAddress(address);
|
||||
if (!_bus->startRead(i2cAddress, length))
|
||||
return 0;
|
||||
uint8_t *d = (uint8_t *)data;
|
||||
unsigned int count = 0;
|
||||
while (_bus->available()) {
|
||||
*d++ = _bus->read();
|
||||
++count;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Writes a byte \a value to \a address in the EEPROM.
|
||||
*
|
||||
* Returns true if the byte was written successfully, or false if
|
||||
* \a address is out of range or the EEPROM is not available on the I2C bus.
|
||||
*
|
||||
* \sa read(), available()
|
||||
*/
|
||||
bool EEPROM24::write(unsigned long address, uint8_t value)
|
||||
{
|
||||
if (address >= _size)
|
||||
return false;
|
||||
writeAddress(address);
|
||||
_bus->write(value);
|
||||
return waitForWrite();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Writes \a length bytes from a \a data buffer to \a address
|
||||
* in the EEPROM.
|
||||
*
|
||||
* Returns the number of bytes that were written, which may be short if
|
||||
* \a address + \a length is greater than size() or the EEPROM is not
|
||||
* available on the I2C bus.
|
||||
*
|
||||
* Best performance will be achieved if \a address and \a length are a
|
||||
* multiple of pageSize().
|
||||
*
|
||||
* \sa read(), available(), pageSize()
|
||||
*/
|
||||
size_t EEPROM24::write(unsigned long address, const void *data, size_t length)
|
||||
{
|
||||
if (address >= _size)
|
||||
return 0;
|
||||
if ((address + length) > _size)
|
||||
length = (size_t)(_size - address);
|
||||
bool needAddress = true;
|
||||
size_t result = 0;
|
||||
size_t page = 0;
|
||||
const uint8_t *d = (const uint8_t *)data;
|
||||
while (length > 0) {
|
||||
if (needAddress) {
|
||||
writeAddress(address);
|
||||
needAddress = false;
|
||||
}
|
||||
_bus->write(*d++);
|
||||
++address;
|
||||
++page;
|
||||
if ((address & (_pageSize - 1)) == 0) {
|
||||
// At the end of a page, so perform a flush.
|
||||
if (!waitForWrite())
|
||||
return result; // Could not write this page.
|
||||
needAddress = true;
|
||||
result += page;
|
||||
page = 0;
|
||||
}
|
||||
--length;
|
||||
}
|
||||
if (!needAddress) {
|
||||
if (!waitForWrite())
|
||||
return result; // Could not write the final page.
|
||||
}
|
||||
return result + page;
|
||||
}
|
||||
|
||||
void EEPROM24::writeAddress(unsigned long address)
|
||||
{
|
||||
switch (_mode) {
|
||||
case EE_BSEL_NONE:
|
||||
_bus->startWrite(i2cAddress);
|
||||
_bus->write((uint8_t)(address >> 8));
|
||||
_bus->write((uint8_t)address);
|
||||
break;
|
||||
case EE_BSEL_8BIT_ADDR:
|
||||
_bus->startWrite(i2cAddress | (((uint8_t)(address >> 8)) & 0x07));
|
||||
_bus->write((uint8_t)address);
|
||||
break;
|
||||
case EE_BSEL_17BIT_ADDR:
|
||||
_bus->startWrite(i2cAddress | (((uint8_t)(address >> 16)) & 0x01));
|
||||
_bus->write((uint8_t)(address >> 8));
|
||||
_bus->write((uint8_t)address);
|
||||
break;
|
||||
case EE_BSEL_17BIT_ADDR_ALT:
|
||||
_bus->startWrite(i2cAddress | (((uint8_t)(address >> 14)) & 0x04));
|
||||
_bus->write((uint8_t)(address >> 8));
|
||||
_bus->write((uint8_t)address);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool EEPROM24::waitForWrite()
|
||||
{
|
||||
// 1000 iterations is going to be approximately 100ms when the I2C
|
||||
// clock is 100 kHz. If there has been no response in that time
|
||||
// then we assume that the write has failed and timeout.
|
||||
if (!_bus->endWrite())
|
||||
return false;
|
||||
unsigned count = 1000;
|
||||
while (count > 0) {
|
||||
_bus->startWrite(i2cAddress);
|
||||
if (_bus->endWrite())
|
||||
return true;
|
||||
--count;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef EEPROM24_h
|
||||
#define EEPROM24_h
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <stddef.h>
|
||||
|
||||
class I2CMaster;
|
||||
|
||||
// Block select modes.
|
||||
#define EE_BSEL_NONE 0
|
||||
#define EE_BSEL_8BIT_ADDR 1
|
||||
#define EE_BSEL_17BIT_ADDR 2
|
||||
#define EE_BSEL_17BIT_ADDR_ALT 3
|
||||
|
||||
// Create an EEPROM descriptor from byte size, page size, and block select mode.
|
||||
#define _EE24(byteSize, pageSize, mode) \
|
||||
(((byteSize) / (pageSize)) | (((unsigned long)(pageSize)) << 16) | \
|
||||
(((unsigned long)(mode)) << 28))
|
||||
|
||||
// Type descriptors for the 24LCXX range of EEPROM's.
|
||||
#define EEPROM_24LC00 _EE24(16UL, 1, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC01 _EE24(128UL, 8, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC014 _EE24(128UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC02 _EE24(256UL, 8, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC024 _EE24(256UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC025 _EE24(256UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC04 _EE24(512UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC08 _EE24(1024UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC16 _EE24(2048UL, 16, EE_BSEL_8BIT_ADDR)
|
||||
#define EEPROM_24LC32 _EE24(4096UL, 32, EE_BSEL_NONE)
|
||||
#define EEPROM_24LC64 _EE24(8192UL, 32, EE_BSEL_NONE)
|
||||
#define EEPROM_24LC128 _EE24(16384UL, 32, EE_BSEL_NONE)
|
||||
#define EEPROM_24LC256 _EE24(32768UL, 64, EE_BSEL_NONE)
|
||||
#define EEPROM_24LC512 _EE24(65536UL, 128, EE_BSEL_NONE)
|
||||
#define EEPROM_24LC1025 _EE24(131072UL, 128, EE_BSEL_17BIT_ADDR_ALT)
|
||||
#define EEPROM_24LC1026 _EE24(131072UL, 128, EE_BSEL_17BIT_ADDR)
|
||||
|
||||
class EEPROM24
|
||||
{
|
||||
public:
|
||||
EEPROM24(I2CMaster &bus, unsigned long type, uint8_t bank = 0);
|
||||
|
||||
unsigned long size() const { return _size; }
|
||||
unsigned long pageSize() const { return _pageSize; }
|
||||
|
||||
bool available();
|
||||
|
||||
uint8_t read(unsigned long address);
|
||||
size_t read(unsigned long address, void *data, size_t length);
|
||||
|
||||
bool write(unsigned long address, uint8_t value);
|
||||
size_t write(unsigned long address, const void *data, size_t length);
|
||||
|
||||
private:
|
||||
I2CMaster *_bus;
|
||||
unsigned long _size;
|
||||
unsigned long _pageSize;
|
||||
uint8_t _mode;
|
||||
uint8_t i2cAddress;
|
||||
|
||||
void writeAddress(unsigned long address);
|
||||
bool waitForWrite();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,89 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "I2CMaster.h"
|
||||
|
||||
/**
|
||||
* \class I2CMaster I2CMaster.h <I2CMaster.h>
|
||||
* \brief Abstract base class for I2C master implementations.
|
||||
*
|
||||
* \sa SoftI2C
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn unsigned int I2CMaster::maxTransferSize() const
|
||||
* \brief Returns the maximum number of bytes that can be read or written in a single request by this bus master.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void I2CMaster::startWrite(unsigned int address)
|
||||
* \brief Starts a write operation by sending a start condition and the I2C control byte.
|
||||
*
|
||||
* The \a address must be the 7-bit or 10-bit address of the I2C slave
|
||||
* on the bus.
|
||||
*
|
||||
* \sa write(), endWrite(), startRead()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void I2CMaster::write(uint8_t value)
|
||||
* \brief Writes a single byte \a value on the I2C bus.
|
||||
*
|
||||
* \sa startWrite(), endWrite()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn bool I2CMaster::endWrite()
|
||||
* \brief Ends the current write operation.
|
||||
*
|
||||
* Returns true if the write operation was acknowledged; false otherwise.
|
||||
*
|
||||
* \sa startWrite(), write()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn bool I2CMaster::startRead(unsigned int address, unsigned int count)
|
||||
* \brief Starts a read operation for \a count bytes by sending the start condition and the I2C control byte.
|
||||
*
|
||||
* The \a address must be the 7-bit or 10-bit address of the I2C slave
|
||||
* on the bus.
|
||||
*
|
||||
* Returns true if the read request was acknowledged by the I2C slave
|
||||
* or false otherwise. If true, this function should be followed by
|
||||
* \a count calls to read() to fetch the bytes.
|
||||
*
|
||||
* \sa available(), read(), startWrite()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn unsigned int I2CMaster::available()
|
||||
* \brief Returns the number of bytes that are still available for reading.
|
||||
*
|
||||
* \sa startRead(), read()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn uint8_t I2CMaster::read()
|
||||
* \brief Reads a single byte from the I2C bus.
|
||||
*
|
||||
* \sa startRead(), available()
|
||||
*/
|
||||
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef I2CMaster_h
|
||||
#define I2CMaster_h
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
class I2CMaster {
|
||||
public:
|
||||
virtual unsigned int maxTransferSize() const = 0;
|
||||
|
||||
virtual void startWrite(unsigned int address);
|
||||
virtual void write(uint8_t value) = 0;
|
||||
virtual bool endWrite() = 0;
|
||||
|
||||
virtual bool startRead(unsigned int address, unsigned int count) = 0;
|
||||
virtual unsigned int available() = 0;
|
||||
virtual uint8_t read() = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,202 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "SoftI2C.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \class SoftI2C SoftI2C.h <SoftI2C.h>
|
||||
* \brief Bit-banged implementation of an I2C master.
|
||||
*
|
||||
* This class implements the I2C master protocol on any arbitrary pair
|
||||
* of data and clock pins. It is not restricted to pre-defined pins as
|
||||
* is the case for the standard Arduino two-wire interface.
|
||||
*
|
||||
* This implementation only implements the master side of the protocol.
|
||||
* It assumes that there is a single bus master, no arbitration, and
|
||||
* no clock stretching.
|
||||
*
|
||||
* \sa I2CMaster
|
||||
*/
|
||||
|
||||
#define i2cDelay() delayMicroseconds(5)
|
||||
|
||||
/**
|
||||
* \brief Constructs a new software I2C master on \a dataPin and \a clockPin.
|
||||
*/
|
||||
SoftI2C::SoftI2C(uint8_t dataPin, uint8_t clockPin)
|
||||
: _dataPin(dataPin)
|
||||
, _clockPin(clockPin)
|
||||
, started(false)
|
||||
, acked(true)
|
||||
, inWrite(false)
|
||||
, readCount(0)
|
||||
{
|
||||
// Initially set the CLOCK and DATA lines to be outputs in the high state.
|
||||
pinMode(_clockPin, OUTPUT);
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
}
|
||||
|
||||
unsigned int SoftI2C::maxTransferSize() const
|
||||
{
|
||||
return 0xFFFF;
|
||||
}
|
||||
|
||||
void SoftI2C::start()
|
||||
{
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
if (started) {
|
||||
// Already started, so send a restart condition.
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
i2cDelay();
|
||||
}
|
||||
digitalWrite(_dataPin, LOW);
|
||||
i2cDelay();
|
||||
digitalWrite(_clockPin, LOW);
|
||||
i2cDelay();
|
||||
started = true;
|
||||
acked = true;
|
||||
}
|
||||
|
||||
void SoftI2C::stop()
|
||||
{
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
digitalWrite(_dataPin, LOW);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
i2cDelay();
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
i2cDelay();
|
||||
started = false;
|
||||
inWrite = false;
|
||||
}
|
||||
|
||||
#define I2C_WRITE 0x00
|
||||
#define I2C_WRITE10 0xF0
|
||||
#define I2C_READ 0x01
|
||||
#define I2C_READ10 0xF1
|
||||
|
||||
void SoftI2C::startWrite(unsigned int address)
|
||||
{
|
||||
start();
|
||||
inWrite = true;
|
||||
if (address < 0x80) {
|
||||
// 7-bit address.
|
||||
write((uint8_t)((address << 1) | I2C_WRITE));
|
||||
} else {
|
||||
// 10-bit address.
|
||||
write((uint8_t)(((address >> 7) & 0x06)) | I2C_WRITE10);
|
||||
write((uint8_t)address);
|
||||
}
|
||||
}
|
||||
|
||||
void SoftI2C::write(uint8_t value)
|
||||
{
|
||||
uint8_t mask = 0x80;
|
||||
while (mask != 0) {
|
||||
writeBit((value & mask) != 0);
|
||||
mask >>= 1;
|
||||
}
|
||||
if (readBit()) // 0: ACK, 1: NACK
|
||||
acked = false;
|
||||
}
|
||||
|
||||
bool SoftI2C::endWrite()
|
||||
{
|
||||
stop();
|
||||
return acked;
|
||||
}
|
||||
|
||||
bool SoftI2C::startRead(unsigned int address, unsigned int count)
|
||||
{
|
||||
start();
|
||||
inWrite = false;
|
||||
if (address < 0x80) {
|
||||
// 7-bit address.
|
||||
write((uint8_t)((address << 1) | I2C_READ));
|
||||
} else {
|
||||
// 10-bit address.
|
||||
write((uint8_t)(((address >> 7) & 0x06)) | I2C_READ10);
|
||||
write((uint8_t)address);
|
||||
}
|
||||
if (!acked) {
|
||||
readCount = 0;
|
||||
return false;
|
||||
}
|
||||
readCount = count;
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned int SoftI2C::available()
|
||||
{
|
||||
return readCount;
|
||||
}
|
||||
|
||||
uint8_t SoftI2C::read()
|
||||
{
|
||||
uint8_t value = 0;
|
||||
for (uint8_t bit = 0; bit < 8; ++bit)
|
||||
value = (value << 1) | readBit();
|
||||
if (readCount > 1) {
|
||||
// More bytes left to read - send an ACK.
|
||||
writeBit(false);
|
||||
--readCount;
|
||||
} else {
|
||||
// Last byte - send the NACK and a stop condition.
|
||||
writeBit(true);
|
||||
stop();
|
||||
readCount = 0;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
void SoftI2C::writeBit(bool bit)
|
||||
{
|
||||
pinMode(_dataPin, OUTPUT);
|
||||
if (bit)
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
else
|
||||
digitalWrite(_dataPin, LOW);
|
||||
i2cDelay();
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
i2cDelay();
|
||||
digitalWrite(_clockPin, LOW);
|
||||
i2cDelay();
|
||||
}
|
||||
|
||||
bool SoftI2C::readBit()
|
||||
{
|
||||
pinMode(_dataPin, INPUT);
|
||||
digitalWrite(_dataPin, HIGH);
|
||||
digitalWrite(_clockPin, HIGH);
|
||||
bool bit = digitalRead(_dataPin);
|
||||
i2cDelay();
|
||||
digitalWrite(_clockPin, LOW);
|
||||
i2cDelay();
|
||||
return bit;
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef SoftI2C_h
|
||||
#define SoftI2C_h
|
||||
|
||||
#include "I2CMaster.h"
|
||||
|
||||
class SoftI2C : public I2CMaster {
|
||||
public:
|
||||
SoftI2C(uint8_t dataPin, uint8_t clockPin);
|
||||
|
||||
unsigned int maxTransferSize() const;
|
||||
|
||||
void startWrite(unsigned int address);
|
||||
void write(uint8_t value);
|
||||
bool endWrite();
|
||||
|
||||
bool startRead(unsigned int address, unsigned int count);
|
||||
unsigned int available();
|
||||
uint8_t read();
|
||||
|
||||
private:
|
||||
uint8_t _dataPin;
|
||||
uint8_t _clockPin;
|
||||
bool started;
|
||||
bool acked;
|
||||
bool inWrite;
|
||||
unsigned int readCount;
|
||||
|
||||
void start();
|
||||
void stop();
|
||||
void writeBit(bool bit);
|
||||
bool readBit();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,100 +0,0 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5b
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 3105 3555 3195 3645
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3150 3600 30 30 3150 3600 3150 3630
|
||||
-6
|
||||
6 3105 3780 3195 3870
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3150 3825 30 30 3150 3825 3150 3855
|
||||
-6
|
||||
6 3105 4005 3195 4095
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 3150 4050 30 30 3150 4050 3150 4080
|
||||
-6
|
||||
6 3060 4095 3240 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3135 4365 3165 4365
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3100 4320 3200 4320
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3060 4275 3240 4275
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
3150 4095 3150 4275
|
||||
-6
|
||||
6 5400 3285 5715 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5580 3375 5715 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3375 5400 3375
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5580 3285 5580 3465
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5535 3285 5535 3465
|
||||
-6
|
||||
6 5760 3600 5940 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5835 3870 5865 3870
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5800 3825 5900 3825
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5760 3780 5940 3780
|
||||
2 1 0 1 0 -1 0 0 -1 0.000 0 0 -1 0 0 2
|
||||
5850 3600 5850 3780
|
||||
-6
|
||||
6 5130 3330 5220 3420
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5175 3375 30 30 5175 3375 5175 3405
|
||||
-6
|
||||
6 5805 3555 5895 3645
|
||||
1 3 0 1 0 -1 0 0 20 0.000 1 0.0000 5850 3600 30 30 5850 3600 5850 3630
|
||||
-6
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3150 3600 3825 3600
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3150 3825 3825 3825
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
3150 4050 3825 4050
|
||||
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
|
||||
3825 3150 4725 3150 4725 4275 3825 4275 3825 3150
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
3825 3375 3150 3375 3150 4140
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
|
||||
1 1 1.00 60.00 120.00
|
||||
4725 3375 5175 3375 5175 2700
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5400 3375 5085 3375
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
|
||||
5850 3375 5670 3375
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
|
||||
4725 3600 5850 3600 5850 3375
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
|
||||
1 1 1.00 60.00 120.00
|
||||
4725 4050 5175 4050 5175 4500
|
||||
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
|
||||
1 1 1.00 60.00 120.00
|
||||
4725 3825 5625 3825 5625 4500
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 3690 4005 4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 4770 4005 5\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 4770 3780 6\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 4770 3555 7\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 4770 3330 8\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 3690 3780 3\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 3690 3555 2\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 105 3690 3330 1\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 180 3870 3420 A0\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 180 3870 3645 A1\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 180 3870 3870 A2\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 315 3870 4095 GND\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 210 4500 3645 WP\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 285 4410 3420 VCC\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 255 4455 3870 SCL\001
|
||||
4 0 0 50 -1 0 8 0.0000 4 90 285 4455 4095 SDA\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 735 3915 3060 24LCXX\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 5040 2610 5V\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 525 5310 3195 100nF\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 5040 4680 A4\001
|
||||
4 0 0 50 -1 0 12 0.0000 4 135 240 5490 4680 A5\001
|
||||
|
Before Width: | Height: | Size: 4.9 KiB |
@@ -1,10 +0,0 @@
|
||||
I2CMaster KEYWORD1
|
||||
SoftI2C KEYWORD1
|
||||
|
||||
maxTransferSize KEYWORD2
|
||||
startWrite KEYWORD2
|
||||
write KEYWORD2
|
||||
endWrite KEYWORD2
|
||||
startRead KEYWORD2
|
||||
available KEYWORD2
|
||||
read KEYWORD2
|
||||
@@ -1,373 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "IRreceiver.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \class IRreceiver IRreceiver.h <IRreceiver.h>
|
||||
* \brief Manages the reception of RC-5 commands from an infrared remote control.
|
||||
*
|
||||
* IRreceiver recognizes commands in the <a href="http://en.wikipedia.org/wiki/RC-5">Philips RC-5 protocol</a>.
|
||||
* This is a fairly common infrared protocol, supported by most universal
|
||||
* remote controls. Program the universal remote to simulate a Philips
|
||||
* TV, VCR, CD player, etc.
|
||||
*
|
||||
* This class uses interrupts to process incoming bits from a standard 3-pin
|
||||
* infrared receiver:
|
||||
*
|
||||
* \image html irchip.jpg
|
||||
*
|
||||
* Typically, pin 1 of the receiver should be connected to the Arduino
|
||||
* interrupt pin (e.g. D2), pin 2 should be connected to GND, and pin 3
|
||||
* should be connected to 5V. Consult the datasheet for your receiver to
|
||||
* be sure though; some receivers may have different pin assignments.
|
||||
*
|
||||
* The receiver is initialized by constructing an instance of the
|
||||
* IRreceiver class:
|
||||
*
|
||||
* \code
|
||||
* IRreceiver ir;
|
||||
* \endcode
|
||||
*
|
||||
* By default, interrupt 0 on pin D2 is used. To change to another interrupt,
|
||||
* pass its number to the constructor:
|
||||
*
|
||||
* \code
|
||||
* IRreceiver ir(1); // Interrupt 1 on pin D3
|
||||
* \endcode
|
||||
*
|
||||
* Currently this class can only handle a single instance of IRreceiver being
|
||||
* active in the application. It isn't possible to have separate IRreceiver
|
||||
* instances on different pins. Usually this won't be a problem because
|
||||
* the same receiver can process inputs from multiple remotes.
|
||||
*
|
||||
* The application retrieves incoming infrared commands by calling the
|
||||
* command() function. The return value indicates the type of command:
|
||||
*
|
||||
* \code
|
||||
* void loop() {
|
||||
* switch (ir.command()) {
|
||||
* case RC5_0: case RC5_1: case RC5_2: case RC5_3: case RC5_4:
|
||||
* case RC5_5: case RC5_6: case RC5_7: case RC5_8: case RC5_9:
|
||||
* // Process a digit
|
||||
* ...
|
||||
* break;
|
||||
*
|
||||
* case RC5_ERASE:
|
||||
* // Backspace/erase last digit.
|
||||
* ...
|
||||
* break;
|
||||
*
|
||||
* case RC5_STANDBY:
|
||||
* // Power on/off button.
|
||||
* ...
|
||||
* break;
|
||||
* }
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If the command is an auto-repeat of a previous button press, then the
|
||||
* \ref AUTO_REPEAT flag will be set in the value returned from command().
|
||||
* The application can choose to ignore all auto-repeats, process all
|
||||
* auto-repeats, or choose which button to auto-repeat based on its code:
|
||||
*
|
||||
* \code
|
||||
* void loop() {
|
||||
* switch (ir.command()) {
|
||||
* case RC5_INC_VOLUME:
|
||||
* case IRreceiver::AUTO_REPEAT | RC5_INC_VOLUME:
|
||||
* // Volume increase button pressed or held.
|
||||
* ...
|
||||
* break;
|
||||
*
|
||||
* case RC5_DEC_VOLUME:
|
||||
* case IRreceiver::AUTO_REPEAT | RC5_DEC_VOLUME:
|
||||
* // Volume decrease button pressed or held.
|
||||
* ...
|
||||
* break;
|
||||
*
|
||||
* case RC5_MUTE:
|
||||
* // Mute button (ignore auto-repeat).
|
||||
* ...
|
||||
* break;
|
||||
* }
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* By default, command codes will be generated for every type of RC-5 remote
|
||||
* control, be it a TV, VCR, CD player, or something else. The application
|
||||
* can distinguish between the remote controls using system(); noting that
|
||||
* command() must be called before system() for the system value to be valid.
|
||||
* For example, the following code could be used in a two-player video game
|
||||
* where the first player's remote is configured as a TV and the second
|
||||
* player's remote is configured as a VCR:
|
||||
*
|
||||
* \code
|
||||
* void loop() {
|
||||
* int cmd = ir.command();
|
||||
* int sys = ir.system();
|
||||
* if (sys == RC5_SYS_TV)
|
||||
* player1(cmd);
|
||||
* else if (sys == RC5_SYS_VCR)
|
||||
* player2(cmd);
|
||||
*
|
||||
* ...
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* If the application only cares about a single system and wishes to ignore
|
||||
* all other systems, it can configure a system filter at startup:
|
||||
*
|
||||
* \code
|
||||
* IRreceiver ir;
|
||||
*
|
||||
* void setup() {
|
||||
* ir.setSystemFilter(RC5_SYS_VCR);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The complete list of RC-5 system numbers and command codes is given in
|
||||
* the RC5.h header file.
|
||||
*
|
||||
* \sa \ref ir_dumpir "DumpIR Example"
|
||||
*/
|
||||
|
||||
static IRreceiver *receiver = 0;
|
||||
|
||||
void _IR_receive_interrupt(void)
|
||||
{
|
||||
receiver->handleInterrupt();
|
||||
}
|
||||
|
||||
/**
|
||||
* \var IRreceiver::AUTO_REPEAT
|
||||
* \brief Flag that is added to the output of command() when the command
|
||||
* is an auto-repeated button press rather than the original button press.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new infrared remote control receiver that is attached
|
||||
* to \a interruptNumber.
|
||||
*/
|
||||
IRreceiver::IRreceiver(int interruptNumber)
|
||||
: _system(0)
|
||||
, _systemFilter(-1)
|
||||
, started(false)
|
||||
, halfChange(false)
|
||||
, lastChange(0)
|
||||
, bits(0)
|
||||
, bitCount(0)
|
||||
, buffer(0)
|
||||
, lastBuffer(0)
|
||||
{
|
||||
switch (interruptNumber) {
|
||||
case 0: default: pin = 2; break;
|
||||
case 1: pin = 3; break;
|
||||
case 2: pin = 21; break; // Arduino Mega only
|
||||
case 3: pin = 20; break; // Arduino Mega only
|
||||
case 4: pin = 19; break; // Arduino Mega only
|
||||
case 5: pin = 18; break; // Arduino Mega only
|
||||
}
|
||||
receiver = this;
|
||||
attachInterrupt(interruptNumber, _IR_receive_interrupt, CHANGE);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns the next command from the remote control.
|
||||
*
|
||||
* Returns -1 if there is no new command, or the number between 0 and 127
|
||||
* corresponding to the command. If the command is an auto-repeat button
|
||||
* press rather than an original button press, then the \ref AUTO_REPEAT
|
||||
* flag will be set.
|
||||
*
|
||||
* The companion function system() will return the system number for the
|
||||
* command indicating whether the command is for a TV, VCR, CD player, etc.
|
||||
* By default, all systems are reported; use setSystemFilter() to filter
|
||||
* out commands from all but a specific system.
|
||||
*
|
||||
* The next call to command() will return -1 or the code for the next
|
||||
* button press.
|
||||
*
|
||||
* The header file <tt>RC5.h</tt> contains a list of command codes for
|
||||
* common remote controls.
|
||||
*
|
||||
* \sa system(), setSystemFilter()
|
||||
*/
|
||||
int IRreceiver::command()
|
||||
{
|
||||
unsigned buf;
|
||||
|
||||
// Read the last-delivered sequence from the buffer and clear it.
|
||||
cli();
|
||||
buf = buffer;
|
||||
buffer = 0;
|
||||
sei();
|
||||
|
||||
// Bail out if no sequence or it is not for us.
|
||||
if (!buf) {
|
||||
_system = -1;
|
||||
return -1;
|
||||
}
|
||||
if (_systemFilter != -1) {
|
||||
if (((buf >> 6) & 0x1F) != _systemFilter) {
|
||||
_system = -1;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Extract the command.
|
||||
int cmd = buf & 0x3F;
|
||||
if ((buf & 0x1000) == 0)
|
||||
cmd += 64;
|
||||
|
||||
// Is this a new command or an auto-repeat of the previous command?
|
||||
// Bit 11 will toggle whenever a new button press is started.
|
||||
if (lastBuffer == buf)
|
||||
cmd += AUTO_REPEAT;
|
||||
else
|
||||
lastBuffer = buf;
|
||||
_system = (buf >> 6) & 0x1F;
|
||||
return cmd;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int IRreceiver::system() const
|
||||
* \brief Returns the system number of the previous command(), indicating
|
||||
* whether the command was for a TV, VCR, CD player, etc.
|
||||
*
|
||||
* The return value from this function is valid only after a call to
|
||||
* command(). The next call to command() will clear the system value,
|
||||
* possibly to -1 if there is no new command.
|
||||
*
|
||||
* The header file <tt>RC5.h</tt> contains a list of system numbers for
|
||||
* common remote controls.
|
||||
*
|
||||
* \sa command(), setSystemFilter()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int IRreceiver::systemFilter() const
|
||||
* \brief Returns the system to filter commands against, or -1 if no
|
||||
* filter is set.
|
||||
*
|
||||
* If this value is -1, then all received systems are returned via command()
|
||||
* and system() irrespective of whether they are for a TV, VCR, CD player,
|
||||
* or some other type of system. If this value is set to anything other
|
||||
* than -1, then only commands for that system are returned via command().
|
||||
*
|
||||
* \sa setSystemFilter(), system(), command()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void IRreceiver::setSystemFilter(int system)
|
||||
* \brief Sets the \a system to filter commands against, or -1 to turn
|
||||
* off the system filter.
|
||||
*
|
||||
* If \a system is -1, then all received systems are returned via command()
|
||||
* and system() irrespective of whether they are for a TV, VCR, CD player,
|
||||
* or some other type of system. If \a system is set to anything other
|
||||
* than -1, then only commands for that system are returned via command().
|
||||
* For example:
|
||||
*
|
||||
* \code
|
||||
* IRreceiver ir;
|
||||
* ir.setSystemFilter(RC5_SYS_VCR);
|
||||
* \endcode
|
||||
*
|
||||
* \sa systemFilter(), system(), command()
|
||||
*/
|
||||
|
||||
// Number of microseconds that the signal is HIGH or LOW for
|
||||
// indicating a bit. A 1 bit is transmitted as LOW for 889us
|
||||
// followed by HIGH for 889us. A 0 bit is HIGH, then LOW.
|
||||
#define IR_BIT_TIME 889
|
||||
|
||||
// Number of microseconds to detect a long gap in the coding
|
||||
// corresponding to 2 time units HIGH or LOW. We actually check
|
||||
// for at least 1.5 time units to allow for slight variations
|
||||
// in timing on different remote controls.
|
||||
#define IR_LONG_BIT_TIME (889 * 6 / 4)
|
||||
|
||||
// Maximum timeout for a single bit. If we don't see a rising edge
|
||||
// within this time, then we have lost sync and need to restart.
|
||||
#define IR_MAX_TIME (IR_BIT_TIME * 4)
|
||||
|
||||
// Protocol details from http://en.wikipedia.org/wiki/RC-5
|
||||
void IRreceiver::handleInterrupt()
|
||||
{
|
||||
bool value = digitalRead(pin);
|
||||
unsigned long currentTime = micros();
|
||||
if (!value) {
|
||||
// Rising edge (input is active-LOW)
|
||||
if (started && (currentTime - lastChange) > IR_MAX_TIME) {
|
||||
// Too long since the last received bit, so restart the process.
|
||||
started = false;
|
||||
}
|
||||
if (started) {
|
||||
// We recognize bits on the falling edges, so merely
|
||||
// adjust the "changed at last half-cycle" flag.
|
||||
if ((currentTime - lastChange) > IR_LONG_BIT_TIME) {
|
||||
// Long time since last falling edge indicates that the
|
||||
// next bit will definitely be a 1.
|
||||
halfChange = true;
|
||||
} else {
|
||||
halfChange = !halfChange;
|
||||
}
|
||||
lastChange = currentTime;
|
||||
} else {
|
||||
// Encountered the start bit - start receiving up to 14 bits.
|
||||
lastChange = currentTime;
|
||||
started = true;
|
||||
halfChange = true;
|
||||
bits = 0;
|
||||
bitCount = 14;
|
||||
}
|
||||
} else if (started) {
|
||||
// Falling edge
|
||||
if ((currentTime - lastChange) > IR_LONG_BIT_TIME) {
|
||||
// Long time since last rise indicates 1 followed by 0.
|
||||
bits = (bits << 2) | 0x02;
|
||||
--bitCount;
|
||||
halfChange = true;
|
||||
} else if (halfChange) {
|
||||
// Rise was halfway through, so falling edge indicates a 1.
|
||||
bits = (bits << 1) | 0x01;
|
||||
halfChange = false;
|
||||
} else {
|
||||
// Rise was at the start, so falling edge indicates a 0.
|
||||
bits <<= 1;
|
||||
halfChange = true;
|
||||
}
|
||||
lastChange = currentTime;
|
||||
--bitCount;
|
||||
if (bitCount <= 0) {
|
||||
// All 14 bits have been received, so deliver the value.
|
||||
started = false;
|
||||
buffer = bits;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef IRreceiver_h
|
||||
#define IRreceiver_h
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "RC5.h"
|
||||
|
||||
class IRreceiver
|
||||
{
|
||||
public:
|
||||
explicit IRreceiver(int interruptNumber = 0);
|
||||
|
||||
static const int AUTO_REPEAT = 128;
|
||||
|
||||
int command();
|
||||
int system() const { return _system; }
|
||||
|
||||
int systemFilter() const { return _systemFilter; }
|
||||
void setSystemFilter(int system) { _systemFilter = system; }
|
||||
|
||||
private:
|
||||
int _system;
|
||||
int _systemFilter;
|
||||
uint8_t pin;
|
||||
bool started;
|
||||
bool halfChange; // Value last changed half-way through bit cycle time.
|
||||
unsigned long lastChange;
|
||||
unsigned bits;
|
||||
int8_t bitCount;
|
||||
volatile unsigned buffer;
|
||||
unsigned lastBuffer;
|
||||
|
||||
void handleInterrupt();
|
||||
|
||||
friend void _IR_receive_interrupt(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,344 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef RC5_h
|
||||
#define RC5_h
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#System_Number_Allocations
|
||||
#define RC5_SYS_TV 0 // TV receiver 1
|
||||
#define RC5_SYS_TV2 1 // TV receiver 2
|
||||
#define RC5_SYS_TXT 2 // Teletext
|
||||
#define RC5_SYS_TV_EXT 3 // Extension to TV 1 & 2
|
||||
#define RC5_SYS_LV 4 // Laservision player
|
||||
#define RC5_SYS_VCR 5 // VCR 1
|
||||
#define RC5_SYS_VCR2 6 // VCR 2
|
||||
#define RC5_SYS_SAT 8 // Satellite receiver 1
|
||||
#define RC5_SYS_VCR_EXT 9 // Extension to VCR 1 & 2
|
||||
#define RC5_SYS_SAT2 10 // Satellite receiver 2
|
||||
#define RC5_SYS_CD_VIDEO 12 // CD video player
|
||||
#define RC5_SYS_CD_PHOTO 14 // CD photo player
|
||||
#define RC5_SYS_PREAMP 16 // Audio preamplifier 1
|
||||
#define RC5_SYS_RADIO 17 // Radio tuner
|
||||
#define RC5_SYS_REC 18 // Casette recorder 1
|
||||
#define RC5_SYS_PREAMP2 19 // Audio preamplifier 2
|
||||
#define RC5_SYS_CD 20 // CD player
|
||||
#define RC5_SYS_COMBI 21 // Audio stack or record player
|
||||
#define RC5_SYS_AUDIO_SAT 22 // Audio satellite
|
||||
#define RC5_SYS_REC2 23 // Casette recorder 2
|
||||
#define RC5_SYS_CD_R 26 // CD recorder
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 2, Common commands:
|
||||
#define RC5_0 0 // Digit 0
|
||||
#define RC5_1 1 // Digit 1
|
||||
#define RC5_2 2 // Digit 2
|
||||
#define RC5_3 3 // Digit 3
|
||||
#define RC5_4 4 // Digit 4
|
||||
#define RC5_5 5 // Digit 5
|
||||
#define RC5_6 6 // Digit 6
|
||||
#define RC5_7 7 // Digit 7
|
||||
#define RC5_8 8 // Digit 8
|
||||
#define RC5_9 9 // Digit 9
|
||||
#define RC5_INC_VOLUME 16 // Increase sound volume
|
||||
#define RC5_DEC_VOLUME 17 // Decrease sound volume
|
||||
#define RC5_INC_BRIGHTNESS 18 // Increase display brightness
|
||||
#define RC5_DEC_BRIGHTNESS 19 // Decrease display brightness
|
||||
#define RC5_INC_BASS 22 // Increase bass response
|
||||
#define RC5_DEC_BASS 23 // Decrease bass response
|
||||
#define RC5_INC_TREBLE 24 // Increase treble response
|
||||
#define RC5_DEC_TREBLE 25 // Decrease treble response
|
||||
#define RC5_BALANCE_LEFT 26 // Shift sound balance to left
|
||||
#define RC5_BALANCE_RIGHT 27 // Shift sound balance to right
|
||||
#define RC5_TRANSMIT_MODE 63 // Select remote transmit mode
|
||||
#define RC5_DIM 71 // Dim local display
|
||||
#define RC5_INC_LINEAR 77 // Increase linear control
|
||||
#define RC5_DEC_LINEAR 78 // Decrease linear control
|
||||
#define RC5_UP 80 // Move cursor up
|
||||
#define RC5_DOWN 81 // Move cursor down
|
||||
#define RC5_MENU_ON 82 // Switch display/screen menu on
|
||||
#define RC5_MENU_OFF 83 // Switch display/screen menu off
|
||||
#define RC5_AV_STATUS 84 // Display A/V system status
|
||||
#define RC5_LEFT 85 // Move cursor left
|
||||
#define RC5_RIGHT 86 // Move cursor right
|
||||
#define RC5_OK 87 // Acknowledge function at cursor
|
||||
#define RC5_SUBMODE 118 // Select sub-mode
|
||||
#define RC5_OPTIONS 119 // Select options sub-mode
|
||||
#define RC5_CONNECT_EURO 123 // Connect items via Euroconnector
|
||||
#define RC5_DISCONNECT_EURO 124 // Disconnect items via Euroconnector
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 3, Common video system commands:
|
||||
#define RC5_INC_SATURATION 20 // Increase color saturation
|
||||
#define RC5_DEC_SATURATION 21 // Decrease color saturation
|
||||
#define RC5_PIP 88 // Picture-in-picture on/off
|
||||
#define RC5_PIP_SHIFT 89 // Picture-in-picture shift
|
||||
#define RC5_PIP_SWAP 90 // Picture-in-picture swap
|
||||
#define RC5_PIP_STROBE 91 // Strobe main picture on/off
|
||||
#define RC5_PIP_MULTI_STROBE 92 // Multi-strobe
|
||||
#define RC5_PIP_FREEZE_MAIN 93 // Main picture frame frozen
|
||||
#define RC5_PIP_MULTI_SCAN 94 // 3/9 multi-scan
|
||||
#define RC5_PIP_SOURCE 95 // Select picture-in-picture source
|
||||
#define RC5_PIP_MOSAIC 96 // Mosaic/multi-PIP
|
||||
#define RC5_PIP_NOISE 97 // Digital noise reduction of picture
|
||||
#define RC5_PIP_STORE 98 // Store main picture
|
||||
#define RC5_PIP_PHOTO_FINISH 99 // PIP strobe; display photo-finish
|
||||
#define RC5_PIP_RECALL 100 // Recall main stored picture
|
||||
#define RC5_PIP_FREEZE 101 // Freeze PIP
|
||||
#define RC5_PIP_UP 102 // Step up PIP options/source
|
||||
#define RC5_PIP_DOWN 103 // Step down PIP options/source
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 4a, TV and VCR commands:
|
||||
#define RC5_123 10 // 1/2/3 digit entry
|
||||
#define RC5_11 11 // Channel/program/frequency 11
|
||||
#define RC5_STANDBY 12 // Standby
|
||||
#define RC5_MUTE 13 // Master mute/de-mute
|
||||
#define RC5_PREFERENCES 14 // Personal preference settings
|
||||
#define RC5_DISPLAY_INFO 15 // Display user info on screen
|
||||
#define RC5_INC_CONTRAST 28 // Increase picture contrast
|
||||
#define RC5_DEC_CONTRAST 29 // Decrease picture contrast
|
||||
#define RC5_SEARCH_UP 30 // Search up
|
||||
#define RC5_DEC_TINT 31 // Decrease tint/hue
|
||||
#define RC5_CHANNEL_UP 32 // Channel/program up
|
||||
#define RC5_CHANNEL_DOWN 33 // Channel/program down
|
||||
#define RC5_CHANNEL_LAST 34 // Last viewed channel/program
|
||||
#define RC5_STEREO_SELECT 35 // Select stereo channel/language
|
||||
#define RC5_STEREO_SPATIAL 36 // Spatial stereo
|
||||
#define RC5_STEREO_TOGGLE 37 // Toggle stereo/mono
|
||||
#define RC5_SLEEP_TIMER 38 // Sleep timer
|
||||
#define RC5_INC_TINT 39 // Increase tint/hue
|
||||
#define RC5_SWITCH_RF 40 // Switch RF inputs
|
||||
#define RC5_STORE 41 // Store/vote
|
||||
#define RC5_TIME 42 // Display time
|
||||
#define RC5_INC_SCAN 43 // Scan forward/increment
|
||||
#define RC5_DEC_SCAN 44 // Scan backward/decrement
|
||||
#define RC5_SECONDARY_MENU 46 // Secondary menu
|
||||
#define RC5_CLOCK 47 // Show clock
|
||||
#define RC5_PAUSE 48 // Pause
|
||||
#define RC5_ERASE 49 // Erase/correct entry
|
||||
#define RC5_REWIND 50 // Rewind
|
||||
#define RC5_GOTO 51 // Go to
|
||||
#define RC5_WIND 52 // Wind (fast forward)
|
||||
#define RC5_PLAY 53 // Play
|
||||
#define RC5_STOP 54 // Stop
|
||||
#define RC5_RECORD 55 // Record
|
||||
#define RC5_EXTERNAL1 56 // External 1
|
||||
#define RC5_EXTERNAL2 57 // External 2
|
||||
#define RC5_VIEW_DATA 59 // View data, advance
|
||||
#define RC5_12 60 // Channel 12 (or TXT/TV toggle)
|
||||
#define RC5_SYSTEM_STANDBY 61 // System standby
|
||||
#define RC5_CRISP 62 // Picture crispener (coutour boost)
|
||||
#define RC5_AUDIO_RESPONSE 70 // Audio response for speech/music
|
||||
#define RC5_SOUND_FUNCTIONS 79 // Select sound functions in sequence
|
||||
#define RC5_PIP_SIZE 104 // Alter PIP size step-by-step
|
||||
#define RC5_VISION_FUNCTIONS 105 // Select vision functions in sequence
|
||||
#define RC5_COLOR_KEY 106 // Colored or other special key
|
||||
#define RC5_RED 107 // Red button
|
||||
#define RC5_GREEN 108 // Green button
|
||||
#define RC5_YELLOW 109 // Yellow button
|
||||
#define RC5_CYAN 110 // Cyan button
|
||||
#define RC5_INDEX 111 // Index page/white function
|
||||
#define RC5_NEXT_OPTION 112 // Next option
|
||||
#define RC5_PREVIOUS_OPTION 113 // Previous option
|
||||
#define RC5_STORE_OPEN_CLOSE 122 // Store open/close
|
||||
#define RC5_PARENTAL_ACCESS 123 // Parental access via PIN code
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 4b, TV1 and TV2 extension
|
||||
#define RC5_DEFAULT_VIDEO 10 // Default video settings (TV1)
|
||||
#define RC5_DEFAULT_AUDIO 11 // Default audio settings (TV1)
|
||||
#define RC5_PAYTV_CHANNEL_UP 28 // Pay TV channel up (TV1)
|
||||
#define RC5_PAYTV_CHANNEL_DOWN 29 // Pay TV channel down (TV1)
|
||||
#define RC5_RADIO_CHANNEL_UP 30 // Radio channel up (TV1)
|
||||
#define RC5_RADIO_CHANNEL_DOWN 31 // Radio channel down (TV1)
|
||||
#define RC5_TILT_FORWARD 32 // Tilt cabinet forward (TV1)
|
||||
#define RC5_TILT_BACKWARD 33 // Tilt cabinet backward (TV1)
|
||||
#define RC5_EXTERNAL3 56 // External 3 (TV1)
|
||||
#define RC5_EXTERNAL4 56 // External 4 (TV1)
|
||||
#define RC5_PICTURE_FORMAT 62 // 4:3 vs 16:9 (TV1)
|
||||
#define RC5_CHANNEL_10 67 // Channel 10
|
||||
#define RC5_CHANNEL_11 68 // Channel 11
|
||||
#define RC5_CHANNEL_12 69 // Channel 12
|
||||
#define RC5_DEFAULT_VIDEO2 72 // Default video settings (TV2)
|
||||
#define RC5_DEFAULT_AUDIO2 73 // Default audio settings (TV2)
|
||||
#define RC5_PAYTV_CHANNEL_UP2 88 // Pay TV channel up (TV2)
|
||||
#define RC5_PAYTV_CHANNEL_DOWN2 89 // Pay TV channel down (TV2)
|
||||
#define RC5_RADIO_CHANNEL_UP2 90 // Radio channel up (TV2)
|
||||
#define RC5_RADIO_CHANNEL_DOWN2 91 // Radio channel down (TV2)
|
||||
#define RC5_TILT_FORWARD2 104 // Tilt cabinet forward (TV2)
|
||||
#define RC5_TILT_BACKWARD2 105 // Tilt cabinet backward (TV2)
|
||||
#define RC5_EXTERNAL3_2 120 // External 3 (TV2)
|
||||
#define RC5_EXTERNAL4_2 121 // External 4 (TV2)
|
||||
#define RC5_CHANNEL_MENU 122 // Channel setting menu
|
||||
#define RC5_PICTURE_FORMAT2 126 // 4:3 vs 16:9 (TV2)
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 5, Teletext commands
|
||||
#define RC5_NEXT_PAGE 10 // Next page
|
||||
#define RC5_PREVIOUS_PAGE 11 // Previous page
|
||||
// RC5_STANDBY 12 // Standby
|
||||
#define RC5_ENTER_PAGE_NUMBER 28 // Enter page number in memory
|
||||
#define RC5_SEQ_DISPLAY 29 // Sequential display of pages
|
||||
#define RC5_SEQ_DELETE 30 // Sequential display/deletion of pages
|
||||
#define RC5_EXCHANGE 32 // Exchange (Antiope function)
|
||||
#define RC5_MAIN_INDEX 33 // Main index
|
||||
#define RC5_ROW_ZERO 34 // Row zero (Antiope function)
|
||||
#define RC5_PRINT 38 // Print displayed page
|
||||
#define RC5_MIX 39 // Mix Antiope/TV pictures
|
||||
#define RC5_HOLD_PAGE 41 // Page hold
|
||||
// RC5_TIME 42 // Display time
|
||||
#define RC5_LARGE 43 // Large top/bottom/normal
|
||||
#define RC5_REVEAL 44 // Reveal/conceal
|
||||
#define RC5_TV_TXT 45 // TV/TXT
|
||||
#define RC5_TV_TXT_SUBTITLE 46 // TV + TXT/subtitle
|
||||
// RC5_ERASE 49 // Erase/correct entry
|
||||
#define RC5_NEWS_FLASH 62 // News flash (Antiope function)
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 6, LaserVision commands
|
||||
#define RC5_PICTURE_NUMBER 10 // Display picture number/time
|
||||
#define RC5_CHAPTER_NUMBER 11 // Display chapter number
|
||||
// RC5_STANDBY 12 // Standby
|
||||
// RC5_MUTE 13 // Master mute/de-mute
|
||||
// RC5_DISPLAY_INFO 15 // Display user info on screen
|
||||
#define RC5_SHUFFLE 28 // Total shuffle play/repeat once
|
||||
#define RC5_REPEAT 29 // Repeat continuously
|
||||
#define RC5_SELECT_NEXT 30 // Select next option
|
||||
#define RC5_FAST_REVERSE 31 // Fast run reverse
|
||||
#define RC5_ENTRY 32 // Entry (prepare to program)
|
||||
#define RC5_AUTO_STOP 33 // Auto-stop at pre-programmed point
|
||||
#define RC5_SLOW_REVERSE 34 // Slow run reverse
|
||||
#define RC5_STEREO_CHANNEL1 35 // Select stereo sound channel 1/language 1
|
||||
#define RC5_STEREO_CHANNEL2 36 // Select stereo sound channel 2/language 2
|
||||
#define RC5_DEC_STILL 37 // Still increment reverse
|
||||
#define RC5_INC_SPEED 38 // Increase speed
|
||||
#define RC5_DEC_SPEED 39 // Decrease speed
|
||||
#define RC5_SLOW_FORWARD 40 // Slow run forward
|
||||
#define RC5_INC_STILL 41 // Still increment forward
|
||||
#define RC5_FAST_FORWARD 42 // Fast run forward
|
||||
#define RC5_SEARCH_USER_CHOICE 43 // Automatic search for user choice
|
||||
#define RC5_SEARCH_REVERSE 44 // Search in reverse
|
||||
#define RC5_TRAY 45 // Open/close tray
|
||||
#define RC5_SEARCH_FORWARD 46 // Search forward
|
||||
#define RC5_PLAY_REVERSE 47 // Play reverse/play opposite sound track
|
||||
// RC5_PAUSE 48 // Pause
|
||||
// RC5_ERASE 49 // Erase/correct entry
|
||||
// RC5_PLAY 53 // Play
|
||||
// RC5_STOP 54 // Stop
|
||||
#define RC5_CLEAR_MEMORY 58 // Clear memory all
|
||||
#define RC5_FREEZE_SEGMENT 59 // Freeze segment(s) indicated by picture numbers.
|
||||
#define RC5_TV_TXT_ALT 60 // TV/TXT toggle; RF switch (USA only)
|
||||
#define RC5_CX 62 // CX 1, 2, 3; toggle for CX noise reduction
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 11, Preamplifier commands
|
||||
#define RC5_GEQ_L 10 // Graphic equalizer left
|
||||
#define RC5_GEQ_R 11 // Graphic equalizer right
|
||||
// RC5_STANDBY 12 // Standby
|
||||
// RC5_MUTE 13 // Master mute/de-mute
|
||||
// RC5_PREFERENCES 14 // Personal preference settings
|
||||
// RC5_DISPLAY_INFO 15 // Display user info on screen
|
||||
#define RC5_GEQ_L_AND_R 28 // Graphic equalizer left and right
|
||||
#define RC5_SPEAKER_SELECT 29 // Speaker select
|
||||
#define RC5_SCRATCH_FILTER 30 // Scratch filter on/off
|
||||
#define RC5_RUMBLE_FILTER 31 // Rumble filter on/off
|
||||
#define RC5_INC_STEP 32 // Step function +
|
||||
#define RC5_DEC_STEP 33 // Step function -
|
||||
#define RC5_SIGNAL_PATH 34 // Signal path options
|
||||
#define RC5_SPEAKER_A 35 // Speaker A on/off
|
||||
#define RC5_SURROUND_OPTIONS 37 // Surround sound options
|
||||
// RC5_SLEEP_TIMER 38 // Sleep timer
|
||||
#define RC5_SPEAKER_B 39 // Speaker B on/off
|
||||
#define RC5_SPEAKER_C 40 // Speaker C on/off
|
||||
#define RC5_TIMER_PROGRAM 41 // Timer program mode
|
||||
// RC5_TIME 42 // Display time
|
||||
#define RC5_INC_TIMER 43 // Timer +
|
||||
#define RC5_DEC_TIMER 44 // Timer -
|
||||
#define RC5_TIMER_MEMORY 45 // Open timer memory
|
||||
#define RC5_ACOUSTIC_CONTROL 46 // Open acoustic control setting memory
|
||||
#define RC5_ACOUSTIC_SELECT 47 // Select acoustic settings in memory
|
||||
// RC5_ERASE 49 // Erase/correct entry
|
||||
// RC5_CLEAR_MEMORY 58 // Clear memory all
|
||||
#define RC5_DYNAMIC_EXPAND 60 // Dynamic range expand
|
||||
#define RC5_DYNAMIC_COMPRESS 62 // Dynamic range compress
|
||||
#define RC5_SURROUND_SOUND 64 // Surround sound on/off
|
||||
#define RC5_BALANCE_FRONT 65 // Balance front
|
||||
#define RC5_BALANCE_REAR 66 // Balance rear
|
||||
#define RC5_LINEAR_SOUND 79 // Scroll linear sound functions
|
||||
#define RC5_RANDOM_NOISE 88 // Random noise generator on/off
|
||||
#define RC5_TIMER 89 // Timer on/off
|
||||
#define RC5_NEWS_TIMER 90 // News timer on/off
|
||||
#define RC5_INC_CENTER_VOLUME 102 // Increase center channel volume
|
||||
#define RC5_DEC_CENTER_VOLUME 103 // Decrease center channel volume
|
||||
#define RC5_INC_DELAY_SURROUND 104 // Increase delay front to surround
|
||||
#define RC5_DEC_DELAY_SURROUND 105 // Decrease delay front to surround
|
||||
#define RC5_LINEAR_PHASE 106 // Linear phase
|
||||
#define RC5_TAPE_MONITOR 122 // Tape monitor
|
||||
|
||||
// http://en.wikipedia.org/wiki/RC-5#Command_Tables
|
||||
// Table 14, Compact disc player commands
|
||||
#define RC5_LOCAL_CURSOR 10 // Scroll local display cursor
|
||||
#define RC5_LOCAL_FUNCTION 11 // Scroll local display function
|
||||
// RC5_STANDBY 12 // Standby
|
||||
// RC5_MUTE 13 // Master mute/de-mute
|
||||
// RC5_DISPLAY_INFO 15 // Display user info on screen
|
||||
// RC5_SHUFFLE 28 // Total shuffle play/repeat once
|
||||
// RC5_REPEAT 29 // Repeat continuously
|
||||
#define RC5_INC_SELECT 30 // Select increment
|
||||
#define RC5_DEC_SELECT 31 // Select decrement
|
||||
#define RC5_NEXT 32 // Next
|
||||
#define RC5_PREVIOUS 33 // Previous
|
||||
#define RC5_INDEX_NEXT 34 // Index next
|
||||
#define RC5_INDEX_PREVIOUS 35 // Index previous
|
||||
#define RC5_PLAY_PROGRAM 36 // Play/program
|
||||
#define RC5_NOMINAL_SPEED 37 // Speed nominal
|
||||
// RC5_INC_SPEED 38 // Increase speed
|
||||
// RC5_DEC_SPEED 39 // Decrease speed
|
||||
// RC5_STORE 41 // Store/vote
|
||||
// RC5_INC_SCAN 43 // Scan forward/increment
|
||||
// RC5_TRAY 45 // Open/close tray
|
||||
#define RC5_CARTRIDGE 47 // Fast/select disc from catridge
|
||||
// RC5_PAUSE 48 // Pause
|
||||
// RC5_ERASE 49 // Erase/correct entry
|
||||
// RC5_REWIND 50 // Rewind
|
||||
// RC5_GOTO 51 // Go to
|
||||
// RC5_WIND 52 // Wind (fast forward)
|
||||
// RC5_PLAY 53 // Play
|
||||
// RC5_STOP 54 // Stop
|
||||
// RC5_CLEAR_MEMORY 58 // Clear memory all
|
||||
#define RC5_REPEAT_AB 59 // Repeat program marked A/B
|
||||
// RC5_DYNAMIC_EXPAND 60 // Dynamic range expand
|
||||
// RC5_DYNAMIC_COMPRESS 62 // Dynamic range compress
|
||||
#define RC5_DSP 91 // Digital signal processing on/off
|
||||
#define RC5_DSP_MUSIC 92 // Music mode (DSP)
|
||||
#define RC5_DSP_ACOUSTICS 93 // Select room acoustics (DSP)
|
||||
#define RC5_DSP_JAZZ 94 // Jazz/s-hall effect (DSP)
|
||||
#define RC5_DSP_POP 95 // Pop/s-hall effect (DSP)
|
||||
#define RC5_DSP_CLASSIC 96 // Classic/church music for music/room mode (DSP)
|
||||
#define RC5_DSP_EASY 97 // Easy/club music for music/room mode (DSP)
|
||||
#define RC5_DSP_DISCO 98 // Disco/stadium music for music/room mode (DSP)
|
||||
#define RC5_SECOND_FAVORITE 107 // Second favorite track selection
|
||||
#define RC5_FAVORITE 108 // Favorite track selection
|
||||
#define RC5_TITLE_INTO_MEMORY 109 // Title into memory
|
||||
#define RC5_FADE 120 // Fade in/out audio
|
||||
|
||||
#endif
|
||||
@@ -1,196 +0,0 @@
|
||||
/* This example is placed into the public domain */
|
||||
|
||||
#include <IRreceiver.h>
|
||||
|
||||
IRreceiver ir;
|
||||
|
||||
static const char *systems[32] = {
|
||||
"TV",
|
||||
"TV2",
|
||||
"TXT",
|
||||
"TV_EXT",
|
||||
"LV",
|
||||
"VCR",
|
||||
"VCR2",
|
||||
"Sys7",
|
||||
"SAT",
|
||||
"VCR_EXT",
|
||||
"SAT2",
|
||||
"Sys11",
|
||||
"CD_VIDEO",
|
||||
"Sys13",
|
||||
"CD_PHOTO",
|
||||
"Sys15",
|
||||
"PREAMP",
|
||||
"RADIO",
|
||||
"REC",
|
||||
"PREAMP2",
|
||||
"CD",
|
||||
"COMBI",
|
||||
"AUDIO_SAT",
|
||||
"REC2",
|
||||
"Sys24",
|
||||
"Sys25",
|
||||
"CD_R",
|
||||
"Sys27",
|
||||
"Sys28",
|
||||
"Sys29",
|
||||
"Sys30",
|
||||
"Sys31"
|
||||
};
|
||||
|
||||
// Selection of TV, VCR, and CD commands to assist with command identification.
|
||||
// May not be correct for all system types.
|
||||
static const char *commands[128] = {
|
||||
"0",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"123",
|
||||
"11",
|
||||
"STANDBY",
|
||||
"MUTE",
|
||||
"PREFERENCES",
|
||||
"DISPLAY_INFO",
|
||||
"INC_VOLUME",
|
||||
"DEC_VOLUME",
|
||||
"INC_BRIGHTNESS",
|
||||
"DEC_BRIGHTNESS",
|
||||
"INC_SATURATION",
|
||||
"DEC_SATURATION",
|
||||
"INC_BASS",
|
||||
"DEC_BASS",
|
||||
"INC_TREBLE",
|
||||
"DEC_TREBLE",
|
||||
"BALANCE_LEFT",
|
||||
"BALANCE_RIGHT",
|
||||
"INC_CONTRAST",
|
||||
"DEC_CONTRAST",
|
||||
"SEARCH_UP",
|
||||
"DEC_TINT",
|
||||
"CHANNEL_UP",
|
||||
"CHANNEL_DOWN",
|
||||
"CHANNEL_LAST",
|
||||
"STEREO_SELECT",
|
||||
"STEREO_SPATIAL",
|
||||
"STEREO_TOGGLE",
|
||||
"SLEEP_TIMER",
|
||||
"INC_TINT",
|
||||
"SWITCH_RF",
|
||||
"STORE",
|
||||
"TIME",
|
||||
"INC_SCAN",
|
||||
"DEC_SCAN",
|
||||
"TRAY",
|
||||
"SECONDARY_MENU",
|
||||
"CLOCK",
|
||||
"PAUSE",
|
||||
"ERASE",
|
||||
"REWIND",
|
||||
"GOTO",
|
||||
"WIND",
|
||||
"PLAY",
|
||||
"STOP",
|
||||
"RECORD",
|
||||
"EXTERNAL_1",
|
||||
"EXTERNAL_2",
|
||||
"CLEAR_MEMORY",
|
||||
"VIEW_DATA",
|
||||
"12",
|
||||
"SYSTEM_STANDBY",
|
||||
"CRISP",
|
||||
"TRANSMIT_MODE",
|
||||
"Cmd64",
|
||||
"Cmd65",
|
||||
"Cmd66",
|
||||
"Cmd67",
|
||||
"Cmd68",
|
||||
"Cmd69",
|
||||
"AUDIO_RESPONSE",
|
||||
"DIM",
|
||||
"Cmd72",
|
||||
"Cmd73",
|
||||
"Cmd74",
|
||||
"Cmd75",
|
||||
"Cmd76",
|
||||
"INC_LINEAR",
|
||||
"DEC_LINEAR",
|
||||
"SOUND_FUNCTIONS",
|
||||
"UP",
|
||||
"DOWN",
|
||||
"MENU_ON",
|
||||
"MENU_OFF",
|
||||
"AV_STATUS",
|
||||
"LEFT",
|
||||
"RIGHT",
|
||||
"OK",
|
||||
"PIP",
|
||||
"PIP_SHIFT",
|
||||
"PIP_SWAP",
|
||||
"PIP_STROBE",
|
||||
"PIP_MULTI_STROBE",
|
||||
"PIP_FREEZE_MAIN",
|
||||
"PIP_MULTI_SCAN",
|
||||
"PIP_SOURCE",
|
||||
"PIP_MOSAIC",
|
||||
"PIP_NOISE",
|
||||
"PIP_STORE",
|
||||
"PIP_PHOTO_FINISH",
|
||||
"PIP_RECALL",
|
||||
"PIP_FREEZE",
|
||||
"PIP_UP",
|
||||
"PIP_DOWN",
|
||||
"PIP_SIZE",
|
||||
"VERSION_FUNCTIONS",
|
||||
"COLOR_KEY",
|
||||
"RED",
|
||||
"GREEN",
|
||||
"YELLOW",
|
||||
"CYAN",
|
||||
"INDEX",
|
||||
"NEXT_OPTION",
|
||||
"PREVIOUS_OPTION",
|
||||
"Cmd114",
|
||||
"Cmd115",
|
||||
"Cmd116",
|
||||
"Cmd117",
|
||||
"SUBMODE",
|
||||
"OPTIONS",
|
||||
"FADE",
|
||||
"Cmd121",
|
||||
"STORE_OPEN_CLOSE",
|
||||
"CONNECT_EURO",
|
||||
"DISCONNECT_EURO",
|
||||
"Cmd125",
|
||||
"Cmd126",
|
||||
"Cmd127"
|
||||
};
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
int cmd = ir.command();
|
||||
if (cmd >= 0) {
|
||||
Serial.print("IR system=");
|
||||
Serial.print(ir.system());
|
||||
Serial.print(" (RC5_SYS_");
|
||||
Serial.print(systems[ir.system()]);
|
||||
Serial.print("), command=");
|
||||
Serial.print(cmd & 0x7F);
|
||||
Serial.print(" (RC5_");
|
||||
Serial.print(commands[cmd & 0x7F]);
|
||||
Serial.print(")");
|
||||
if (cmd & IRreceiver::AUTO_REPEAT)
|
||||
Serial.println(", auto-repeat");
|
||||
else
|
||||
Serial.println();
|
||||
}
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 <IRreceiver.h>
|
||||
#include <DMD.h>
|
||||
#include <Mono5x7.h>
|
||||
|
||||
#define SNAKE_ADVANCE_TIME 150
|
||||
#define SNAKE_BLINK_TIME 500
|
||||
#define SNAKE_INC_STEPS 5
|
||||
#define SNAKE_MAX_LENGTH 50
|
||||
#define SNAKE_START_LENGTH 10
|
||||
|
||||
struct Point
|
||||
{
|
||||
int x, y;
|
||||
};
|
||||
|
||||
DMD display;
|
||||
IRreceiver ir;
|
||||
bool paused;
|
||||
bool gameOver;
|
||||
bool waitForStart;
|
||||
bool snakeDrawn;
|
||||
unsigned long lastChange;
|
||||
Point direction;
|
||||
Point snakeParts[SNAKE_MAX_LENGTH];
|
||||
int snakeLength;
|
||||
int incStep;
|
||||
|
||||
ISR(TIMER1_OVF_vect)
|
||||
{
|
||||
display.refresh();
|
||||
}
|
||||
|
||||
void setup() {
|
||||
display.enableTimer1();
|
||||
display.setFont(Mono5x7);
|
||||
startGame();
|
||||
}
|
||||
|
||||
void drawSnake(Bitmap::Color color) {
|
||||
for (int index = 0; index < snakeLength; ++index)
|
||||
display.setPixel(snakeParts[index].x, snakeParts[index].y, color);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Handle the "Game Over" state. Any key press starts a new game.
|
||||
int cmd = ir.command();
|
||||
if (gameOver) {
|
||||
if (cmd != -1 && (cmd & IRreceiver::AUTO_REPEAT) == 0)
|
||||
startGame();
|
||||
return;
|
||||
}
|
||||
|
||||
// Pause the game if waiting for the first start. While waiting,
|
||||
// blink the location of the snake to help the player get their bearings.
|
||||
if (waitForStart) {
|
||||
if (cmd == -1) {
|
||||
if ((millis() - lastChange) >= SNAKE_BLINK_TIME) {
|
||||
snakeDrawn = !snakeDrawn;
|
||||
drawSnake(snakeDrawn ? Bitmap::White : Bitmap::Black);
|
||||
lastChange += SNAKE_BLINK_TIME;
|
||||
}
|
||||
return;
|
||||
}
|
||||
drawSnake(Bitmap::White);
|
||||
waitForStart = false;
|
||||
snakeDrawn = true;
|
||||
lastChange = millis();
|
||||
}
|
||||
|
||||
// Process commands from the player.
|
||||
switch (cmd) {
|
||||
|
||||
// Both arrow keys and numbers can be used to control the direction,
|
||||
// in case the remote control does not have arrow keys.
|
||||
case RC5_LEFT: case RC5_4:
|
||||
changeDirection(-1, 0);
|
||||
break;
|
||||
case RC5_RIGHT: case RC5_6:
|
||||
changeDirection(1, 0);
|
||||
break;
|
||||
case RC5_UP: case RC5_2:
|
||||
changeDirection(0, -1);
|
||||
break;
|
||||
case RC5_DOWN: case RC5_8:
|
||||
changeDirection(0, 1);
|
||||
break;
|
||||
|
||||
case RC5_PAUSE: case RC5_PLAY: case RC5_0:
|
||||
// Pause or resume the game.
|
||||
paused = !paused;
|
||||
lastChange = millis();
|
||||
break;
|
||||
|
||||
case RC5_STOP: case RC5_STANDBY:
|
||||
// Stop the game and start a new one.
|
||||
startGame();
|
||||
break;
|
||||
}
|
||||
|
||||
// Advance the snake position if not paused and the timeout has expired.
|
||||
if (!paused && (millis() - lastChange) >= SNAKE_ADVANCE_TIME) {
|
||||
++incStep;
|
||||
advanceSnake(incStep >= SNAKE_INC_STEPS);
|
||||
lastChange += SNAKE_ADVANCE_TIME;
|
||||
}
|
||||
}
|
||||
|
||||
void startGame() {
|
||||
randomSeed(micros() + analogRead(A0)); // Analog read adds some noise.
|
||||
display.clear();
|
||||
display.drawRect(0, 0, display.width() - 1, display.height() - 1);
|
||||
for (int count = 0; count < 10; ++count) {
|
||||
int x, y;
|
||||
if (random(0, 2) == 0) {
|
||||
x = random(1, display.width() - 5);
|
||||
y = random(1, display.height() - 1);
|
||||
display.drawLine(x, y, x + 4, y);
|
||||
} else {
|
||||
x = random(1, display.width() - 1);
|
||||
y = random(1, display.height() - 3);
|
||||
display.drawLine(x, y, x, y + 2);
|
||||
}
|
||||
}
|
||||
paused = false;
|
||||
gameOver = false;
|
||||
waitForStart = true;
|
||||
snakeDrawn = true;
|
||||
lastChange = millis();
|
||||
direction.x = 1;
|
||||
direction.y = 0;
|
||||
incStep = 0;
|
||||
snakeLength = SNAKE_START_LENGTH;
|
||||
for (int index = 0; index < snakeLength; ++index) {
|
||||
snakeParts[index].x = 3 + index;
|
||||
snakeParts[index].y = 4;
|
||||
display.setPixel
|
||||
(snakeParts[index].x, snakeParts[index].y, Bitmap::White);
|
||||
}
|
||||
}
|
||||
|
||||
void changeDirection(int x, int y) {
|
||||
direction.x = x;
|
||||
direction.y = y;
|
||||
}
|
||||
|
||||
void advanceSnake(bool increase) {
|
||||
int x = snakeParts[snakeLength - 1].x + direction.x;
|
||||
int y = snakeParts[snakeLength - 1].y + direction.y;
|
||||
if (display.pixel(x, y) == Bitmap::White) {
|
||||
gameOver = true;
|
||||
display.clear();
|
||||
display.drawText(5, 0, "Game");
|
||||
display.drawText(3, 8, "Over!");
|
||||
return;
|
||||
}
|
||||
if (!increase || snakeLength >= SNAKE_MAX_LENGTH) {
|
||||
display.setPixel(snakeParts[0].x, snakeParts[0].y, Bitmap::Black);
|
||||
for (int index = 0; index < snakeLength - 1; ++index)
|
||||
snakeParts[index] = snakeParts[index + 1];
|
||||
} else {
|
||||
++snakeLength;
|
||||
}
|
||||
snakeParts[snakeLength - 1].x = x;
|
||||
snakeParts[snakeLength - 1].y = y;
|
||||
display.setPixel(x, y, Bitmap::White);
|
||||
if (increase)
|
||||
incStep = 0;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 6.0 KiB |
@@ -1,8 +0,0 @@
|
||||
IRreceiver KEYWORD1
|
||||
|
||||
command KEYWORD2
|
||||
system KEYWORD2
|
||||
systemFilter KEYWORD2
|
||||
setSystemFilter KEYWORD2
|
||||
|
||||
AUTO_REPEAT LITERAL1
|
||||
@@ -1,197 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "BoolField.h"
|
||||
|
||||
/**
|
||||
* \class BoolField BoolField.h <BoolField.h>
|
||||
* \brief Field that manages the input of a boolean value.
|
||||
*
|
||||
* BoolField is intended for field values that are modifiable by the user.
|
||||
* Pressing one of Up or Down will toggle the field's current value.
|
||||
*
|
||||
* The following example creates a boolean field that shows the state
|
||||
* of the status LED on D13. When the LED is on (the default), the string
|
||||
* "On" will be displayed on the LCD screen. When the LED is off, the
|
||||
* string "Off" will be displayed instead.
|
||||
*
|
||||
* \code
|
||||
* Form mainForm(lcd);
|
||||
* BoolField ledField(mainForm, "Status LED", "On", "Off", true);
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormBool.png
|
||||
*
|
||||
* To actually toggle the LED, the application's main loop() function
|
||||
* should contain the following code:
|
||||
*
|
||||
* \code
|
||||
* int event = lcd.getButton();
|
||||
* if (mainForm.dispatch(event) == FORM_CHANGED) {
|
||||
* if (mainForm.isCurrent(ledField)) {
|
||||
* if (ledField.value())
|
||||
* digitalWrite(STATUS_LED, HIGH);
|
||||
* else
|
||||
* digitalWrite(STATUS_LED, LOW);
|
||||
* }
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* Use TextField for read-only fields that report boolean values but
|
||||
* which are not modifiable by the user.
|
||||
*
|
||||
* ListField can be used to select between more than two items.
|
||||
*
|
||||
* \sa Field, ListField, TextField
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new boolean field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* The initial value() will be false.
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
BoolField::BoolField(const String &label)
|
||||
: Field(label)
|
||||
, _printLen(0)
|
||||
, _value(false)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new boolean field with a specific \a label and
|
||||
* attaches it to a \a form.
|
||||
*
|
||||
* The initial value() of the field is set to the parameter \a value.
|
||||
* When value() is true, \a trueLabel will be displayed on the screen.
|
||||
* When value() is false, \a falseLabel will be displayed on the screen.
|
||||
*
|
||||
* \sa value()
|
||||
*/
|
||||
BoolField::BoolField(Form &form, const String &label, const String &trueLabel, const String &falseLabel, bool value)
|
||||
: Field(form, label)
|
||||
, _trueLabel(trueLabel)
|
||||
, _falseLabel(falseLabel)
|
||||
, _printLen(0)
|
||||
, _value(value)
|
||||
{
|
||||
}
|
||||
|
||||
int BoolField::dispatch(int event)
|
||||
{
|
||||
if (event == LCD_BUTTON_UP || event == LCD_BUTTON_DOWN) {
|
||||
setValue(!_value);
|
||||
return FORM_CHANGED;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void BoolField::enterField(bool reverse)
|
||||
{
|
||||
Field::enterField(reverse);
|
||||
printValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool BoolField::value() const
|
||||
* \brief Returns the current value of this field, true or false.
|
||||
*
|
||||
* \sa setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the current value of this field to \a value.
|
||||
*
|
||||
* \sa value()
|
||||
*/
|
||||
void BoolField::setValue(bool value)
|
||||
{
|
||||
if (value != _value) {
|
||||
_value = value;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn const String &BoolField::trueLabel() const
|
||||
* \brief Returns the string that is displayed when value() is true.
|
||||
*
|
||||
* \sa setTrueLabel(), falseLabel()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the string that is displayed when value() is true to
|
||||
* \a trueLabel.
|
||||
*
|
||||
* \sa trueLabel(), setFalseLabel()
|
||||
*/
|
||||
void BoolField::setTrueLabel(const String &trueLabel)
|
||||
{
|
||||
_trueLabel = trueLabel;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn const String &BoolField::falseLabel() const
|
||||
* \brief Returns the string that is displayed when value() is false.
|
||||
*
|
||||
* \sa setFalseLabel(), trueLabel()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the string that is displayed when value() is false to
|
||||
* \a falseLabel.
|
||||
*
|
||||
* \sa falseLabel(), setTrueLabel()
|
||||
*/
|
||||
void BoolField::setFalseLabel(const String &falseLabel)
|
||||
{
|
||||
_falseLabel = falseLabel;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
|
||||
void BoolField::printValue()
|
||||
{
|
||||
unsigned int len;
|
||||
lcd()->setCursor(0, 1);
|
||||
if (_value) {
|
||||
lcd()->print(_trueLabel);
|
||||
len = _trueLabel.length();
|
||||
while (len++ < _printLen)
|
||||
lcd()->write(' ');
|
||||
_printLen = _trueLabel.length();
|
||||
} else {
|
||||
lcd()->print(_falseLabel);
|
||||
len = _falseLabel.length();
|
||||
while (len++ < _printLen)
|
||||
lcd()->write(' ');
|
||||
_printLen = _falseLabel.length();
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef BoolField_h
|
||||
#define BoolField_h
|
||||
|
||||
#include "Field.h"
|
||||
|
||||
class BoolField : public Field {
|
||||
public:
|
||||
explicit BoolField(const String &label);
|
||||
BoolField(Form &form, const String &label, const String &trueLabel, const String &falseLabel, bool value);
|
||||
|
||||
int dispatch(int event);
|
||||
|
||||
void enterField(bool reverse);
|
||||
|
||||
bool value() const { return _value; }
|
||||
void setValue(bool value);
|
||||
|
||||
const String &trueLabel() const { return _trueLabel; }
|
||||
void setTrueLabel(const String &trueLabel);
|
||||
|
||||
const String &falseLabel() const { return _falseLabel; }
|
||||
void setFalseLabel(const String &falseLabel);
|
||||
|
||||
private:
|
||||
String _trueLabel;
|
||||
String _falseLabel;
|
||||
int _printLen;
|
||||
bool _value;
|
||||
|
||||
void printValue();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,194 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "Field.h"
|
||||
|
||||
/**
|
||||
* \class Field Field.h <Field.h>
|
||||
* \brief Manages a single data input/output field within a Form.
|
||||
*
|
||||
* \sa Form, BoolField, IntField, ListField, TextField, TimeField
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
Field::Field(const String &label)
|
||||
: _label(label)
|
||||
, _form(0)
|
||||
, next(0)
|
||||
, prev(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new field with a specific \a label and attaches
|
||||
* it to a \a form.
|
||||
*/
|
||||
Field::Field(Form &form, const String &label)
|
||||
: _label(label)
|
||||
, _form(0)
|
||||
, next(0)
|
||||
, prev(0)
|
||||
{
|
||||
form.addField(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Destroys this field and removes it from its owning Form.
|
||||
*
|
||||
* \sa Form::removeField()
|
||||
*/
|
||||
Field::~Field()
|
||||
{
|
||||
if (_form)
|
||||
_form->removeField(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn Form *Field::form() const
|
||||
* \brief Returns the Form that owns this field; null if not associated
|
||||
* with a Form.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Dispatches \a event via this field.
|
||||
*
|
||||
* The \a event is usually obtained from LCD::getButton().
|
||||
*
|
||||
* Returns zero if the \a event has been handled and no further action
|
||||
* is required.
|
||||
*
|
||||
* Returns FORM_CHANGED if the \a event has changed the value of this
|
||||
* field in a manner that may require the application to take further
|
||||
* action based on the new field value.
|
||||
*
|
||||
* Returns -1 if the \a event is not handled by this field, and should
|
||||
* be handled by the Form itself (particularly for Left and Right buttons).
|
||||
* The default implementation returns -1 for all events.
|
||||
*
|
||||
* \sa Form::dispatch(), LCD::getButton()
|
||||
*/
|
||||
int Field::dispatch(int event)
|
||||
{
|
||||
// Nothing to do here.
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enters the field due to form navigation.
|
||||
*
|
||||
* This function is typically called when the user presses Left and Right
|
||||
* buttons to navigate to the field. If \a reverse is true, then navigation
|
||||
* was due to the Left button being pressed.
|
||||
*
|
||||
* This function can assume that the display has been cleared and the
|
||||
* cursor is positioned at (0, 0).
|
||||
*
|
||||
* The default implementation prints the label().
|
||||
*
|
||||
* \sa exitField()
|
||||
*/
|
||||
void Field::enterField(bool reverse)
|
||||
{
|
||||
lcd()->print(_label);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Exits the field due to form navigation.
|
||||
*
|
||||
* This function is typically called when the user presses Left and Right
|
||||
* buttons to navigate from the field.
|
||||
*
|
||||
* \sa enterField()
|
||||
*/
|
||||
void Field::exitField()
|
||||
{
|
||||
// Nothing to do here.
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn const String &Field::label() const
|
||||
* \brief Returns the label to display in the first line of this field.
|
||||
*
|
||||
* \sa setLabel()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the \a label to display in the first line of this field.
|
||||
*
|
||||
* \sa label()
|
||||
*/
|
||||
void Field::setLabel(const String &label)
|
||||
{
|
||||
if (isCurrent()) {
|
||||
unsigned int prevLen = _label.length();
|
||||
unsigned int newLen = label.length();
|
||||
_label = label;
|
||||
lcd()->setCursor(0, 0);
|
||||
lcd()->print(label);
|
||||
while (newLen++ < prevLen)
|
||||
lcd()->write(' ');
|
||||
updateCursor();
|
||||
} else {
|
||||
_label = label;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns true if this field is the currently-displayed field in
|
||||
* its owning form; false otherwise.
|
||||
*
|
||||
* This function should be called from property setters in subclasses to
|
||||
* determine if the screen should be updated when a property is modified.
|
||||
*/
|
||||
bool Field::isCurrent() const
|
||||
{
|
||||
if (!_form->isVisible())
|
||||
return false;
|
||||
return _form->currentField() == this;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn LiquidCrystal *Field::lcd() const
|
||||
* \brief Returns the LCD that this field is being drawn on.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Updates the cursor position after the label has been drawn
|
||||
* by setLabel().
|
||||
*
|
||||
* The default implementation does nothing. Subclasses that use an LCD
|
||||
* cursor may override this to ensure that the cursor position stays
|
||||
* valid after the label is modified.
|
||||
*
|
||||
* \sa setLabel()
|
||||
*/
|
||||
void Field::updateCursor()
|
||||
{
|
||||
// Nothing to do here.
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef Field_h
|
||||
#define Field_h
|
||||
|
||||
#include "Form.h"
|
||||
|
||||
class Field {
|
||||
public:
|
||||
explicit Field(const String &label);
|
||||
Field(Form &form, const String &label);
|
||||
~Field();
|
||||
|
||||
Form *form() const { return _form; }
|
||||
|
||||
virtual int dispatch(int event);
|
||||
|
||||
virtual void enterField(bool reverse);
|
||||
virtual void exitField();
|
||||
|
||||
const String &label() const { return _label; }
|
||||
void setLabel(const String &label);
|
||||
|
||||
bool isCurrent() const;
|
||||
|
||||
protected:
|
||||
LiquidCrystal *lcd() const { return _form->_lcd; }
|
||||
|
||||
virtual void updateCursor();
|
||||
|
||||
private:
|
||||
String _label;
|
||||
Form *_form;
|
||||
Field *next;
|
||||
Field *prev;
|
||||
|
||||
friend class Form;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,308 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "Form.h"
|
||||
#include "Field.h"
|
||||
|
||||
/**
|
||||
* \class Form Form.h <Form.h>
|
||||
* \brief Manager for a form containing data input/output fields.
|
||||
*
|
||||
* See the \ref lcd_form "Form example" for more information on
|
||||
* creating an application that uses forms and fields.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new form and associates it with \a lcd.
|
||||
*
|
||||
* This constructor is typically followed by calls to construct Field
|
||||
* values for each of the fields on the form. For example:
|
||||
*
|
||||
* \code
|
||||
* Form mainForm(lcd);
|
||||
* TextField welcomeField(mainForm, "Form example", "v1.0");
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormText.png
|
||||
*/
|
||||
Form::Form(LiquidCrystal &lcd)
|
||||
: _lcd(&lcd)
|
||||
, first(0)
|
||||
, last(0)
|
||||
, current(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Detaches all remaining fields and destroys this form.
|
||||
*/
|
||||
Form::~Form()
|
||||
{
|
||||
Field *field = first;
|
||||
Field *next;
|
||||
while (field != 0) {
|
||||
next = field->next;
|
||||
field->_form = 0;
|
||||
field->next = 0;
|
||||
field->prev = 0;
|
||||
field = next;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Dispatches \a event to the currently active field using
|
||||
* Field::dispatch().
|
||||
*
|
||||
* The \a event is usually obtained from LCD::getButton().
|
||||
*
|
||||
* Returns zero if the \a event has been handled and no further action
|
||||
* is required.
|
||||
*
|
||||
* Returns FORM_CHANGED if one of the fields on the form has changed value
|
||||
* due to the \a event, perhaps requiring the application to take further
|
||||
* action based on the new field value. Use currentField() or isCurrent()
|
||||
* to determine which field has changed.
|
||||
*
|
||||
* \code
|
||||
* int event = lcd.getButton();
|
||||
* if (mainForm.dispatch(event) == FORM_CHANGED) {
|
||||
* if (mainForm.isCurrent(volumeField)) {
|
||||
* // Adjust the volume to match the field.
|
||||
* setVolume(volumeField.value());
|
||||
* }
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* This function handles the Left and Right buttons to navigate between fields.
|
||||
*
|
||||
* \sa Field::dispatch(), LCD::getButton(), currentField(), isCurrent()
|
||||
*/
|
||||
int Form::dispatch(int event)
|
||||
{
|
||||
if (current) {
|
||||
int exitval = current->dispatch(event);
|
||||
if (exitval >= 0)
|
||||
return exitval;
|
||||
}
|
||||
if (event == LCD_BUTTON_LEFT)
|
||||
prevField();
|
||||
else if (event == LCD_BUTTON_RIGHT)
|
||||
nextField();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Changes to the next field in the "tab order".
|
||||
*
|
||||
* \sa prevField(), defaultField(), currentField()
|
||||
*/
|
||||
void Form::nextField()
|
||||
{
|
||||
Field *field = current;
|
||||
if (!field)
|
||||
field = first;
|
||||
if (field && field->next)
|
||||
field = field->next;
|
||||
else
|
||||
field = first;
|
||||
setCurrentField(field);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Changes to the previous field in the "tab order".
|
||||
*
|
||||
* \sa nextField(), defaultField(), currentField()
|
||||
*/
|
||||
void Form::prevField()
|
||||
{
|
||||
Field *field = current;
|
||||
if (!field)
|
||||
field = last;
|
||||
if (field && field->prev)
|
||||
field = field->prev;
|
||||
else
|
||||
field = last;
|
||||
setCurrentField(field);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Changes to default field (i.e., the first field).
|
||||
*
|
||||
* \sa nextField(), prevField(), currentField()
|
||||
*/
|
||||
void Form::defaultField()
|
||||
{
|
||||
setCurrentField(first);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Adds \a field to this form.
|
||||
*
|
||||
* Usually this function is not required because the field's constructor
|
||||
* will add the field to the form automatically.
|
||||
*
|
||||
* \sa removeField()
|
||||
*/
|
||||
void Form::addField(Field *field)
|
||||
{
|
||||
if (field->_form)
|
||||
return; // Already added to a form.
|
||||
field->_form = this;
|
||||
field->next = 0;
|
||||
field->prev = last;
|
||||
if (last)
|
||||
last->next = field;
|
||||
else
|
||||
first = field;
|
||||
last = field;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Removes \a field from this form.
|
||||
*
|
||||
* If \a field is the current field on-screen, then either the next or
|
||||
* previous field will be made current.
|
||||
*
|
||||
* \sa addField()
|
||||
*/
|
||||
void Form::removeField(Field *field)
|
||||
{
|
||||
if (field->_form != this)
|
||||
return; // Not a member of this form.
|
||||
if (current == field) {
|
||||
if (field->next)
|
||||
setCurrentField(field->next);
|
||||
else if (field->prev)
|
||||
setCurrentField(field->prev);
|
||||
else
|
||||
setCurrentField(0);
|
||||
}
|
||||
if (field->next)
|
||||
field->next->prev = field->prev;
|
||||
else
|
||||
last = field->prev;
|
||||
if (field->prev)
|
||||
field->prev->next = field->next;
|
||||
else
|
||||
first = field->next;
|
||||
field->_form = 0;
|
||||
field->next = 0;
|
||||
field->prev = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn Field *Form::currentField() const
|
||||
* \brief Returns the current field that is displayed on-screen.
|
||||
*
|
||||
* Returns null if the form has no fields, or setCurrentField() explicitly
|
||||
* set the current field to null.
|
||||
*
|
||||
* \sa setCurrentField(), isCurrent()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the current \a field that is displayed on-screen.
|
||||
*
|
||||
* Use this function to programmatically force the form to display a
|
||||
* specific field on-screen.
|
||||
*
|
||||
* \sa currentField(), isCurrent()
|
||||
*/
|
||||
void Form::setCurrentField(Field *field)
|
||||
{
|
||||
if (field && field->_form != this)
|
||||
return; // Wrong form.
|
||||
if (visible) {
|
||||
bool reverse = false;
|
||||
if (current) {
|
||||
current->exitField();
|
||||
if (field->next == current)
|
||||
reverse = true;
|
||||
else if (!field->next && current == first)
|
||||
reverse = true;
|
||||
}
|
||||
current = field;
|
||||
_lcd->clear();
|
||||
if (current)
|
||||
current->enterField(reverse);
|
||||
} else {
|
||||
current = field;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool Form::isCurrent(Field &field) const
|
||||
* \brief Returns true if \a field is currently displayed on-screen, false otherwise.
|
||||
*
|
||||
* This function is typically called after dispatch() returns FORM_CHANGED
|
||||
* to determine which field has changed.
|
||||
*
|
||||
* \sa currentField(), setCurrentField()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Shows the form, or does nothing if the form is already on-screen.
|
||||
*
|
||||
* When the form is shown, the screen will be cleared and the currentField()
|
||||
* will be drawn.
|
||||
*
|
||||
* If the form was previously hidden, then the field that was previously
|
||||
* current will be shown again. Call defaultField() before show() to reset
|
||||
* the form to show the first field instead.
|
||||
*
|
||||
* \sa hide(), isVisible(), defaultField()
|
||||
*/
|
||||
void Form::show()
|
||||
{
|
||||
if (!visible) {
|
||||
if (!current)
|
||||
current = first;
|
||||
visible = true;
|
||||
_lcd->clear();
|
||||
if (current)
|
||||
current->enterField(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Hides the form, or does nothing if the form is not on-screen.
|
||||
*
|
||||
* The screen will be cleared to remove the contents of the current field.
|
||||
*
|
||||
* \sa show(), isVisible()
|
||||
*/
|
||||
void Form::hide()
|
||||
{
|
||||
if (visible) {
|
||||
if (current)
|
||||
current->exitField();
|
||||
visible = false;
|
||||
_lcd->clear();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool Form::isVisible() const
|
||||
* \brief Returns true if the form is shown; false if the form is hidden.
|
||||
*
|
||||
* \sa show(), hide()
|
||||
*/
|
||||
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef Form_h
|
||||
#define Form_h
|
||||
|
||||
#include "LCD.h"
|
||||
|
||||
class Field;
|
||||
|
||||
#define FORM_CHANGED 1
|
||||
|
||||
class Form {
|
||||
public:
|
||||
explicit Form(LiquidCrystal &lcd);
|
||||
~Form();
|
||||
|
||||
int dispatch(int event);
|
||||
|
||||
void nextField();
|
||||
void prevField();
|
||||
void defaultField();
|
||||
|
||||
void addField(Field *field);
|
||||
void removeField(Field *field);
|
||||
|
||||
Field *currentField() const { return current; }
|
||||
void setCurrentField(Field *field);
|
||||
|
||||
bool isCurrent(Field &field) const { return current == &field; }
|
||||
|
||||
void show();
|
||||
void hide();
|
||||
bool isVisible() const { return visible; }
|
||||
|
||||
private:
|
||||
LiquidCrystal *_lcd;
|
||||
Field *first;
|
||||
Field *last;
|
||||
Field *current;
|
||||
bool visible;
|
||||
|
||||
friend class Field;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,249 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "IntField.h"
|
||||
|
||||
/**
|
||||
* \class IntField IntField.h <IntField.h>
|
||||
* \brief Field that manages the input of an integer value.
|
||||
*
|
||||
* IntField is intended for field values that are modifiable by the user.
|
||||
* Pressing Up adds stepValue() to the current value and pressing Down
|
||||
* subtracts stepValue() from the current value. The value is clamped to
|
||||
* the range minValue() to maxValue().
|
||||
*
|
||||
* The following example creates an integer field with the label "Iterations",
|
||||
* that ranges between 1 and 5, with a stepValue() of 1, and an initial
|
||||
* default value() of 2:
|
||||
*
|
||||
* \code
|
||||
* Form mainForm(lcd);
|
||||
* IntField iterField(mainForm, "Iterations", 1, 5, 1, 2);
|
||||
* \endcode
|
||||
*
|
||||
* IntField can be configured to show a suffix() on the screen after the
|
||||
* integer value(). This is intended for communicating the units in which
|
||||
* the value is expressed. For example:
|
||||
*
|
||||
* \code
|
||||
* IntField volumeField(mainForm, "Volume", 0, 100, 5, 85, "%");
|
||||
* IntField speedField(mainForm, "Speed", 0, 2000, 15, 450, " rpm");
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormInt.png
|
||||
*
|
||||
* Use TextField for read-only fields that report integer values but
|
||||
* which are not modifiable by the user.
|
||||
*
|
||||
* \sa Field, TextField
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new integer field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* Initially, value() is 0, minValue() is 0, maxValue() is 100,
|
||||
* stepValue() is 1, and suffix() is an empty string.
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
IntField::IntField(const String &label)
|
||||
: Field(label)
|
||||
, _minValue(0)
|
||||
, _maxValue(100)
|
||||
, _stepValue(1)
|
||||
, _value(0)
|
||||
, _printLen(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new integer field with a specific \a label,
|
||||
* \a minValue, \a maxValue, \a stepValue, and \a value, and attaches
|
||||
* it to a \a form.
|
||||
*
|
||||
* The suffix() is initially set to an empty string.
|
||||
*/
|
||||
IntField::IntField(Form &form, const String &label, int minValue, int maxValue, int stepValue, int value)
|
||||
: Field(form, label)
|
||||
, _minValue(minValue)
|
||||
, _maxValue(maxValue)
|
||||
, _stepValue(stepValue)
|
||||
, _value(value)
|
||||
, _printLen(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new integer field with a specific \a label,
|
||||
* \a minValue, \a maxValue, \a stepValue, \a value, and \a suffix
|
||||
* and attaches it to a \a form.
|
||||
*/
|
||||
IntField::IntField(Form &form, const String &label, int minValue, int maxValue, int stepValue, int value, const String &suffix)
|
||||
: Field(form, label)
|
||||
, _minValue(minValue)
|
||||
, _maxValue(maxValue)
|
||||
, _stepValue(stepValue)
|
||||
, _value(value)
|
||||
, _printLen(0)
|
||||
, _suffix(suffix)
|
||||
{
|
||||
}
|
||||
|
||||
int IntField::dispatch(int event)
|
||||
{
|
||||
if (event == LCD_BUTTON_UP) {
|
||||
setValue(_value + _stepValue);
|
||||
return FORM_CHANGED;
|
||||
} else if (event == LCD_BUTTON_DOWN) {
|
||||
setValue(_value - _stepValue);
|
||||
return FORM_CHANGED;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void IntField::enterField(bool reverse)
|
||||
{
|
||||
Field::enterField(reverse);
|
||||
printValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int IntField::minValue() const
|
||||
* \brief Returns the minimum value for the input field.
|
||||
*
|
||||
* \sa setMinValue(), maxValue(), stepValue(), value()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void IntField::setMinValue(int value)
|
||||
* \brief Sets the minimum \a value for the input field.
|
||||
*
|
||||
* The new minimum \a value will be used to clamp the field's value the
|
||||
* next time setValue() is called.
|
||||
*
|
||||
* \sa minValue(), setMaxValue(), setStepValue(), setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int IntField::maxValue() const
|
||||
* \brief Returns the maximum value for the input field.
|
||||
*
|
||||
* \sa setMaxValue(), minValue(), stepValue(), value()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void IntField::setMaxValue(int value)
|
||||
* \brief Sets the maximum \a value for the input field.
|
||||
*
|
||||
* The new maximum \a value will be used to clamp the field's value the
|
||||
* next time setValue() is called.
|
||||
*
|
||||
* \sa maxValue(), setMinValue(), setStepValue(), setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int IntField::stepValue() const
|
||||
* \brief Returns the step value to use when increasing or decreasing the
|
||||
* value() due to Up and Down button presses.
|
||||
*
|
||||
* \sa setStepValue(), minValue(), maxValue(), value()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void IntField::setStepValue(int value)
|
||||
* \brief Sets the step value \a value to use when increasing or decreasing
|
||||
* the value() due to Up and Down button presses.
|
||||
*
|
||||
* \sa stepValue(), setMinValue(), setMaxValue(), setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int IntField::value() const
|
||||
* \brief Returns the current value of this field.
|
||||
*
|
||||
* \sa setValue(), minValue(), maxValue(), stepValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void IntField::setValue(int value)
|
||||
* \brief Sets the current \a value of this field.
|
||||
*
|
||||
* The \a value will be clamped to the range defined by minValue()
|
||||
* and maxValue().
|
||||
*
|
||||
* \sa value(), setMinValue(), setMaxValue(), setStepValue()
|
||||
*/
|
||||
void IntField::setValue(int value)
|
||||
{
|
||||
if (value < _minValue)
|
||||
value = _minValue;
|
||||
else if (value > _maxValue)
|
||||
value = _maxValue;
|
||||
if (value != _value) {
|
||||
_value = value;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn const String &IntField::suffix() const
|
||||
* \brief Returns the suffix string to be displayed after the field's value.
|
||||
*
|
||||
* \sa setSuffix()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the \a suffix string to be displayed after the field's value.
|
||||
*
|
||||
* Suffixes are typically used to indicate the units that the value() is
|
||||
* expressed in. For example:
|
||||
*
|
||||
* \code
|
||||
* field.setSuffix("%");
|
||||
* field.setSuffix(" rpm");
|
||||
* \endcode
|
||||
*
|
||||
* \sa suffix()
|
||||
*/
|
||||
void IntField::setSuffix(const String &suffix)
|
||||
{
|
||||
_suffix = suffix;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
|
||||
void IntField::printValue()
|
||||
{
|
||||
String str(_value);
|
||||
if (_suffix.length())
|
||||
str += _suffix;
|
||||
lcd()->setCursor(0, 1);
|
||||
lcd()->print(str);
|
||||
unsigned int len = str.length();
|
||||
while (len++ < _printLen)
|
||||
lcd()->write(' ');
|
||||
_printLen = str.length();
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef IntField_h
|
||||
#define IntField_h
|
||||
|
||||
#include "Field.h"
|
||||
|
||||
class IntField : public Field {
|
||||
public:
|
||||
explicit IntField(const String &label);
|
||||
IntField(Form &form, const String &label, int minValue, int maxValue, int stepValue, int value);
|
||||
IntField(Form &form, const String &label, int minValue, int maxValue, int stepValue, int value, const String &suffix);
|
||||
|
||||
int dispatch(int event);
|
||||
|
||||
void enterField(bool reverse);
|
||||
|
||||
int minValue() const { return _minValue; }
|
||||
void setMinValue(int value) { _minValue = value; }
|
||||
|
||||
int maxValue() const { return _maxValue; }
|
||||
void setMaxValue(int value) { _maxValue = value; }
|
||||
|
||||
int stepValue() const { return _stepValue; }
|
||||
void setStepValue(int value) { _stepValue = value; }
|
||||
|
||||
int value() const { return _value; }
|
||||
void setValue(int value);
|
||||
|
||||
const String &suffix() const { return _suffix; }
|
||||
void setSuffix(const String &suffix);
|
||||
|
||||
private:
|
||||
int _minValue;
|
||||
int _maxValue;
|
||||
int _stepValue;
|
||||
int _value;
|
||||
int _printLen;
|
||||
String _suffix;
|
||||
|
||||
void printValue();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,427 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "LCD.h"
|
||||
#include <avr/pgmspace.h>
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
#define LCD_BACK_LIGHT 3 // Default LCD backlight is on D3
|
||||
#define LCD_BUTTON_PIN A0 // Button state is on A0
|
||||
|
||||
#define DEBOUNCE_DELAY 10 // Delay in ms to debounce buttons
|
||||
|
||||
/**
|
||||
* \class LCD LCD.h <LCD.h>
|
||||
* \brief Enhanced library for Freetronics 16x2 LCD shields
|
||||
*
|
||||
* This class extends the standard Arduino LiquidCrystal library with
|
||||
* extra functionality for the Freetronics 16x2 LCD shield:
|
||||
*
|
||||
* http://www.freetronics.com/pages/16x2-lcd-shield-quickstart-guide
|
||||
*
|
||||
* The Freetronics LCD has an additional back light, which is turned
|
||||
* on and off with the display() and noDisplay() functions. The user
|
||||
* can also call enableScreenSaver() to cause the display and back light
|
||||
* to automatically turn off after a specific timeout.
|
||||
* The setScreenSaverMode() function controls which of the display and
|
||||
* back light are disabled when the screen saver activates.
|
||||
*
|
||||
* The Freetronics LCD also has 5 push buttons for Left, Right, Up, Down,
|
||||
* and Select, to assist with the creation of interactive sketches.
|
||||
* The user can call getButton() to get the current button state.
|
||||
* One of the following values may be returned:
|
||||
*
|
||||
* \li LCD_BUTTON_NONE - No button has been pressed, or a button has been
|
||||
* pressed but not yet released.
|
||||
* \li LCD_BUTTON_LEFT - Left button was pressed.
|
||||
* \li LCD_BUTTON_RIGHT - Right button was pressed.
|
||||
* \li LCD_BUTTON_UP - Up button was pressed.
|
||||
* \li LCD_BUTTON_DOWN - Down button was pressed.
|
||||
* \li LCD_BUTTON_SELECT - Select button was pressed.
|
||||
* \li LCD_BUTTON_LEFT_RELEASED - Left button was released.
|
||||
* \li LCD_BUTTON_RIGHT_RELEASED - Right button was released.
|
||||
* \li LCD_BUTTON_UP_RELEASED - Up button was released.
|
||||
* \li LCD_BUTTON_DOWN_RELEASED - Down button was released.
|
||||
* \li LCD_BUTTON_SELECT_RELEASED - Select button was released.
|
||||
*
|
||||
* For convenience, all RELEASED button codes are the negation of their
|
||||
* pressed counterparts. That is, LCD_BUTTON_LEFT_RELEASED == -LCD_BUTTON_LEFT.
|
||||
* LCD_BUTTON_NONE is defined to be zero. Thus, you can check if a
|
||||
* generic button has been pressed with <tt>button > 0</tt> and if a
|
||||
* generic button has been released with <tt>button < 0</tt>.
|
||||
*
|
||||
* \section lcd_dfrobot Support for DFRobot LCD Shield
|
||||
*
|
||||
* The <a href="http://www.dfrobot.com/index.php?route=product/product&product_id=51">DFRobot LCD Shield</a>
|
||||
* is almost identical to the Freetronics shield, except it uses pin 10 for
|
||||
* the back light instead of pin 3. This can be specified in the
|
||||
* application's <tt>setup()</tt> function:
|
||||
*
|
||||
* \code
|
||||
* LCD lcd;
|
||||
*
|
||||
* void setup() {
|
||||
* lcd.setBacklightPin(10);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The back light pin is configured for output the first time the
|
||||
* application calls getButton().
|
||||
*
|
||||
* \sa Form, \ref lcd_hello_world "Hello World Example"
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn LCD::LCD()
|
||||
* \brief Initialize the Freetronics LCD display with the default
|
||||
* pin assignment.
|
||||
*
|
||||
* The following example shows how to initialize the Freetronics
|
||||
* LCD shield:
|
||||
*
|
||||
* \code
|
||||
* LCD lcd;
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn LCD::LCD(uint8_t pin9)
|
||||
* \brief Initialize the Freetronics LCD display for USBDroid.
|
||||
*
|
||||
* On the USBDroid, the D9 pin is used for USB Host functionality.
|
||||
* Either the USB Host's use of D9 must be reassigned to another pin,
|
||||
* or the Freetronics LCD shield must be modified. The following Web
|
||||
* page describes the modifications that are necessary:
|
||||
* http://www.freetronics.com/pages/combining-the-lcd-keypad-shield-and-the-usbdroid
|
||||
*
|
||||
* If you choose to modify the LCD shield, then you must use this version
|
||||
* of the constructor to initialize the shield, passing the alternative
|
||||
* pin as the \a pin9 parameter. Using the recommended pin from the above
|
||||
* Web page of A1, you would initialize the LCD as follows:
|
||||
*
|
||||
* \code
|
||||
* LCD lcd(A1);
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn LCD::LCD(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
|
||||
* \brief Initialize the Freetronics LCD display with custom pins.
|
||||
*
|
||||
* For compatibility with other shields, it may be desirable to rewire
|
||||
* some of the pins entirely. This version of the constructor allows any
|
||||
* pins to be reassigned from the defaults (which are rs = 8, enable = 9,
|
||||
* d0 = 4, d1 = 5, d2 = 6, d3 = 7.)
|
||||
*
|
||||
* \code
|
||||
* LCD lcd(8,9,4,5,10,11);
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
|
||||
void LCD::init()
|
||||
{
|
||||
// The Freetronics display is 16x2.
|
||||
begin(16, 2);
|
||||
|
||||
// Configure the backlight pin, but don't activate it yet in
|
||||
// case the application sets it to something else during setup().
|
||||
// Initialization will be forced in the first call to getButton().
|
||||
_backlightPin = LCD_BACK_LIGHT;
|
||||
backlightInit = false;
|
||||
|
||||
// Initialise button input.
|
||||
pinMode(LCD_BUTTON_PIN, INPUT);
|
||||
digitalWrite(LCD_BUTTON_PIN, LOW);
|
||||
prevButton = LCD_BUTTON_NONE;
|
||||
debounceButton = LCD_BUTTON_NONE;
|
||||
lastDebounce = 0;
|
||||
eatRelease = false;
|
||||
|
||||
// Initialize screen saver.
|
||||
timeout = 0;
|
||||
lastRestore = millis();
|
||||
screenSaved = false;
|
||||
mode = DisplayOff;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn uint8_t LCD::backlightPin() const
|
||||
* \brief Returns the pin that is being used to control the back light.
|
||||
* The default is 3.
|
||||
*
|
||||
* \sa setBacklightPin()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the back light \a pin for the LCD shield.
|
||||
*
|
||||
* The <a href="http://www.dfrobot.com/index.php?route=product/product&product_id=51">DFRobot LCD Shield</a> uses pin 10 for the back light instead of pin 3:
|
||||
*
|
||||
* \code
|
||||
* LCD lcd;
|
||||
*
|
||||
* void setup() {
|
||||
* lcd.setBacklightPin(10);
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The back light pin is configured for output the next time the
|
||||
* application calls getButton().
|
||||
*
|
||||
* \sa backlightPin()
|
||||
*/
|
||||
void LCD::setBacklightPin(uint8_t pin)
|
||||
{
|
||||
if (_backlightPin != pin) {
|
||||
if (backlightInit) {
|
||||
// Restore the previous backlight pin to input, floating.
|
||||
pinMode(_backlightPin, INPUT);
|
||||
digitalWrite(_backlightPin, LOW);
|
||||
|
||||
// Need to re-initialize the backlight at the earliest opportunity.
|
||||
backlightInit = false;
|
||||
}
|
||||
_backlightPin = pin;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Turns on the display of text on the LCD and the back light.
|
||||
*
|
||||
* If the screen saver is active, then calling this function will
|
||||
* deactivate the screen saver and reset the timeout. Thus, this
|
||||
* function can be called for force the screen to restore.
|
||||
*
|
||||
* \sa noDisplay(), enableScreenSaver(), setScreenSaverMode()
|
||||
*/
|
||||
void LCD::display()
|
||||
{
|
||||
LiquidCrystal::display();
|
||||
pinMode(_backlightPin, OUTPUT);
|
||||
digitalWrite(_backlightPin, HIGH);
|
||||
screenSaved = false;
|
||||
backlightInit = true;
|
||||
lastRestore = millis();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Turns off the display of text on the LCD and the back light.
|
||||
*
|
||||
* This function can be called to force the screen saver to activate.
|
||||
*
|
||||
* \sa display(), enableScreenSaver(), setScreenSaverMode()
|
||||
*/
|
||||
void LCD::noDisplay()
|
||||
{
|
||||
if (mode == DisplayOff)
|
||||
LiquidCrystal::noDisplay();
|
||||
pinMode(_backlightPin, OUTPUT);
|
||||
digitalWrite(_backlightPin, LOW);
|
||||
screenSaved = true;
|
||||
backlightInit = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* \enum LCD::ScreenSaverMode
|
||||
* \brief Screen saver mode that controls the display and back light.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var LCD::DisplayOff
|
||||
* \brief Turn off both the display and the backlight when the screen saver
|
||||
* is activated.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var LCD::BacklightOff
|
||||
* \brief Turn off the back light but leave the display on when the screen
|
||||
* saver is activated.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \var LCD::BacklightOnSelect
|
||||
* \brief Same as BacklightOff but the screen saver is only deactivated when
|
||||
* Select is pressed; other buttons have no effect.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn ScreenSaverMode LCD::screenSaverMode() const
|
||||
* \brief Returns the current screen saver mode; default is DisplayOff.
|
||||
*
|
||||
* \sa setScreenSaverMode(), enableScreenSaver()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the current screen saver \a mode.
|
||||
*
|
||||
* \sa screenSaverMode(), enableScreenSaver()
|
||||
*/
|
||||
void LCD::setScreenSaverMode(ScreenSaverMode mode)
|
||||
{
|
||||
if (this->mode != mode) {
|
||||
this->mode = mode;
|
||||
if (screenSaved)
|
||||
noDisplay();
|
||||
else
|
||||
display();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enables the screen saver and causes it to activate after
|
||||
* \a timeoutSecs of inactivity on the buttons.
|
||||
*
|
||||
* If \a timeoutSecs is less than or equal to zero, then the call
|
||||
* is equivalent to calling disableScreenSaver().
|
||||
*
|
||||
* For the screen saver to work, the application must regularly call
|
||||
* getButton() to fetch the LCD's button state even if no buttons
|
||||
* are pressed.
|
||||
*
|
||||
* If the \a timeoutSecs parameter is not supplied, the default is 10 seconds.
|
||||
*
|
||||
* \sa disableScreenSaver(), display(), getButton(), isScreenSaved()
|
||||
*/
|
||||
void LCD::enableScreenSaver(int timeoutSecs)
|
||||
{
|
||||
if (timeoutSecs < 0)
|
||||
timeout = 0;
|
||||
else
|
||||
timeout = ((unsigned long)timeoutSecs) * 1000;
|
||||
display();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables the screen saver.
|
||||
*
|
||||
* \sa enableScreenSaver(), display(), isScreenSaved()
|
||||
*/
|
||||
void LCD::disableScreenSaver()
|
||||
{
|
||||
timeout = 0;
|
||||
display();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool LCD::isScreenSaved() const
|
||||
* \brief Returns true if the screen has been saved; false otherwise.
|
||||
*
|
||||
* \sa enableScreenSaver()
|
||||
*/
|
||||
|
||||
// Button mapping table generated by genlookup.c
|
||||
static unsigned char const buttonMappings[] PROGMEM = {
|
||||
2, 0, 0, 0, 3, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 1,
|
||||
1, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
#define mapButton(value) (pgm_read_byte(&(buttonMappings[(value) >> 5])))
|
||||
|
||||
/**
|
||||
* \brief Gets the next button press, release, or idle event.
|
||||
*
|
||||
* If no buttons are pressed, this function will return LCD_BUTTON_NONE.
|
||||
*
|
||||
* When a button is pressed, this function will return one of
|
||||
* LCD_BUTTON_LEFT, LCD_BUTTON_RIGHT, LCD_BUTTON_UP, LCD_BUTTON_DOWN,
|
||||
* or LCD_BUTTON_SELECT. While the button is pressed, this function
|
||||
* will return LCD_BUTTON_NONE until the button is released. When the
|
||||
* button is released, this function will return one of
|
||||
* LCD_BUTTON_LEFT_RELEASED, LCD_BUTTON_RIGHT_RELEASED,
|
||||
* LCD_BUTTON_UP_RELEAED, LCD_BUTTON_DOWN_RELEASED,
|
||||
* or LCD_BUTTON_SELECT_RELEASED.
|
||||
*
|
||||
* If the screen saver is currently active, then it will be deactivated
|
||||
* by this function whenever a button is pressed. If screenSaverMode() is
|
||||
* DisplayOff, the function will "eat" the button press and return
|
||||
* LCD_BUTTON_NONE. The scrren saver can also be deactivated under
|
||||
* program control by calling display().
|
||||
*
|
||||
* This function debounces the button state automatically so there is no
|
||||
* need for the caller to worry about spurious button events.
|
||||
*
|
||||
* \sa enableScreenSaver(), display(), Form::dispatch()
|
||||
*/
|
||||
int LCD::getButton()
|
||||
{
|
||||
// Initialize the backlight for the first time if necessary.
|
||||
if (!backlightInit)
|
||||
display();
|
||||
|
||||
// Read the currently pressed button.
|
||||
int button = mapButton(analogRead(LCD_BUTTON_PIN));
|
||||
|
||||
// Debounce the button state.
|
||||
unsigned long currentTime = millis();
|
||||
if (button != debounceButton)
|
||||
lastDebounce = currentTime;
|
||||
debounceButton = button;
|
||||
if ((currentTime - lastDebounce) < DEBOUNCE_DELAY)
|
||||
button = prevButton;
|
||||
|
||||
// Process the button event if the state has changed.
|
||||
if (prevButton == LCD_BUTTON_NONE && button != LCD_BUTTON_NONE) {
|
||||
prevButton = button;
|
||||
if (screenSaved) {
|
||||
// Button pressed when screen saver active.
|
||||
if (mode == BacklightOnSelect) {
|
||||
// Turn on the back light only if Select was pressed.
|
||||
if (button == LCD_BUTTON_SELECT) {
|
||||
pinMode(_backlightPin, OUTPUT);
|
||||
digitalWrite(_backlightPin, HIGH);
|
||||
screenSaved = false;
|
||||
backlightInit = true;
|
||||
}
|
||||
} else if (mode == DisplayOff) {
|
||||
display();
|
||||
eatRelease = true;
|
||||
return LCD_BUTTON_NONE;
|
||||
} else {
|
||||
display();
|
||||
}
|
||||
} else if (mode == BacklightOnSelect && button != LCD_BUTTON_SELECT) {
|
||||
eatRelease = false;
|
||||
return button;
|
||||
}
|
||||
eatRelease = false;
|
||||
lastRestore = currentTime;
|
||||
return button;
|
||||
} else if (prevButton != LCD_BUTTON_NONE && button == LCD_BUTTON_NONE) {
|
||||
button = -prevButton;
|
||||
prevButton = LCD_BUTTON_NONE;
|
||||
lastRestore = currentTime;
|
||||
if (eatRelease) {
|
||||
eatRelease = false;
|
||||
return LCD_BUTTON_NONE;
|
||||
}
|
||||
return button;
|
||||
} else {
|
||||
if (!screenSaved && prevButton == LCD_BUTTON_NONE &&
|
||||
timeout != 0 && (currentTime - lastRestore) >= timeout)
|
||||
noDisplay(); // Activate screen saver.
|
||||
return LCD_BUTTON_NONE;
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef LCD_h
|
||||
#define LCD_h
|
||||
|
||||
// Extended version of the LiquidCrystal library that works specifically
|
||||
// with Freetronics' 16x2 LCD display, including support for the back
|
||||
// light and the Up/Down/Left/Right/Select buttons. More info:
|
||||
//
|
||||
// http://www.freetronics.com/pages/16x2-lcd-shield-quickstart-guide
|
||||
|
||||
// Include a copy of the standard LiquidCrystal library so we can extend it.
|
||||
#include "utility/LiquidCrystal.h"
|
||||
|
||||
// Button event codes.
|
||||
#define LCD_BUTTON_NONE 0
|
||||
#define LCD_BUTTON_LEFT 1
|
||||
#define LCD_BUTTON_RIGHT 2
|
||||
#define LCD_BUTTON_UP 3
|
||||
#define LCD_BUTTON_DOWN 4
|
||||
#define LCD_BUTTON_SELECT 5
|
||||
#define LCD_BUTTON_LEFT_RELEASED -1
|
||||
#define LCD_BUTTON_RIGHT_RELEASED -2
|
||||
#define LCD_BUTTON_UP_RELEASED -3
|
||||
#define LCD_BUTTON_DOWN_RELEASED -4
|
||||
#define LCD_BUTTON_SELECT_RELEASED -5
|
||||
|
||||
class LCD : public LiquidCrystal {
|
||||
public:
|
||||
LCD() : LiquidCrystal(8, 9, 4, 5, 6, 7) { init(); }
|
||||
LCD(uint8_t pin9) : LiquidCrystal(8, pin9, 4, 5, 6, 7) { init(); }
|
||||
LCD(uint8_t rs, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
|
||||
: LiquidCrystal(rs, enable, d0, d1, d2, d3) { init(); }
|
||||
|
||||
uint8_t backlightPin() const { return _backlightPin; }
|
||||
void setBacklightPin(uint8_t pin);
|
||||
|
||||
void display();
|
||||
void noDisplay();
|
||||
|
||||
enum ScreenSaverMode
|
||||
{
|
||||
DisplayOff,
|
||||
BacklightOff,
|
||||
BacklightOnSelect
|
||||
};
|
||||
|
||||
ScreenSaverMode screenSaverMode() const { return mode; }
|
||||
void setScreenSaverMode(ScreenSaverMode mode);
|
||||
|
||||
void enableScreenSaver(int timeoutSecs = 10);
|
||||
void disableScreenSaver();
|
||||
bool isScreenSaved() const { return screenSaved; }
|
||||
|
||||
int getButton();
|
||||
|
||||
private:
|
||||
uint8_t _backlightPin;
|
||||
bool backlightInit;
|
||||
int prevButton;
|
||||
int debounceButton;
|
||||
unsigned long timeout;
|
||||
unsigned long lastRestore;
|
||||
unsigned long lastDebounce;
|
||||
bool screenSaved;
|
||||
bool eatRelease;
|
||||
ScreenSaverMode mode;
|
||||
|
||||
void init();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,207 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "ListField.h"
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* \class ListField ListField.h <ListField.h>
|
||||
* \brief Field that manages selection from a static list of items.
|
||||
*
|
||||
* ListField is intended for selecting an element from a list of items.
|
||||
* Each items is represented by a string within program memory, with the
|
||||
* list terminated by null. For example:
|
||||
*
|
||||
* \code
|
||||
* const char item_Eggs[] PROGMEM = "Eggs";
|
||||
* const char item_Cheese[] PROGMEM = "Cheese";
|
||||
* const char item_Pumpkin[] PROGMEM = "Pumpkin";
|
||||
* ListItem const ingredients[] PROGMEM = {
|
||||
* item_Eggs,
|
||||
* item_Cheese,
|
||||
* item_Pumpkin,
|
||||
* 0
|
||||
* };
|
||||
*
|
||||
* Form mainForm(lcd);
|
||||
* ListField ingredient(mainForm, "Select ingredient", ingredients);
|
||||
* \endcode
|
||||
*
|
||||
* If there are only two items in the list, then BoolField can be used instead.
|
||||
*
|
||||
* \sa Field, BoolField
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new list field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* Initially, items() is null and value() is -1.
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
ListField::ListField(const String &label)
|
||||
: Field(label)
|
||||
, _items(0)
|
||||
, _itemCount(0)
|
||||
, _value(-1)
|
||||
, _printLen(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new list field with a specific \a label,
|
||||
* list of \a items, and \a value, and attaches it to a \a form.
|
||||
*/
|
||||
ListField::ListField(Form &form, const String &label, ListItems items, int value)
|
||||
: Field(form, label)
|
||||
, _items(0)
|
||||
, _itemCount(0)
|
||||
, _value(value)
|
||||
, _printLen(0)
|
||||
{
|
||||
setItems(items);
|
||||
}
|
||||
|
||||
int ListField::dispatch(int event)
|
||||
{
|
||||
if (event == LCD_BUTTON_DOWN) {
|
||||
if (_value >= (_itemCount - 1))
|
||||
setValue(0);
|
||||
else
|
||||
setValue(_value + 1);
|
||||
return FORM_CHANGED;
|
||||
} else if (event == LCD_BUTTON_UP) {
|
||||
if (_value <= 0)
|
||||
setValue(_itemCount - 1);
|
||||
else
|
||||
setValue(_value - 1);
|
||||
return FORM_CHANGED;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ListField::enterField(bool reverse)
|
||||
{
|
||||
Field::enterField(reverse);
|
||||
_printLen = 0;
|
||||
printValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn ListItems ListField::items() const
|
||||
* \brief Returns the array of items in this list.
|
||||
*
|
||||
* \sa setItems()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the array of \a items for this list.
|
||||
*
|
||||
* The \a items must be stored within program memory and terminated by null;
|
||||
* for example:
|
||||
*
|
||||
* \code
|
||||
* const char item_Eggs[] PROGMEM = "Eggs";
|
||||
* const char item_Cheese[] PROGMEM = "Cheese";
|
||||
* const char item_Pumpkin[] PROGMEM = "Pumpkin";
|
||||
* ListItem const ingredients[] PROGMEM = {
|
||||
* item_Eggs,
|
||||
* item_Cheese,
|
||||
* item_Pumpkin,
|
||||
* 0
|
||||
* };
|
||||
*
|
||||
* list.setItems(ingredients);
|
||||
* \endcode
|
||||
*
|
||||
* \sa items()
|
||||
*/
|
||||
void ListField::setItems(ListItems items)
|
||||
{
|
||||
_items = items;
|
||||
_itemCount = 0;
|
||||
if (items) {
|
||||
for (;;) {
|
||||
ListItem item = (ListItem)pgm_read_word(items);
|
||||
if (!item)
|
||||
break;
|
||||
++items;
|
||||
++_itemCount;
|
||||
}
|
||||
}
|
||||
if (_value >= _itemCount)
|
||||
_value = _itemCount - 1;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int ListField::value() const
|
||||
* \brief Returns the value of this list; i.e. the index within items() of the
|
||||
* selected item.
|
||||
*
|
||||
* Returns -1 if the items() array is empty or null.
|
||||
*
|
||||
* \sa setValue(), items()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the \a value of this list; i.e. the index within items() of the
|
||||
* selected item.
|
||||
*
|
||||
* The \a value will be clamped to the range of items().
|
||||
*
|
||||
* \sa value(), items()
|
||||
*/
|
||||
void ListField::setValue(int value)
|
||||
{
|
||||
if (_value != value) {
|
||||
_value = value;
|
||||
if (_value < 0)
|
||||
_value = 0;
|
||||
if (_value >= _itemCount)
|
||||
_value = _itemCount - 1;
|
||||
if (isCurrent())
|
||||
printValue();
|
||||
}
|
||||
}
|
||||
|
||||
void ListField::printValue()
|
||||
{
|
||||
lcd()->setCursor(0, 1);
|
||||
int len = 0;
|
||||
if (_value >= 0) {
|
||||
ListItem str = (ListItem)pgm_read_word(&(_items[_value]));
|
||||
char ch;
|
||||
while ((ch = pgm_read_byte(str)) != 0) {
|
||||
lcd()->write(ch);
|
||||
++len;
|
||||
++str;
|
||||
}
|
||||
}
|
||||
while (_printLen-- > len)
|
||||
lcd()->write(' ');
|
||||
_printLen = len;
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ListField_h
|
||||
#define ListField_h
|
||||
|
||||
#include "Field.h"
|
||||
#include <avr/pgmspace.h>
|
||||
|
||||
typedef PGM_P ListItem;
|
||||
typedef const PROGMEM ListItem *ListItems;
|
||||
|
||||
class ListField : public Field {
|
||||
public:
|
||||
explicit ListField(const String &label);
|
||||
ListField(Form &form, const String &label, ListItems items, int value = 0);
|
||||
|
||||
int dispatch(int event);
|
||||
|
||||
void enterField(bool reverse);
|
||||
|
||||
ListItems items() const { return _items; }
|
||||
void setItems(ListItems items);
|
||||
|
||||
int value() const { return _value; }
|
||||
void setValue(int value);
|
||||
|
||||
private:
|
||||
ListItems _items;
|
||||
int _itemCount;
|
||||
int _value;
|
||||
int _printLen;
|
||||
|
||||
void printValue();
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,115 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "TextField.h"
|
||||
|
||||
/**
|
||||
* \class TextField TextField.h <TextField.h>
|
||||
* \brief Field that displays a read-only text value.
|
||||
*
|
||||
* This following example displays a text field with the label
|
||||
* "Form example" and a value() of "v1.0".
|
||||
*
|
||||
* \code
|
||||
* Form mainForm(lcd);
|
||||
* TextField welcomeField(mainForm, "Form example", "v1.0");
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormText.png
|
||||
*
|
||||
* As well as static messages, TextField can be used to display read-only
|
||||
* information that is computed at runtime:
|
||||
*
|
||||
* \code
|
||||
* TextField timeField(mainForm, "Time since reset", "0");
|
||||
*
|
||||
* void loop() {
|
||||
* timeField.setValue(millis() / 1000);
|
||||
* mainForm.dispatch(lcd.getButton());
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* For writable fields, use BoolField, IntField, or TimeField.
|
||||
*
|
||||
* \sa Field
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new text field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* The initial value() will be the empty string.
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
TextField::TextField(const String &label)
|
||||
: Field(label)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new text field with a specific \a label and \a value
|
||||
* attaches it to a \a form.
|
||||
*
|
||||
* \sa value()
|
||||
*/
|
||||
TextField::TextField(Form &form, const String &label, const String &value)
|
||||
: Field(form, label)
|
||||
, _value(value)
|
||||
{
|
||||
}
|
||||
|
||||
void TextField::enterField(bool reverse)
|
||||
{
|
||||
Field::enterField(reverse);
|
||||
lcd()->setCursor(0, 1);
|
||||
lcd()->print(_value);
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn const String &TextField::value() const
|
||||
* \brief Returns the text value that is currently displayed by this field.
|
||||
*
|
||||
* \sa setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the text \a value that is displayed by this field.
|
||||
*
|
||||
* \sa value()
|
||||
*/
|
||||
void TextField::setValue(const String &value)
|
||||
{
|
||||
if (isCurrent()) {
|
||||
unsigned int prevLen = _value.length();
|
||||
unsigned int newLen = value.length();
|
||||
_value = value;
|
||||
lcd()->setCursor(0, 1);
|
||||
lcd()->print(value);
|
||||
while (newLen++ < prevLen)
|
||||
lcd()->write(' ');
|
||||
} else {
|
||||
_value = value;
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef TextField_h
|
||||
#define TextField_h
|
||||
|
||||
#include "Field.h"
|
||||
|
||||
class TextField : public Field {
|
||||
public:
|
||||
explicit TextField(const String &label);
|
||||
TextField(Form &form, const String &label, const String &value);
|
||||
|
||||
void enterField(bool reverse);
|
||||
|
||||
const String &value() const { return _value; }
|
||||
void setValue(const String &value);
|
||||
|
||||
private:
|
||||
String _value;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,330 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "TimeField.h"
|
||||
|
||||
/**
|
||||
* \class TimeField TimeField.h <TimeField.h>
|
||||
* \brief Field that manages the display and editing of a time value.
|
||||
*
|
||||
* TimeField is suitable for displaying wall clock time in 24-hour format,
|
||||
* or for displaying timeouts and durations in seconds. Times are specified
|
||||
* in seconds as an <tt>unsigned long</tt> value. They are displayed
|
||||
* as <tt>HH:MM:SS</tt>, for hours, minutes, and seconds.
|
||||
*
|
||||
* The time field can be either read-only or read-write. When read-write,
|
||||
* the Up, Down, Left, and Right buttons can be used to modify the hour,
|
||||
* minute, and second components of the time value.
|
||||
*
|
||||
* The following example displays the number of hours, minutes, and seconds
|
||||
* since the device was reset, wrapping around after 24 hours:
|
||||
*
|
||||
* \code
|
||||
* Form mainForm(lcd);
|
||||
* TimeField timeField(mainForm, "Time since reset", 24, TIMEFIELD_READ_ONLY);
|
||||
*
|
||||
* void loop() {
|
||||
* timeField.setValue(millis() / 1000);
|
||||
* mainForm.dispatch(lcd.getButton());
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormTimeRO.png
|
||||
*
|
||||
* A read-write field can be used to ask the user for the duration of an
|
||||
* application count-down timer:
|
||||
*
|
||||
* \code
|
||||
* TimeField durationField(mainForm, "Timer duration", 24, TIMEFIELD_READ_WRITE);
|
||||
* \endcode
|
||||
*
|
||||
* \image html FormTimeRW.png
|
||||
*
|
||||
* \sa Field
|
||||
*/
|
||||
|
||||
#define EDIT_HOUR 0
|
||||
#define EDIT_MINUTE_TENS 1
|
||||
#define EDIT_MINUTE 2
|
||||
#define EDIT_SECOND_TENS 3
|
||||
#define EDIT_SECOND 4
|
||||
|
||||
/**
|
||||
* \brief Constructs a new time field with a specific \a label.
|
||||
*
|
||||
* The field is initially not associated with a Form. The field can be
|
||||
* added to a form later using Form::addField().
|
||||
*
|
||||
* Initially value() is 0, maxHours() is 24, and isReadOnly() is
|
||||
* TIMEFIELD_READ_WRITE.
|
||||
*
|
||||
* \sa Form::addField()
|
||||
*/
|
||||
TimeField::TimeField(const String &label)
|
||||
: Field(label)
|
||||
, _value(0)
|
||||
, _maxHours(24)
|
||||
, _printLen(0)
|
||||
, _readOnly(false)
|
||||
, editField(EDIT_HOUR)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Constructs a new boolean field with a specific \a label and
|
||||
* attaches it to a \a form.
|
||||
*
|
||||
* The initial value() of the field will be 0. The value() will be limited
|
||||
* to be less than \a maxHours * 60 * 60 seconds.
|
||||
*
|
||||
* If \a readOnly is TIMEFIELD_READ_ONLY, then the field will display times
|
||||
* but not allow them to be modified by the user. If \a readOnly is
|
||||
* TIMEFIELD_READ_WRITE, then the field will modifiable by the user.
|
||||
*
|
||||
* \sa value()
|
||||
*/
|
||||
TimeField::TimeField(Form &form, const String &label, int maxHours, bool readOnly)
|
||||
: Field(form, label)
|
||||
, _value(0)
|
||||
, _maxHours(maxHours)
|
||||
, _printLen(0)
|
||||
, _readOnly(readOnly)
|
||||
, editField(EDIT_HOUR)
|
||||
{
|
||||
}
|
||||
|
||||
int TimeField::dispatch(int event)
|
||||
{
|
||||
unsigned long newValue;
|
||||
if (_readOnly)
|
||||
return -1;
|
||||
if (event == LCD_BUTTON_UP) {
|
||||
newValue = _value;
|
||||
if (editField == EDIT_HOUR) {
|
||||
newValue += 60 * 60;
|
||||
} else if (editField == EDIT_MINUTE_TENS) {
|
||||
if (((newValue / 60) % 60) >= 50)
|
||||
newValue -= 50 * 60;
|
||||
else
|
||||
newValue += 10 * 60;
|
||||
} else if (editField == EDIT_MINUTE) {
|
||||
if (((newValue / 60) % 60) == 59)
|
||||
newValue -= 59 * 60;
|
||||
else
|
||||
newValue += 60;
|
||||
} else if (editField == EDIT_SECOND_TENS) {
|
||||
if ((newValue % 60) >= 50)
|
||||
newValue -= 50;
|
||||
else
|
||||
newValue += 10;
|
||||
} else {
|
||||
if ((newValue % 60) == 59)
|
||||
newValue -= 59;
|
||||
else
|
||||
newValue += 1;
|
||||
}
|
||||
setValue(newValue);
|
||||
return FORM_CHANGED;
|
||||
} else if (event == LCD_BUTTON_DOWN) {
|
||||
newValue = _value;
|
||||
if (editField == EDIT_HOUR) {
|
||||
if (newValue < 60 * 60)
|
||||
newValue += ((unsigned long)(_maxHours - 1)) * 60 * 60;
|
||||
else
|
||||
newValue -= 60 * 60;
|
||||
} else if (editField == EDIT_MINUTE_TENS) {
|
||||
if (((newValue / 60) % 60) < 10)
|
||||
newValue += 50 * 60;
|
||||
else
|
||||
newValue -= 10 * 60;
|
||||
} else if (editField == EDIT_MINUTE) {
|
||||
if (((newValue / 60) % 60) == 0)
|
||||
newValue += 59 * 60;
|
||||
else
|
||||
newValue -= 60;
|
||||
} else if (editField == EDIT_SECOND_TENS) {
|
||||
if ((newValue % 60) < 10)
|
||||
newValue += 50;
|
||||
else
|
||||
newValue -= 10;
|
||||
} else {
|
||||
if ((newValue % 60) == 0)
|
||||
newValue += 59;
|
||||
else
|
||||
newValue -= 1;
|
||||
}
|
||||
setValue(newValue);
|
||||
return FORM_CHANGED;
|
||||
} else if (event == LCD_BUTTON_LEFT) {
|
||||
if (editField != EDIT_HOUR) {
|
||||
--editField;
|
||||
printTime();
|
||||
return 0;
|
||||
}
|
||||
} else if (event == LCD_BUTTON_RIGHT) {
|
||||
if (editField != EDIT_SECOND) {
|
||||
++editField;
|
||||
printTime();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void TimeField::enterField(bool reverse)
|
||||
{
|
||||
Field::enterField(reverse);
|
||||
if (reverse)
|
||||
editField = EDIT_SECOND;
|
||||
else
|
||||
editField = EDIT_HOUR;
|
||||
printTime();
|
||||
if (!_readOnly)
|
||||
lcd()->cursor();
|
||||
}
|
||||
|
||||
void TimeField::exitField()
|
||||
{
|
||||
if (!_readOnly)
|
||||
lcd()->noCursor();
|
||||
Field::exitField();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn unsigned long TimeField::value() const
|
||||
* \brief Returns the current value of this time field, in seconds.
|
||||
*
|
||||
* \sa setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the \a value of this time field, in seconds.
|
||||
*
|
||||
* If \a value is greater than or equal to maxHours() * 60 * 60,
|
||||
* then it will be wrapped around to fall within the valid range.
|
||||
*
|
||||
* \sa value(), maxHours()
|
||||
*/
|
||||
void TimeField::setValue(unsigned long value)
|
||||
{
|
||||
unsigned long maxSecs = ((unsigned long)_maxHours) * 60 * 60;
|
||||
value %= maxSecs;
|
||||
if (value != _value) {
|
||||
_value = value;
|
||||
if (isCurrent())
|
||||
printTime();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn int TimeField::maxHours() const
|
||||
* \brief Returns the maximum number of hours before the field wraps around.
|
||||
*
|
||||
* \sa setMaxHours(), setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void TimeField::setMaxHours(int maxHours)
|
||||
* \brief Sets the maximum number of hours before the field wraps around
|
||||
* to \a maxHours.
|
||||
*
|
||||
* \sa maxHours(), setValue()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn bool TimeField::readOnly() const
|
||||
* \brief Returns TIMEFIELD_READ_ONLY (true) or TIMEFIELD_READ_WRITE (false).
|
||||
*
|
||||
* \sa setReadOnly()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the read-only state of this field to \a value.
|
||||
*
|
||||
* The \a value should be one of TIMEFIELD_READ_ONLY (true) or
|
||||
* TIMEFIELD_READ_WRITE (false). Use of the named constants is recommended.
|
||||
*
|
||||
* \sa readOnly()
|
||||
*/
|
||||
void TimeField::setReadOnly(bool value)
|
||||
{
|
||||
if (_readOnly != value) {
|
||||
_readOnly = value;
|
||||
printTime();
|
||||
if (isCurrent()) {
|
||||
if (value)
|
||||
lcd()->cursor();
|
||||
else
|
||||
lcd()->noCursor();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TimeField::printTime()
|
||||
{
|
||||
lcd()->setCursor(0, 1);
|
||||
int col = printField(_value / (60 * 60));
|
||||
int hourCol = col - 1;
|
||||
lcd()->write(':');
|
||||
++col;
|
||||
col += printField((_value / 60) % 60);
|
||||
int minuteCol = col - 1;
|
||||
lcd()->write(':');
|
||||
++col;
|
||||
col += printField(_value % 60);
|
||||
int secondCol = col - 1;
|
||||
int tempCol = col;
|
||||
while (tempCol++ < _printLen)
|
||||
lcd()->write(' ');
|
||||
_printLen = col;
|
||||
if (!_readOnly) {
|
||||
if (editField == EDIT_HOUR)
|
||||
lcd()->setCursor(hourCol, 1);
|
||||
else if (editField == EDIT_MINUTE_TENS)
|
||||
lcd()->setCursor(minuteCol - 1, 1);
|
||||
else if (editField == EDIT_MINUTE)
|
||||
lcd()->setCursor(minuteCol, 1);
|
||||
else if (editField == EDIT_SECOND_TENS)
|
||||
lcd()->setCursor(secondCol - 1, 1);
|
||||
else
|
||||
lcd()->setCursor(secondCol, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int TimeField::printField(unsigned long value)
|
||||
{
|
||||
if (value < 100) {
|
||||
lcd()->write('0' + (int)(value / 10));
|
||||
lcd()->write('0' + (int)(value % 10));
|
||||
return 2;
|
||||
}
|
||||
unsigned long divisor = 100;
|
||||
while ((value / divisor) >= 10)
|
||||
divisor *= 10;
|
||||
int digits = 0;
|
||||
while (divisor > 0) {
|
||||
lcd()->write('0' + (int)((value / divisor) % 10));
|
||||
divisor /= 10;
|
||||
++digits;
|
||||
}
|
||||
return digits;
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef TimeField_h
|
||||
#define TimeField_h
|
||||
|
||||
#include "Field.h"
|
||||
|
||||
#define TIMEFIELD_READ_ONLY true
|
||||
#define TIMEFIELD_READ_WRITE false
|
||||
|
||||
class TimeField : public Field {
|
||||
public:
|
||||
explicit TimeField(const String &label);
|
||||
TimeField(Form &form, const String &label, int maxHours, bool readOnly);
|
||||
|
||||
int dispatch(int event);
|
||||
|
||||
void enterField(bool reverse);
|
||||
void exitField();
|
||||
|
||||
unsigned long value() const { return _value; }
|
||||
void setValue(unsigned long value);
|
||||
|
||||
int maxHours() const { return _maxHours; }
|
||||
void setMaxHours(int maxHours) { _maxHours = maxHours; }
|
||||
|
||||
bool readOnly() const { return _readOnly; }
|
||||
void setReadOnly(bool value);
|
||||
|
||||
private:
|
||||
unsigned long _value;
|
||||
int _maxHours;
|
||||
int _printLen;
|
||||
bool _readOnly;
|
||||
uint8_t editField;
|
||||
|
||||
void printTime();
|
||||
int printField(unsigned long value);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
This example demonstrates how to use the Form and Field classes from the
|
||||
LCD library to provide a simple UI on the 16x2 LCD display.
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
// include the library code:
|
||||
#include <LCD.h>
|
||||
#include <Form.h>
|
||||
#include <TextField.h>
|
||||
#include <TimeField.h>
|
||||
#include <IntField.h>
|
||||
#include <BoolField.h>
|
||||
|
||||
// Initialize the LCD
|
||||
LCD lcd;
|
||||
|
||||
// Note: if you are using the USBDroid and have reassigned pin D9 on the LCD shield to some
|
||||
// other pin (e.g. A1), then you will need to initialize the shield with something like:
|
||||
// LCD lcd(A1);
|
||||
// See also: http://www.freetronics.com/pages/combining-the-lcd-keypad-shield-and-the-usbdroid
|
||||
|
||||
// Create the main form and its fields.
|
||||
Form mainForm(lcd);
|
||||
TextField welcomeField(mainForm, "Form example", "v1.0");
|
||||
TimeField timeField(mainForm, "Time since reset", 24, TIMEFIELD_READ_ONLY);
|
||||
IntField volumeField(mainForm, "Volume", 0, 100, 5, 85, "%");
|
||||
BoolField ledField(mainForm, "Status LED", "On", "Off", true);
|
||||
TimeField durationField(mainForm, "Timer duration", 24, TIMEFIELD_READ_WRITE);
|
||||
|
||||
#define STATUS_LED 13
|
||||
|
||||
void setup() {
|
||||
// Status LED initially on.
|
||||
pinMode(STATUS_LED, OUTPUT);
|
||||
digitalWrite(STATUS_LED, HIGH);
|
||||
|
||||
// Enable the screen saver, which will automatically blank the screen after 10 seconds.
|
||||
// The screen will wake up again when a button is pressed or lcd.display() is called.
|
||||
lcd.enableScreenSaver();
|
||||
|
||||
// Show the main form for the first time.
|
||||
mainForm.show();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Update the number of seconds since reset:
|
||||
timeField.setValue(millis() / 1000);
|
||||
|
||||
// Dispatch button events to the main form.
|
||||
int event = lcd.getButton();
|
||||
if (mainForm.dispatch(event) == FORM_CHANGED) {
|
||||
if (mainForm.isCurrent(ledField)) {
|
||||
if (ledField.value())
|
||||
digitalWrite(STATUS_LED, HIGH);
|
||||
else
|
||||
digitalWrite(STATUS_LED, LOW);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 502 KiB |
|
Before Width: | Height: | Size: 400 KiB |
|
Before Width: | Height: | Size: 475 KiB |
|
Before Width: | Height: | Size: 485 KiB |
|
Before Width: | Height: | Size: 453 KiB |
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
This example demonstrates how to use the LCD library, which extends the
|
||||
standard LiquidCrystal library to provide support for the Freetronics back light
|
||||
and Up/Down/Left/Right/Select buttons. More information on the shield here:
|
||||
|
||||
http://www.freetronics.com/pages/16x2-lcd-shield-quickstart-guide
|
||||
|
||||
This example is placed into the public domain.
|
||||
*/
|
||||
|
||||
#include <LCD.h>
|
||||
LCD lcd;
|
||||
|
||||
// Note: if you are using the USBDroid and have reassigned pin D9 on the LCD shield to some
|
||||
// other pin (e.g. A1), then you will need to initialize the shield with something like:
|
||||
// LCD lcd(A1);
|
||||
// See also: http://www.freetronics.com/pages/combining-the-lcd-keypad-shield-and-the-usbdroid
|
||||
|
||||
void setup() {
|
||||
lcd.enableScreenSaver();
|
||||
lcd.print("hello, world!");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print(millis() / 1000);
|
||||
|
||||
lcd.setCursor(8, 1);
|
||||
int button = lcd.getButton();
|
||||
if (button == LCD_BUTTON_LEFT)
|
||||
lcd.print("LEFT");
|
||||
else if (button == LCD_BUTTON_RIGHT)
|
||||
lcd.print("RIGHT");
|
||||
else if (button == LCD_BUTTON_UP)
|
||||
lcd.print("UP");
|
||||
else if (button == LCD_BUTTON_DOWN)
|
||||
lcd.print("DOWN");
|
||||
else if (button == LCD_BUTTON_SELECT)
|
||||
lcd.print("SELECT");
|
||||
else if (button < 0) // button release
|
||||
lcd.print(" ");
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 518 KiB |
@@ -1,21 +0,0 @@
|
||||
LCD KEYWORD1
|
||||
Form KEYWORD1
|
||||
Field KEYWORD1
|
||||
BoolField KEYWORD1
|
||||
IntField KEYWORD1
|
||||
TextField KEYWORD1
|
||||
TimeField KEYWORD1
|
||||
|
||||
getButton KEYWORD2
|
||||
enableScreenSaver KEYWORD2
|
||||
disableScreenSaver KEYWORD2
|
||||
isScreenSaved KEYWORD2
|
||||
|
||||
show KEYWORD2
|
||||
hide KEYWORD2
|
||||
dispatch KEYWORD2
|
||||
isCurrent KEYWORD2
|
||||
|
||||
setLabel KEYWORD2
|
||||
setValue KEYWORD2
|
||||
value KEYWORD2
|
||||
@@ -1,324 +0,0 @@
|
||||
#include "LiquidCrystal.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
// When the display powers up, it is configured as follows:
|
||||
//
|
||||
// 1. Display clear
|
||||
// 2. Function set:
|
||||
// DL = 1; 8-bit interface data
|
||||
// N = 0; 1-line display
|
||||
// F = 0; 5x8 dot character font
|
||||
// 3. Display on/off control:
|
||||
// D = 0; Display off
|
||||
// C = 0; Cursor off
|
||||
// B = 0; Blinking off
|
||||
// 4. Entry mode set:
|
||||
// I/D = 1; Increment by 1
|
||||
// S = 0; No shift
|
||||
//
|
||||
// Note, however, that resetting the Arduino doesn't reset the LCD, so we
|
||||
// can't assume that its in that state when a sketch starts (and the
|
||||
// LiquidCrystal constructor is called).
|
||||
|
||||
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
|
||||
{
|
||||
init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);
|
||||
}
|
||||
|
||||
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
|
||||
{
|
||||
init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7);
|
||||
}
|
||||
|
||||
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
|
||||
{
|
||||
init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
|
||||
{
|
||||
init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void LiquidCrystal::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
|
||||
{
|
||||
_rs_pin = rs;
|
||||
_rw_pin = rw;
|
||||
_enable_pin = enable;
|
||||
|
||||
_data_pins[0] = d0;
|
||||
_data_pins[1] = d1;
|
||||
_data_pins[2] = d2;
|
||||
_data_pins[3] = d3;
|
||||
_data_pins[4] = d4;
|
||||
_data_pins[5] = d5;
|
||||
_data_pins[6] = d6;
|
||||
_data_pins[7] = d7;
|
||||
|
||||
pinMode(_rs_pin, OUTPUT);
|
||||
// we can save 1 pin by not using RW. Indicate by passing 255 instead of pin#
|
||||
if (_rw_pin != 255) {
|
||||
pinMode(_rw_pin, OUTPUT);
|
||||
}
|
||||
pinMode(_enable_pin, OUTPUT);
|
||||
|
||||
if (fourbitmode)
|
||||
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
|
||||
else
|
||||
_displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
|
||||
|
||||
begin(16, 1);
|
||||
}
|
||||
|
||||
void LiquidCrystal::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
|
||||
if (lines > 1) {
|
||||
_displayfunction |= LCD_2LINE;
|
||||
}
|
||||
_numlines = lines;
|
||||
_currline = 0;
|
||||
|
||||
// for some 1 line displays you can select a 10 pixel high font
|
||||
if ((dotsize != 0) && (lines == 1)) {
|
||||
_displayfunction |= LCD_5x10DOTS;
|
||||
}
|
||||
|
||||
// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
|
||||
// according to datasheet, we need at least 40ms after power rises above 2.7V
|
||||
// before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
|
||||
delayMicroseconds(50000);
|
||||
// Now we pull both RS and R/W low to begin commands
|
||||
digitalWrite(_rs_pin, LOW);
|
||||
digitalWrite(_enable_pin, LOW);
|
||||
if (_rw_pin != 255) {
|
||||
digitalWrite(_rw_pin, LOW);
|
||||
}
|
||||
|
||||
//put the LCD into 4 bit or 8 bit mode
|
||||
if (! (_displayfunction & LCD_8BITMODE)) {
|
||||
// this is according to the hitachi HD44780 datasheet
|
||||
// figure 24, pg 46
|
||||
|
||||
// we start in 8bit mode, try to set 4 bit mode
|
||||
write4bits(0x03);
|
||||
delayMicroseconds(4500); // wait min 4.1ms
|
||||
|
||||
// second try
|
||||
write4bits(0x03);
|
||||
delayMicroseconds(4500); // wait min 4.1ms
|
||||
|
||||
// third go!
|
||||
write4bits(0x03);
|
||||
delayMicroseconds(150);
|
||||
|
||||
// finally, set to 4-bit interface
|
||||
write4bits(0x02);
|
||||
} else {
|
||||
// this is according to the hitachi HD44780 datasheet
|
||||
// page 45 figure 23
|
||||
|
||||
// Send function set command sequence
|
||||
command(LCD_FUNCTIONSET | _displayfunction);
|
||||
delayMicroseconds(4500); // wait more than 4.1ms
|
||||
|
||||
// second try
|
||||
command(LCD_FUNCTIONSET | _displayfunction);
|
||||
delayMicroseconds(150);
|
||||
|
||||
// third go
|
||||
command(LCD_FUNCTIONSET | _displayfunction);
|
||||
}
|
||||
|
||||
// finally, set # lines, font size, etc.
|
||||
command(LCD_FUNCTIONSET | _displayfunction);
|
||||
|
||||
// turn the display on with no cursor or blinking default
|
||||
_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
|
||||
display();
|
||||
|
||||
// clear it off
|
||||
clear();
|
||||
|
||||
// Initialize to default text direction (for romance languages)
|
||||
_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
|
||||
// set the entry mode
|
||||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
|
||||
}
|
||||
|
||||
/********** high level commands, for the user! */
|
||||
void LiquidCrystal::clear()
|
||||
{
|
||||
command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
|
||||
delayMicroseconds(2000); // this command takes a long time!
|
||||
}
|
||||
|
||||
void LiquidCrystal::home()
|
||||
{
|
||||
command(LCD_RETURNHOME); // set cursor position to zero
|
||||
delayMicroseconds(2000); // this command takes a long time!
|
||||
}
|
||||
|
||||
void LiquidCrystal::setCursor(uint8_t col, uint8_t row)
|
||||
{
|
||||
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
|
||||
if ( row >= _numlines ) {
|
||||
row = _numlines-1; // we count rows starting w/0
|
||||
}
|
||||
|
||||
command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
|
||||
}
|
||||
|
||||
// Turn the display on/off (quickly)
|
||||
void LiquidCrystal::noDisplay() {
|
||||
_displaycontrol &= ~LCD_DISPLAYON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
void LiquidCrystal::display() {
|
||||
_displaycontrol |= LCD_DISPLAYON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
|
||||
// Turns the underline cursor on/off
|
||||
void LiquidCrystal::noCursor() {
|
||||
_displaycontrol &= ~LCD_CURSORON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
void LiquidCrystal::cursor() {
|
||||
_displaycontrol |= LCD_CURSORON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
|
||||
// Turn on and off the blinking cursor
|
||||
void LiquidCrystal::noBlink() {
|
||||
_displaycontrol &= ~LCD_BLINKON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
void LiquidCrystal::blink() {
|
||||
_displaycontrol |= LCD_BLINKON;
|
||||
command(LCD_DISPLAYCONTROL | _displaycontrol);
|
||||
}
|
||||
|
||||
// These commands scroll the display without changing the RAM
|
||||
void LiquidCrystal::scrollDisplayLeft(void) {
|
||||
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
|
||||
}
|
||||
void LiquidCrystal::scrollDisplayRight(void) {
|
||||
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
|
||||
}
|
||||
|
||||
// This is for text that flows Left to Right
|
||||
void LiquidCrystal::leftToRight(void) {
|
||||
_displaymode |= LCD_ENTRYLEFT;
|
||||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
}
|
||||
|
||||
// This is for text that flows Right to Left
|
||||
void LiquidCrystal::rightToLeft(void) {
|
||||
_displaymode &= ~LCD_ENTRYLEFT;
|
||||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
}
|
||||
|
||||
// This will 'right justify' text from the cursor
|
||||
void LiquidCrystal::autoscroll(void) {
|
||||
_displaymode |= LCD_ENTRYSHIFTINCREMENT;
|
||||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
}
|
||||
|
||||
// This will 'left justify' text from the cursor
|
||||
void LiquidCrystal::noAutoscroll(void) {
|
||||
_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
|
||||
command(LCD_ENTRYMODESET | _displaymode);
|
||||
}
|
||||
|
||||
// Allows us to fill the first 8 CGRAM locations
|
||||
// with custom characters
|
||||
void LiquidCrystal::createChar(uint8_t location, uint8_t charmap[]) {
|
||||
location &= 0x7; // we only have 8 locations 0-7
|
||||
command(LCD_SETCGRAMADDR | (location << 3));
|
||||
for (int i=0; i<8; i++) {
|
||||
write(charmap[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/*********** mid level commands, for sending data/cmds */
|
||||
|
||||
inline void LiquidCrystal::command(uint8_t value) {
|
||||
send(value, LOW);
|
||||
}
|
||||
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
|
||||
inline size_t LiquidCrystal::write(uint8_t value) {
|
||||
send(value, HIGH);
|
||||
return 1; // assume sucess
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline void LiquidCrystal::write(uint8_t value) {
|
||||
send(value, HIGH);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/************ low level data pushing commands **********/
|
||||
|
||||
// write either command or data, with automatic 4/8-bit selection
|
||||
void LiquidCrystal::send(uint8_t value, uint8_t mode) {
|
||||
digitalWrite(_rs_pin, mode);
|
||||
|
||||
// if there is a RW pin indicated, set it low to Write
|
||||
if (_rw_pin != 255) {
|
||||
digitalWrite(_rw_pin, LOW);
|
||||
}
|
||||
|
||||
if (_displayfunction & LCD_8BITMODE) {
|
||||
write8bits(value);
|
||||
} else {
|
||||
write4bits(value>>4);
|
||||
write4bits(value);
|
||||
}
|
||||
}
|
||||
|
||||
void LiquidCrystal::pulseEnable(void) {
|
||||
digitalWrite(_enable_pin, LOW);
|
||||
delayMicroseconds(1);
|
||||
digitalWrite(_enable_pin, HIGH);
|
||||
delayMicroseconds(1); // enable pulse must be >450ns
|
||||
digitalWrite(_enable_pin, LOW);
|
||||
delayMicroseconds(100); // commands need > 37us to settle
|
||||
}
|
||||
|
||||
void LiquidCrystal::write4bits(uint8_t value) {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
pinMode(_data_pins[i], OUTPUT);
|
||||
digitalWrite(_data_pins[i], (value >> i) & 0x01);
|
||||
}
|
||||
|
||||
pulseEnable();
|
||||
}
|
||||
|
||||
void LiquidCrystal::write8bits(uint8_t value) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
pinMode(_data_pins[i], OUTPUT);
|
||||
digitalWrite(_data_pins[i], (value >> i) & 0x01);
|
||||
}
|
||||
|
||||
pulseEnable();
|
||||
}
|
||||
@@ -1,110 +0,0 @@
|
||||
#ifndef LiquidCrystal_h
|
||||
#define LiquidCrystal_h
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "Print.h"
|
||||
|
||||
// commands
|
||||
#define LCD_CLEARDISPLAY 0x01
|
||||
#define LCD_RETURNHOME 0x02
|
||||
#define LCD_ENTRYMODESET 0x04
|
||||
#define LCD_DISPLAYCONTROL 0x08
|
||||
#define LCD_CURSORSHIFT 0x10
|
||||
#define LCD_FUNCTIONSET 0x20
|
||||
#define LCD_SETCGRAMADDR 0x40
|
||||
#define LCD_SETDDRAMADDR 0x80
|
||||
|
||||
// flags for display entry mode
|
||||
#define LCD_ENTRYRIGHT 0x00
|
||||
#define LCD_ENTRYLEFT 0x02
|
||||
#define LCD_ENTRYSHIFTINCREMENT 0x01
|
||||
#define LCD_ENTRYSHIFTDECREMENT 0x00
|
||||
|
||||
// flags for display on/off control
|
||||
#define LCD_DISPLAYON 0x04
|
||||
#define LCD_DISPLAYOFF 0x00
|
||||
#define LCD_CURSORON 0x02
|
||||
#define LCD_CURSOROFF 0x00
|
||||
#define LCD_BLINKON 0x01
|
||||
#define LCD_BLINKOFF 0x00
|
||||
|
||||
// flags for display/cursor shift
|
||||
#define LCD_DISPLAYMOVE 0x08
|
||||
#define LCD_CURSORMOVE 0x00
|
||||
#define LCD_MOVERIGHT 0x04
|
||||
#define LCD_MOVELEFT 0x00
|
||||
|
||||
// flags for function set
|
||||
#define LCD_8BITMODE 0x10
|
||||
#define LCD_4BITMODE 0x00
|
||||
#define LCD_2LINE 0x08
|
||||
#define LCD_1LINE 0x00
|
||||
#define LCD_5x10DOTS 0x04
|
||||
#define LCD_5x8DOTS 0x00
|
||||
|
||||
class LiquidCrystal : public Print {
|
||||
public:
|
||||
LiquidCrystal(uint8_t rs, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
|
||||
LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
|
||||
LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
|
||||
LiquidCrystal(uint8_t rs, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
|
||||
|
||||
void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
|
||||
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
|
||||
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
|
||||
|
||||
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
|
||||
|
||||
void clear();
|
||||
void home();
|
||||
|
||||
void noDisplay();
|
||||
void display();
|
||||
void noBlink();
|
||||
void blink();
|
||||
void noCursor();
|
||||
void cursor();
|
||||
void scrollDisplayLeft();
|
||||
void scrollDisplayRight();
|
||||
void leftToRight();
|
||||
void rightToLeft();
|
||||
void autoscroll();
|
||||
void noAutoscroll();
|
||||
|
||||
void createChar(uint8_t, uint8_t[]);
|
||||
void setCursor(uint8_t, uint8_t);
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
virtual size_t write(uint8_t);
|
||||
#else
|
||||
virtual void write(uint8_t);
|
||||
#endif
|
||||
void command(uint8_t);
|
||||
|
||||
using Print::write;
|
||||
private:
|
||||
void send(uint8_t, uint8_t);
|
||||
void write4bits(uint8_t);
|
||||
void write8bits(uint8_t);
|
||||
void pulseEnable();
|
||||
|
||||
uint8_t _rs_pin; // LOW: command. HIGH: character.
|
||||
uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD.
|
||||
uint8_t _enable_pin; // activated by a HIGH pulse.
|
||||
uint8_t _data_pins[8];
|
||||
|
||||
uint8_t _displayfunction;
|
||||
uint8_t _displaycontrol;
|
||||
uint8_t _displaymode;
|
||||
|
||||
uint8_t _initialized;
|
||||
|
||||
uint8_t _numlines,_currline;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,239 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 Southern Storm Software, Pty Ltd.
|
||||
*
|
||||
* 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 "Melody.h"
|
||||
#if defined(ARDUINO) && ARDUINO >= 100
|
||||
#include <Arduino.h>
|
||||
#else
|
||||
#include <WProgram.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \class Melody Melody.h <Melody.h>
|
||||
* \brief Plays a melody on a digital output pin using tone().
|
||||
*
|
||||
* The following example plays a simple tone three times on digital pin 8:
|
||||
*
|
||||
* \code
|
||||
* #include <Melody.h>
|
||||
*
|
||||
* int notes[] = {
|
||||
* NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3,
|
||||
* NOTE_REST, NOTE_B3, NOTE_C4, NOTE_REST
|
||||
* };
|
||||
* byte lengths[] = {4, 8, 8, 4, 4, 4, 4, 4, 2};
|
||||
*
|
||||
* Melody melody(8);
|
||||
*
|
||||
* void setup() {
|
||||
* melody.setMelody(notes, lengths, sizeof(lengths));
|
||||
* melody.setLoopCount(3);
|
||||
* melody.play();
|
||||
* }
|
||||
*
|
||||
* void loop() {
|
||||
* melody.run();
|
||||
* }
|
||||
* \endcode
|
||||
*
|
||||
* The \c notes array contains the frequency of the notes to be played,
|
||||
* with the special value \c NOTE_REST indicating a rest where no notes
|
||||
* are playing. The \c lengths array contains the lengths of each of the
|
||||
* notes; a value of 4 indicates a quarter note, a value of 8 indicates
|
||||
* an eighth note, etc.
|
||||
*
|
||||
* The run() method must be called from the application's main
|
||||
* <tt>loop()</tt> method to ensure that the melody advances from
|
||||
* one note to the next. It will not block the application while
|
||||
* notes are playing.
|
||||
*
|
||||
* The number of loops can also be specified with setLoopDuration() which
|
||||
* sets a maximum amount of time that the melody will play before stopping.
|
||||
* The following example plays the melody for no more than 60 seconds:
|
||||
*
|
||||
* \code
|
||||
* void setup() {
|
||||
* melody.setMelody(notes, lengths, sizeof(lengths));
|
||||
* melody.setLoopDuration(60000UL);
|
||||
* melody.play();
|
||||
* }
|
||||
* \endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Constructs a new melody playing object for \a pin.
|
||||
*/
|
||||
Melody::Melody(uint8_t pin)
|
||||
: _pin(pin)
|
||||
, playing(false)
|
||||
, _loopCount(0)
|
||||
, loopsLeft(0)
|
||||
, notes(0)
|
||||
, lengths(0)
|
||||
, size(0)
|
||||
, posn(0)
|
||||
, duration(0)
|
||||
, startNote(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn bool Melody::isPlaying() const
|
||||
* \brief Returns true if the melody is currently playing; false if not.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn int Melody::loopCount() const
|
||||
* \brief Returns the number of times the melody should loop before stopping.
|
||||
*
|
||||
* The default value is zero, indicating that the melody will loop
|
||||
* indefinitely.
|
||||
*
|
||||
* \sa setLoopCount(), setLoopDuration(), play()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \fn void Melody::setLoopCount(int count)
|
||||
* \brief Sets the number of times the melody should loop to \a count.
|
||||
*
|
||||
* If \a count is zero, then the melody will loop indefinitely.
|
||||
*
|
||||
* \sa loopCount(), setLoopDuration()
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Sets the maximum number of loops to last no longer than \a ms milliseconds.
|
||||
*
|
||||
* This function must be called after the melody is specified with setMelody()
|
||||
* as it uses the length of the melody and \a ms to determine the loopCount().
|
||||
*
|
||||
* \sa loopCount(), setLoopCount()
|
||||
*/
|
||||
void Melody::setLoopDuration(unsigned long ms)
|
||||
{
|
||||
unsigned long duration = 0;
|
||||
for (unsigned int index = 0; index < size; ++index)
|
||||
duration += (1000 / lengths[index]) * 13 / 10;
|
||||
_loopCount = (int)(ms / duration);
|
||||
if (!_loopCount)
|
||||
_loopCount = 1; // Play the melody at least once.
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Starts playing the melody, or restarts it if already playing.
|
||||
*
|
||||
* \sa playOnce(), setMelody(), stop(), loopCount()
|
||||
*/
|
||||
void Melody::play()
|
||||
{
|
||||
stop();
|
||||
if (size == 0)
|
||||
return; // No melody to play.
|
||||
loopsLeft = _loopCount;
|
||||
posn = 0;
|
||||
playing = true;
|
||||
nextNote();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Plays the melody once and then stops.
|
||||
*
|
||||
* \sa play(), stop()
|
||||
*/
|
||||
void Melody::playOnce()
|
||||
{
|
||||
stop();
|
||||
if (size == 0)
|
||||
return; // No melody to play.
|
||||
loopsLeft = 1;
|
||||
posn = 0;
|
||||
playing = true;
|
||||
nextNote();
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Stops playing the melody.
|
||||
*
|
||||
* \sa play()
|
||||
*/
|
||||
void Melody::stop()
|
||||
{
|
||||
if (!playing)
|
||||
return;
|
||||
playing = false;
|
||||
noTone(_pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sets the melody to the \a size elements of \a notes and \a lengths.
|
||||
*
|
||||
* If a melody is currently playing, then this function will stop playback.
|
||||
*
|
||||
* The \a notes array contains the frequency of the notes to be played,
|
||||
* with the special value \c NOTE_REST indicating a rest where no notes
|
||||
* are playing. The \a lengths array contains the lengths of each of the
|
||||
* notes; a value of 4 indicates a quarter note, a value of 8 indicates
|
||||
* an eighth note, etc.
|
||||
*
|
||||
* \sa play()
|
||||
*/
|
||||
void Melody::setMelody(const int *notes, const uint8_t *lengths, unsigned int size)
|
||||
{
|
||||
stop();
|
||||
this->notes = notes;
|
||||
this->lengths = lengths;
|
||||
this->size = size;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Runs the melody control loop.
|
||||
*
|
||||
* This function must be called by the application's main <tt>loop()</tt>
|
||||
* function to cause the melody to advance from note to note. It will not
|
||||
* block the application while notes are playing.
|
||||
*/
|
||||
void Melody::run()
|
||||
{
|
||||
if (!playing)
|
||||
return;
|
||||
if ((millis() - startNote) >= duration) {
|
||||
noTone(_pin);
|
||||
nextNote();
|
||||
}
|
||||
}
|
||||
|
||||
void Melody::nextNote()
|
||||
{
|
||||
if (posn >= size) {
|
||||
if (loopsLeft != 0 && --loopsLeft <= 0) {
|
||||
stop();
|
||||
return;
|
||||
}
|
||||
posn = 0;
|
||||
}
|
||||
duration = 1000 / lengths[posn];
|
||||
if (notes[posn] != NOTE_REST)
|
||||
tone(_pin, notes[posn], duration);
|
||||
++posn;
|
||||
duration = duration * 13 / 10; // i.e., duration * 1.3
|
||||
startNote = millis();
|
||||
}
|
||||