Update example to support LilyGo LoRa series

This commit is contained in:
lewisxhe 2020-12-08 11:33:03 +08:00
commit 4afcbe6ec6
276 changed files with 44743 additions and 767 deletions

View file

@ -7,21 +7,60 @@
1. Copy all folders in the `libdeps` directory to the `~/Arduino/libraries` directory, and put them in `"Documents/Arduino/libraries"` for Windons users
2. Open the corresponding example
3. Choose `TTGO T-Beam` for the board
3. `T-Beam` users can choose `TTGO T-Beam`, `lora32(T3)` users can choose `ESP32 Dev Module`
4. Select the port of the board in the port
5. The default version is 1.0/1.1. If the purchased version is v0.7, please comment out `T_BEAM_V10` in the example `utilities.h`, and uncomment `T_BEAM_V07`, if you dont know the version, please ask customer service, or Check the silkscreen on the board
5. For other examples except the `GPS` directory, please **uncomment** in the upper part of `utilities.h` according to your board model, otherwise the compilation will report an error
6. Upload
<h3 align = "left">Product 📷:</h3>
| Product | Product Link |
| :-----------------------: | :---------------------------------------------------------------: |
| [T-Beam SX1278/SX1276 ]() | [Product link](https://pt.aliexpress.com/item/32967228739.html) |
| [T-Beam SX1262]() | [Product link](https://pt.aliexpress.com/item/4001287221970.html) |
| Product | Product Link | Schematic |
| :-------------------------: | :---------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: |
| [T-Beam SX1278/76 ]() | [Product link](https://pt.aliexpress.com/item/32967228739.html) | [TBeamV0.7](schematic/LilyGo_TBeam_V0.7.pdf)/ [TBeamV1.0](schematic/LilyGo_TBeam_V1.0.pdf)/ [TBeamV1.1 ](schematic/LilyGo_TBeam_V1.1.pdf) |
| [T-Beam SX1262]() | [Product link](https://pt.aliexpress.com/item/4001287221970.html) | [TBeamV0.7](schematic/LilyGo_TBeam_V0.7.pdf)/ [TBeamV1.0](schematic/LilyGo_TBeam_V1.0.pdf)/ [TBeamV1.1 ](schematic/LilyGo_TBeam_V1.1.pdf) |
| [LoRa32 V1.0 SX1276]() | [Product link](https://pt.aliexpress.com/item/32842155838.html) | ❌ |
| [LoRa32 V1.0 SX1278]() | [Product link](https://pt.aliexpress.com/item/32842155838.html) | ❌ |
| [LoRa32 V1.3 SX1276]() | [Product link](https://pt.aliexpress.com/item/4000628100802.html) | [LoRa32 V1.3](schematic/T3_V1.3.pdf) |
| [LoRa32 V2.0]() | [Product link](https://pt.aliexpress.com/item/32847443952.html) | [LoRa32 V2.0](schematic/T3_V2.0.pdf) |
| [LoRa32 V2.1_1.6 Version]() | [Product link](https://pt.aliexpress.com/item/32872078587.html) | [LoRa32 V2.1_1.6](schematic/T3_V1.6.pdf) |
## Example description
```
examples
├── ArduinoLoRa # Just only support SX1276/SX1278 radio module
│ ├── LoRaReceiver
│ └── LoRaSender
├── GPS # T-Beam GPS demo examples
│ ├── Example1_BasicNMEARead
│ ├── Example2_NMEAParsing
│ ├── Example3_FactoryDefaultsviaSerial
│ ├── TinyGPS_Example
│ └── TinyGPS_KitchenSink
├── OLED # OLED demo examples
│ ├── SSD1306SimpleDemo
│ └── SSD1306UiDemo
└── RadioLibExamples # RadioLib examples,Support SX1276/78/62
├── SX1262
│ ├── SX1262_Receive_Interrupt
│ └── SX1262_Transmit_Interrupt
├── SX1276
│ ├── SX1276_Receive_Interrupt
│ └── SX1276_Transmit_Interrupt
├── SX1278
│ ├── SX1278_Receive
│ ├── SX1278_Receive_Interrupt
│ ├── SX1278_Transmit
│ └── SX1278_Transmit_Interrupt
└── TBeamAllFunction # T-Beam all function example
```
<h3 align = "left">PinOut :</h3>
- See [utilities.h](examples/ArduinoLoRa/LoRaReceiver/utilities.h)
<h3 align = "left">Application :</h3>
- [T-Beam SoftRF](https://github.com/lyusupov/SoftRF)
@ -31,48 +70,10 @@
<h3 align = "left">Datasheet :</h3>
- [AXP192](http://www.x-powers.com/en.php/Info/product_detail/article_id/29)
- [SX1262 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1262)
- [SX1278 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1278)
- [SX1276 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1276)
- [SX1262](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1262)
- [SX1278](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1278)
- [SX1276](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1276)
- [GSP NEO-6/NEO-8](https://www.u-blox.com/en/product/neo-6-series)
- [GPS Air530]()
<h3 align = "left">Schematic :</h3>
- [TBeam_V0.7 Schematic](schematic/LilyGo_TBeam_V0.7.pdf)
- [TBeam_V1.0 Schematic](schematic/LilyGo_TBeam_V1.0.pdf)
- [TBeam_V1.1 Schematic](schematic/LilyGo_TBeam_V1.1.pdf)
<h3 align = "left">PinOut :</h3>
| Pins | T_BEAM(AXP192) | T_BEAM_V07 |
| ----------- | -------------- | ---------- |
| LORA_SCK | 5 | 5 |
| LORA_MISO | 19 | 19 |
| LORA_MOSI | 27 | 27 |
| LORA_SS | 18 | 18 |
| LORA_DIO0 | 26 | 26 |
| LORA_DIO1 | 33 | 33 |
| LORA_DIO2 | 32 | 32 |
| LORA_RST | 23 | 23 |
| GPS_RX_PIN | 34 | 12 |
| GPS_TX_PIN | 12 | 15 |
| I2C_SDA | 21 | 21 |
| I2C_SCL | 22 | 22 |
| PMU_IRQ | 35 | N/A |
| USER BUTTON | 36 | N/A |
<h3 align = "left">Power Control Channel :</h3>
| Modules | T_BEAM_V10/V1.1 | T_BEAM_V07 |
| ------- | --------------- | ---------- |
| GPS | LDO3 | No supoort |
| LORA | LDO2 | No supoort |
| OLED | DCDC1 | No supoort |

View file

@ -6,72 +6,73 @@
1. 将 `libdeps` 目录中所有文件夹复制到`~/Arduino/libraries`目录内,Windons用户放在 `"我的文档/Arduino/libraries"`
2. 打开对应的示例
3. 板子选择`TTGO T-Beam`
3. `T-Beam`用户可以选择`TTGO T-Beam`,`lora32(T3)`用户可以选择`ESP32 Dev Module`
4. 在端口中选择板子的端口
5. 默认版本为1.0/1.1,如果购买的版本是v0.7,请在示例`utilities.h`中 注释掉 `T_BEAM_V10` ,并且取消`T_BEAM_V07`的注释,不清楚版本,请询问客服,或者查看板子上的丝印
5. 除了GPS 目录外的其他示例,请在`utilities.h` 中上方根据你的板子型号取消注释,否则编译将报错误
6. 上传
<h3 align = "left">Product 📷:</h3>
| Product | Product Link |
| :-----------------------: | :---------------------------------------------------------------: |
| [T-Beam SX1278/SX1276 ]() | [Product link](https://pt.aliexpress.com/item/32967228739.html) |
| [T-Beam SX1262]() | [Product link](https://pt.aliexpress.com/item/4001287221970.html) |
| Product | Product Link | Schematic |
| :-------------------------: | :---------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: |
| [T-Beam SX1278/76 ]() | [Product link](https://pt.aliexpress.com/item/32967228739.html) | [TBeamV0.7](schematic/LilyGo_TBeam_V0.7.pdf)/ [TBeamV1.0](schematic/LilyGo_TBeam_V1.0.pdf)/ [TBeamV1.1 ](schematic/LilyGo_TBeam_V1.1.pdf) |
| [T-Beam SX1262]() | [Product link](https://pt.aliexpress.com/item/4001287221970.html) | [TBeamV0.7](schematic/LilyGo_TBeam_V0.7.pdf)/ [TBeamV1.0](schematic/LilyGo_TBeam_V1.0.pdf)/ [TBeamV1.1 ](schematic/LilyGo_TBeam_V1.1.pdf) |
| [LoRa32 V1.0 SX1276]() | [Product link](https://pt.aliexpress.com/item/32842155838.html) | ❌ |
| [LoRa32 V1.0 SX1278]() | [Product link](https://pt.aliexpress.com/item/32842155838.html) | ❌ |
| [LoRa32 V1.3 SX1276]() | [Product link](https://pt.aliexpress.com/item/4000628100802.html) | [LoRa32 V1.3](schematic/T3_V1.3.pdf) |
| [LoRa32 V2.0]() | [Product link](https://pt.aliexpress.com/item/32847443952.html) | [LoRa32 V2.0](schematic/T3_V2.0.pdf) |
| [LoRa32 V2.1_1.6 Version]() | [Product link](https://pt.aliexpress.com/item/32872078587.html) | [LoRa32 V2.1_1.6](schematic/T3_V1.6.pdf) |
<h3 align = "left">Application :</h3>
## 示例描述
```
examples
├── ArduinoLoRa # Just only support SX1276/SX1278 radio module
│ ├── LoRaReceiver
│ └── LoRaSender
├── GPS # T-Beam GPS demo examples
│ ├── Example1_BasicNMEARead
│ ├── Example2_NMEAParsing
│ ├── Example3_FactoryDefaultsviaSerial
│ ├── TinyGPS_Example
│ └── TinyGPS_KitchenSink
├── OLED # OLED demo examples
│ ├── SSD1306SimpleDemo
│ └── SSD1306UiDemo
└── RadioLibExamples # RadioLib examples,Support SX1276/78/62
├── SX1262
│ ├── SX1262_Receive_Interrupt
│ └── SX1262_Transmit_Interrupt
├── SX1276
│ ├── SX1276_Receive_Interrupt
│ └── SX1276_Transmit_Interrupt
├── SX1278
│ ├── SX1278_Receive
│ ├── SX1278_Receive_Interrupt
│ ├── SX1278_Transmit
│ └── SX1278_Transmit_Interrupt
└── TBeamAllFunction # T-Beam all function example
```
<h3 align = "left">引脚映射 :</h3>
- See [utilities.h](examples/ArduinoLoRa/LoRaReceiver/utilities.h)
<h3 align = "left">应用 :</h3>
- [T-Beam SoftRF](https://github.com/lyusupov/SoftRF)
- [T-Beam Paxcounter](https://github.com/cyberman54/ESP32-Paxcounter)
- [T-Beam Meshtastic](https://github.com/meshtastic/Meshtastic-device)
<h3 align = "left">Datasheet :</h3>
<h3 align = "left">芯片手册 :</h3>
- [AXP192](http://www.x-powers.com/en.php/Info/product_detail/article_id/29)
- [SX1262 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1262)
- [SX1278 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1278)
- [SX1276 LoRa](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1276)
- [SX1262](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1262)
- [SX1278](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1278)
- [SX1276](https://www.semtech.com/products/wireless-rf/lora-transceivers/sx1276)
- [GSP NEO-6/NEO-8](https://www.u-blox.com/en/product/neo-6-series)
- [GPS Air530]()
<h3 align = "left">Schematic :</h3>
- [TBeam_V0.7 Schematic](schematic/LilyGo_TBeam_V0.7.pdf)
- [TBeam_V1.0 Schematic](schematic/LilyGo_TBeam_V1.0.pdf)
- [TBeam_V1.1 Schematic](schematic/LilyGo_TBeam_V1.1.pdf)
<h3 align = "left">PinOut :</h3>
| Pins | T_BEAM(AXP192) | T_BEAM_V07 |
| ----------- | -------------- | ---------- |
| LORA_SCK | 5 | 5 |
| LORA_MISO | 19 | 19 |
| LORA_MOSI | 27 | 27 |
| LORA_SS | 18 | 18 |
| LORA_DIO0 | 26 | 26 |
| LORA_DIO1 | 33 | 33 |
| LORA_DIO2 | 32 | 32 |
| LORA_RST | 23 | 23 |
| GPS_RX_PIN | 34 | 12 |
| GPS_TX_PIN | 12 | 15 |
| I2C_SDA | 21 | 21 |
| I2C_SCL | 22 | 22 |
| PMU_IRQ | 35 | N/A |
| USER BUTTON | 36 | N/A |
<h3 align = "left">Power Control Channel :</h3>
| Modules | T_BEAM_V10/V1.1 | T_BEAM_V07 |
| ------- | --------------- | ---------- |
| GPS | LDO3 | No supoort |
| LORA | LDO2 | No supoort |
| OLED | DCDC1 | No supoort |

View file

@ -1,6 +1,6 @@
#include <LoRa.h>
#include "utilities.h"
#include "boards.h"
void setup()
{
@ -11,7 +11,7 @@ void setup()
Serial.println("LoRa Receiver");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DI0_PIN);
if (!LoRa.begin(868E6)) {
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
@ -25,13 +25,27 @@ void loop()
// received a packet
Serial.print("Received packet '");
String recv = "";
// read packet
while (LoRa.available()) {
Serial.print((char)LoRa.read());
recv += (char)LoRa.read();
}
Serial.println(recv);
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
#ifdef HAS_DISPLAY
if (u8g2) {
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->drawStr(0, 26, recv.c_str());
snprintf(buf, sizeof(buf), "RSSI:%.2f", LoRa.packetRssi());
u8g2->drawStr(0, 40, buf);
u8g2->sendBuffer();
}
#endif
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -1,26 +1,58 @@
#pragma once
/*
* This factory is just to test LilyGo T-Beam series hardware
* Created by Lewis he
* arduinoLoRa Library just only support SX1276/Sx1278,Not support SX1262
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* if you need to change it,
* please open this note and change to the frequency you need to test
* Option: 433E6,470E6,868E6,915E6
* */
// #define T_BEAM_V07
#define T_BEAM_V10 //same v1.1 version
#define LoRa_frequency 433E6
#include <SPI.h>
#define UNUSE_PIN (0)
#if defined(T_BEAM_V07)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#elif defined(T_BEAM_V10)
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#endif
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
@ -34,65 +66,91 @@
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAND_RATE 9600
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#ifdef T_BEAM_V10
#include <axp20x.h>
AXP20X_Class PMU;
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
bool initPMU()
{
Wire.begin(I2C_SDA, I2C_SCL);
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC1Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
*
* * * */
#define HAS_DISPLAY
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
return true;
}
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#define initPMU()
#error "Please select the version you purchased in utilities.h"
#endif
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
Serial1.begin(GPS_BAND_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
initPMU();
}

View file

@ -1,5 +1,5 @@
#include <LoRa.h>
#include "utilities.h"
#include "boards.h"
int counter = 0;
@ -11,7 +11,7 @@ void setup()
Serial.println("LoRa Sender");
LoRa.setPins(RADIO_CS_PIN, RADIO_RST_PIN, RADIO_DI0_PIN);
if (!LoRa.begin(868E6)) {
if (!LoRa.begin(LoRa_frequency)) {
Serial.println("Starting LoRa failed!");
while (1);
}
@ -28,7 +28,16 @@ void loop()
LoRa.print(counter);
LoRa.endPacket();
#ifdef HAS_DISPLAY
if (u8g2) {
char buf[256];
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Transmitting: OK!");
snprintf(buf, sizeof(buf), "Sending: %d", counter);
u8g2->drawStr(0, 30, buf);
u8g2->sendBuffer();
}
#endif
counter++;
delay(5000);
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -1,26 +1,58 @@
#pragma once
/*
* This factory is just to test LilyGo T-Beam series hardware
* Created by Lewis he
* arduinoLoRa Library just only support SX1276/Sx1278,Not support SX1262
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* if you need to change it,
* please open this note and change to the frequency you need to test
* Option: 433E6,470E6,868E6,915E6
* */
// #define T_BEAM_V07
#define T_BEAM_V10 //same v1.1 version
#define LoRa_frequency 868E6
#include <SPI.h>
#define UNUSE_PIN (0)
#if defined(T_BEAM_V07)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#elif defined(T_BEAM_V10)
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#endif
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
@ -34,65 +66,91 @@
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAND_RATE 9600
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#ifdef T_BEAM_V10
#include <axp20x.h>
AXP20X_Class PMU;
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
bool initPMU()
{
Wire.begin(I2C_SDA, I2C_SCL);
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC1Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
*
* * * */
#define HAS_DISPLAY
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
return true;
}
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#define initPMU()
#error "Please select the version you purchased in utilities.h"
#endif
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
Serial1.begin(GPS_BAND_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
initPMU();
}

View file

@ -0,0 +1,6 @@
## Install the following dependency library files:
[arduino-LoRa](https://github.com/sandeepmistry/arduino-LoRa)
[U8g2_Arduino](https://github.com/olikraus/U8g2_Arduino)
- For more examples, please refer to arduino-LoRa/examples

6
examples/OLED/README.MD Normal file
View file

@ -0,0 +1,6 @@
## Install the following dependency library files:
- [esp8266-oled-ssd1306](https://github.com/ThingPulse/esp8266-oled-ssd1306)
- For more examples, please refer to esp8266-oled-ssd1306/examples

View file

@ -35,7 +35,7 @@
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
// Optionally include custom images
#include "images.h"
#include "utilities.h"
#include "boards.h"
SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -1,26 +1,55 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* This factory is just to test LilyGo T-Beam series hardware
* Created by Lewis he
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define T_BEAM_V07
#define T_BEAM_V10 //same v1.1 version
// #define LoRa_frequency 433.0
#include <SPI.h>
#define UNUSE_PIN (0)
#if defined(T_BEAM_V07)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#elif defined(T_BEAM_V10)
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#endif
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
@ -34,65 +63,91 @@
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAND_RATE 9600
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#ifdef T_BEAM_V10
#include <axp20x.h>
AXP20X_Class PMU;
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
bool initPMU()
{
Wire.begin(I2C_SDA, I2C_SCL);
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC1Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
*
* * * */
#define HAS_DISPLAY
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
return true;
}
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#define initPMU()
#error "Please select the version you purchased in utilities.h"
#endif
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
Serial1.begin(GPS_BAND_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
initPMU();
}

View file

@ -34,7 +34,7 @@
#include <Wire.h> // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306Wire.h" // legacy: #include "SSD1306.h"
#include "images.h"
#include "utilities.h"
#include "boards.h"
#include "OLEDDisplayUi.h"
SSD1306Wire display(0x3c, I2C_SDA, I2C_SCL);
@ -127,8 +127,8 @@ void setup()
ui.setTargetFPS(60);
// Customize the active and inactive symbol
ui.setActiveSymbol(activeSymbol);
ui.setInactiveSymbol(inactiveSymbol);
// ui.setActiveSymbol(activeSymbol);
// ui.setInactiveSymbol(inactiveSymbol);
// You can change this to
// TOP, LEFT, BOTTOM, RIGHT

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -26,25 +26,3 @@ const uint8_t WiFi_Logo_bits[] PROGMEM = {
0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const uint8_t activeSymbol[] PROGMEM = {
B00000000,
B00000000,
B00011000,
B00100100,
B01000010,
B01000010,
B00100100,
B00011000
};
const uint8_t inactiveSymbol[] PROGMEM = {
B00000000,
B00000000,
B00000000,
B00000000,
B00011000,
B00011000,
B00000000,
B00000000
};

View file

@ -1,26 +1,55 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* This factory is just to test LilyGo T-Beam series hardware
* Created by Lewis he
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define T_BEAM_V07
#define T_BEAM_V10 //same v1.1 version
// #define LoRa_frequency 433.0
#include <SPI.h>
#define UNUSE_PIN (0)
#if defined(T_BEAM_V07)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#elif defined(T_BEAM_V10)
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#endif
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
@ -34,65 +63,91 @@
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAND_RATE 9600
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#ifdef T_BEAM_V10
#include <axp20x.h>
AXP20X_Class PMU;
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
bool initPMU()
{
Wire.begin(I2C_SDA, I2C_SCL);
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC1Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
*
* * * */
#define HAS_DISPLAY
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
return true;
}
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#define initPMU()
#error "Please select the version you purchased in utilities.h"
#endif
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
Serial1.begin(GPS_BAND_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
initPMU();
}

View file

@ -0,0 +1,13 @@
## SX1262 SX1276 SX1278 examples need install the following dependency library files:
- [RadioLib](https://github.com/jgromes/RadioLib)
- [U8g2_Arduino](https://github.com/olikraus/U8g2_Arduino)
## TBeamAllFunction example need install the following dependency library files:
- [AceButton](https://github.com/bxparks/AceButton)
- [esp8266-oled-ssd1306](https://github.com/ThingPulse/esp8266-oled-ssd1306)
- [RadioLib](https://github.com/jgromes/RadioLib)
- [TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus)
- For more examples, please refer to RadioLib/examples

View file

@ -0,0 +1,149 @@
/*
RadioLib SX1276 Transmit Example
This example transmits packets using SX1276 LoRa radio module.
Each packet contains up to 256 bytes of data, in the form of:
- Arduino String
- null-terminated char array (C-string)
- arbitrary binary data (byte array)
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1262 with default settings
Serial.print(F("[SX1262] Initializing ... "));
int state = radio.begin();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when new packet is received
radio.setDio1Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1262] Starting to listen ... "));
state = radio.startReceive();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// if needed, 'listen' mode can be disabled by calling
// any of the following methods:
//
// radio.standby()
// radio.sleep()
// radio.transmit();
// radio.receive();
// radio.readData();
// radio.scanChannel();
}
void loop()
{
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1262] Received packet!"));
// print data of the packet
Serial.print(F("[SX1262] Data:\t\t"));
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
Serial.print(F("[SX1262] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// print SNR (Signal-to-Noise Ratio)
Serial.print(F("[SX1262] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
} else if (state == ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("CRC error!"));
} else {
// some other error occurred
Serial.print(F("failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,153 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 433.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,138 @@
/*
RadioLib SX1276 Transmit Example
This example transmits packets using SX1276 LoRa radio module.
Each packet contains up to 256 bytes of data, in the form of:
- Arduino String
- null-terminated char array (C-string)
- arbitrary binary data (byte array)
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// or using RadioShield
// https://github.com/jgromes/RadioShield
//SX1262 radio = RadioShield.ModuleA;
// save transmission state between loops
int transmissionState = ERR_NONE;
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is transmitted by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we sent a packet, set the flag
transmittedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1262 with default settings
Serial.print(F("[SX1262] Initializing ... "));
int state = radio.begin();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when packet transmission is finished
radio.setDio1Action(setFlag);
// start transmitting the first packet
Serial.print(F("[SX1262] Sending first packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
transmissionState = radio.startTransmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
state = radio.startTransmit(byteArr, 8);
*/
}
void loop()
{
// check if the previous transmission finished
if (transmittedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
transmittedFlag = false;
if (transmissionState == ERR_NONE) {
// packet was successfully sent
Serial.println(F("transmission finished!"));
// NOTE: when using interrupt-driven transmit method,
// it is not possible to automatically measure
// transmission data rate using getDataRate()
} else {
Serial.print(F("failed, code "));
Serial.println(transmissionState);
}
// wait a second before transmitting again
delay(1000);
// send another one
Serial.print(F("[SX1262] Sending another packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
transmissionState = radio.startTransmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
int state = radio.startTransmit(byteArr, 8);
*/
// we're ready to send more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,153 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 433.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,181 @@
/*
RadioLib SX127x Receive Example
This example listens for LoRa transmissions using SX127x Lora modules.
To successfully receive data, the following settings have to be the same
on both transmitter and receiver:
- carrier frequency
- bandwidth
- spreading factor
- coding rate
- sync word
- preamble length
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "utilities.h"
#include "boards.h"
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1276 with default settings
Serial.print(F("[SX1276] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(868.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when new packet is received
radio.setDio0Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1276] Starting to listen ... "));
state = radio.startReceive();
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// if needed, 'listen' mode can be disabled by calling
// any of the following methods:
//
// radio.standby()
// radio.sleep()
// radio.transmit();
// radio.receive();
// radio.readData();
// radio.scanChannel();
}
void loop()
{
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1276] Received packet!"));
// print data of the packet
Serial.print(F("[SX1276] Data:\t\t"));
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
Serial.print(F("[SX1276] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// print SNR (Signal-to-Noise Ratio)
Serial.print(F("[SX1276] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
// print frequency error
Serial.print(F("[SX1276] Frequency error:\t"));
Serial.print(radio.getFrequencyError());
Serial.println(F(" Hz"));
#ifdef HAS_DISPLAY
if (u8g2) {
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->drawStr(5, 26, str.c_str());
snprintf(buf, sizeof(buf), "RSSI:%.2f", radio.getRSSI());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.2f", radio.getSNR());
u8g2->drawStr(0, 54, buf);
u8g2->sendBuffer();
}
#endif
} else if (state == ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("[SX1276] CRC error!"));
} else {
// some other error occurred
Serial.print(F("[SX1276] Failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,156 @@
#pragma once
/*
* This sample program only supports T-Beam
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 868MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 915.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,111 @@
/*
RadioLib SX1276 Transmit Example
This example transmits packets using SX1276 LoRa radio module.
Each packet contains up to 256 bytes of data, in the form of:
- Arduino String
- null-terminated char array (C-string)
- arbitrary binary data (byte array)
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1276 with default settings
Serial.print(F("[SX1276] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(868.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
}
void loop()
{
Serial.print(F("[SX1276] Transmitting packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
// NOTE: transmit() is a blocking method!
// See example SX127x_Transmit_Interrupt for details
// on non-blocking transmission method.
int state = radio.transmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
int state = radio.transmit(byteArr, 8);
*/
if (state == ERR_NONE) {
// the packet was successfully transmitted
Serial.println(F(" success!"));
// print measured data rate
Serial.print(F("[SX1276] Datarate:\t"));
Serial.print(radio.getDataRate());
Serial.println(F(" bps"));
#ifdef HAS_DISPLAY
if (u8g2) {
char buf[256];
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Transmitting: OK!");
snprintf(buf, sizeof(buf), "Rate:%.2f bps", radio.getDataRate());
u8g2->drawStr(5, 30, buf);
u8g2->sendBuffer();
}
#endif
} else if (state == ERR_PACKET_TOO_LONG) {
// the supplied packet was longer than 256 bytes
Serial.println(F("too long!"));
} else if (state == ERR_TX_TIMEOUT) {
// timeout occurred while transmitting packet
Serial.println(F("timeout!"));
} else {
// some other error occurred
Serial.print(F("failed, code "));
Serial.println(state);
}
// wait for a second before transmitting again
delay(1000);
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,156 @@
#pragma once
/*
* This sample program only supports T-Beam
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 868MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 915.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,179 @@
/*
RadioLib SX127x Receive Example
This example listens for LoRa transmissions using SX127x Lora modules.
To successfully receive data, the following settings have to be the same
on both transmitter and receiver:
- carrier frequency
- bandwidth
- spreading factor
- coding rate
- sync word
- preamble length
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1278 with default settings
#ifndef LoRa_frequency
int state = radio.begin(433.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when new packet is received
radio.setDio0Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1278] Starting to listen ... "));
state = radio.startReceive();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// if needed, 'listen' mode can be disabled by calling
// any of the following methods:
//
// radio.standby()
// radio.sleep()
// radio.transmit();
// radio.receive();
// radio.readData();
// radio.scanChannel();
}
void loop()
{
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1278] Received packet!"));
// print data of the packet
Serial.print(F("[SX1278] Data:\t\t"));
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
Serial.print(F("[SX1278] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// print SNR (Signal-to-Noise Ratio)
Serial.print(F("[SX1278] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
// print frequency error
Serial.print(F("[SX1278] Frequency error:\t"));
Serial.print(radio.getFrequencyError());
Serial.println(F(" Hz"));
#ifdef HAS_DISPLAY
if (u8g2) {
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->drawStr(5, 26, str.c_str());
snprintf(buf, sizeof(buf), "RSSI:%.2f", radio.getRSSI());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.2f", radio.getSNR());
u8g2->drawStr(0, 54, buf);
u8g2->sendBuffer();
}
#endif
} else if (state == ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("[SX1278] CRC error!"));
} else {
// some other error occurred
Serial.print(F("[SX1278] Failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,147 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 470.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,186 @@
/*
RadioLib SX127x Receive with Interrupts Example
This example listens for LoRa transmissions and tries to
receive them. Once a packet is received, an interrupt is
triggered. To successfully receive data, the following
settings have to be the same on both transmitter
and receiver:
- carrier frequency
- bandwidth
- spreading factor
- coding rate
- sync word
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// flag to indicate that a packet was received
volatile bool receivedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1278 with default settings
Serial.print(F("[SX1278] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(433.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when packet transmission is finished
radio.setDio0Action(setFlag);
// start listening for LoRa packets
Serial.print(F("[SX1278] Starting to listen ... "));
state = radio.startReceive();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// if needed, 'listen' mode can be disabled by calling
// any of the following methods:
//
// radio.standby()
// radio.sleep()
// radio.transmit();
// radio.receive();
// radio.readData();
// radio.scanChannel();
}
void loop()
{
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
String str;
int state = radio.readData(str);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == ERR_NONE) {
// packet was successfully received
Serial.println(F("[SX1278] Received packet!"));
// print data of the packet
Serial.print(F("[SX1278] Data:\t\t"));
Serial.println(str);
// print RSSI (Received Signal Strength Indicator)
Serial.print(F("[SX1278] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
// print SNR (Signal-to-Noise Ratio)
Serial.print(F("[SX1278] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
// print frequency error
Serial.print(F("[SX1278] Frequency error:\t"));
Serial.print(radio.getFrequencyError());
Serial.println(F(" Hz"));
#ifdef HAS_DISPLAY
if (u8g2) {
u8g2->clearBuffer();
char buf[256];
u8g2->drawStr(0, 12, "Received OK!");
u8g2->drawStr(5, 26, str.c_str());
snprintf(buf, sizeof(buf), "RSSI:%.2f", radio.getRSSI());
u8g2->drawStr(0, 40, buf);
snprintf(buf, sizeof(buf), "SNR:%.2f", radio.getSNR());
u8g2->drawStr(0, 54, buf);
u8g2->sendBuffer();
}
#endif
} else if (state == ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("[SX1278] CRC error!"));
} else {
// some other error occurred
Serial.print(F("[SX1278] Failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,153 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 470.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,111 @@
/*
RadioLib SX1278 Transmit Example
This example transmits packets using SX1278 LoRa radio module.
Each packet contains up to 256 bytes of data, in the form of:
- Arduino String
- null-terminated char array (C-string)
- arbitrary binary data (byte array)
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1278 with default settings
Serial.print(F("[SX1278] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(433.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
}
void loop()
{
Serial.print(F("[SX1278] Transmitting packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
// NOTE: transmit() is a blocking method!
// See example SX127x_Transmit_Interrupt for details
// on non-blocking transmission method.
int state = radio.transmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
int state = radio.transmit(byteArr, 8);
*/
if (state == ERR_NONE) {
// the packet was successfully transmitted
Serial.println(F(" success!"));
// print measured data rate
Serial.print(F("[SX1278] Datarate:\t"));
Serial.print(radio.getDataRate());
Serial.println(F(" bps"));
#ifdef HAS_DISPLAY
if (u8g2) {
char buf[256];
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Transmitting: OK!");
snprintf(buf, sizeof(buf), "Rate:%.2f bps", radio.getDataRate());
u8g2->drawStr(5, 30, buf);
u8g2->sendBuffer();
}
#endif
} else if (state == ERR_PACKET_TOO_LONG) {
// the supplied packet was longer than 256 bytes
Serial.println(F("too long!"));
} else if (state == ERR_TX_TIMEOUT) {
// timeout occurred while transmitting packet
Serial.println(F("timeout!"));
} else {
// some other error occurred
Serial.print(F("failed, code "));
Serial.println(state);
}
// wait for a second before transmitting again
delay(1000);
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,147 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 470.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,159 @@
/*
RadioLib SX1278 Transmit Example
This example transmits packets using SX1278 LoRa radio module.
Each packet contains up to 256 bytes of data, in the form of:
- Arduino String
- null-terminated char array (C-string)
- arbitrary binary data (byte array)
Other modules from SX127x/RFM9x family can also be used.
For default module settings, see the wiki page
https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem
For full API reference, see the GitHub Pages
https://jgromes.github.io/RadioLib/
*/
#include <RadioLib.h>
#include "boards.h"
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
// save transmission state between loops
int transmissionState = ERR_NONE;
// flag to indicate that a packet was sent
volatile bool transmittedFlag = false;
// disable interrupt when it's not needed
volatile bool enableInterrupt = true;
// this function is called when a complete packet
// is transmitted by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we sent a packet, set the flag
transmittedFlag = true;
}
void setup()
{
initBoard();
// When the power is turned on, a delay is required.
delay(1500);
// initialize SX1278 with default settings
Serial.print(F("[SX1278] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(433.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
#ifdef HAS_DISPLAY
if (u8g2) {
if (state != ERR_NONE) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Initializing: FAIL!");
u8g2->sendBuffer();
}
}
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when packet transmission is finished
radio.setDio0Action(setFlag);
// start transmitting the first packet
Serial.print(F("[SX1278] Sending first packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
transmissionState = radio.startTransmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
state = radio.startTransmit(byteArr, 8);
*/
}
void loop()
{
// check if the previous transmission finished
if (transmittedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
transmittedFlag = false;
if (transmissionState == ERR_NONE) {
// packet was successfully sent
Serial.println(F("transmission finished!"));
// NOTE: when using interrupt-driven transmit method,
// it is not possible to automatically measure
// transmission data rate using getDataRate()
#ifdef HAS_DISPLAY
if (u8g2) {
u8g2->clearBuffer();
u8g2->drawStr(0, 12, "Transmitting: OK!");
u8g2->drawStr(5, 30, String(millis()).c_str());
u8g2->sendBuffer();
}
#endif
} else {
Serial.print(F("failed, code "));
Serial.println(transmissionState);
}
// wait a second before transmitting again
delay(1000);
// send another one
Serial.print(F("[SX1278] Sending another packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
transmissionState = radio.startTransmit("Hello World!");
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
int state = radio.startTransmit(byteArr, 8);
*/
// we're ready to send more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}

View file

@ -0,0 +1,171 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#ifdef HAS_DISPLAY
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C *u8g2 = nullptr;
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
#ifdef HAS_DISPLAY
Wire.beginTransmission(0x3C);
if (Wire.endTransmission() == 0) {
Serial.println("Started OLED");
u8g2 = new U8G2_SSD1306_128X64_NONAME_F_HW_I2C(U8G2_R0, U8X8_PIN_NONE);
u8g2->begin();
u8g2->clearBuffer();
u8g2->setFlipMode(0);
u8g2->setFontMode(1); // Transparent
u8g2->setDrawColor(1);
u8g2->setFontDirection(0);
u8g2->firstPage();
do {
u8g2->setFont(u8g2_font_inb19_mr);
u8g2->drawStr(0, 30, "LilyGo");
u8g2->drawHLine(2, 35, 47);
u8g2->drawHLine(3, 36, 47);
u8g2->drawVLine(45, 32, 12);
u8g2->drawVLine(46, 33, 12);
u8g2->setFont(u8g2_font_inb19_mf);
u8g2->drawStr(58, 60, "LoRa");
} while ( u8g2->nextPage() );
u8g2->sendBuffer();
u8g2->setFont(u8g2_font_fur11_tf);
delay(5000);
}
#endif
}

View file

@ -0,0 +1,153 @@
#pragma once
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
// #define LILYGO_T3_V1_0
// #define LILYGO_T3_V1_6
// #define LILYGO_T3_V2_0
/*
* The default program uses 433MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 470.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

View file

@ -0,0 +1,392 @@
/*
* Test all functions of the hardware, only applicable to T-Beam, does not support other LoRa versions
* Written on November 07, 2020 Created by Lewis he
* */
#include <WiFi.h>
#include <AceButton.h>
#include <SSD1306.h>
#include <OLEDDisplayUi.h>
#include <RadioLib.h>
#include <TinyGPS++.h>
#include "boards.h"
using namespace ace_button;
/*
Replace the model according to the actual situation
RADIO_TYPE option:
- SX1278
- SX1276
- SX1262
*/
#define RADIO_TYPE SX1276
SSD1306 *oled = nullptr;
OLEDDisplayUi *ui = nullptr;
AceButton btn(BUTTON_PIN);
TinyGPSPlus gps;
String recv = "";
// flag to indicate that a packet was received
bool receivedFlag = false;
// disable interrupt when it's not needed
bool enableInterrupt = true;
char buff[5][256];
uint32_t gpsLoopMillis = 0;
uint32_t loraLoopMillis = 0;
uint32_t positioningMillis = 0;
uint8_t funcSelectIndex = 0;
RADIO_TYPE radio = new Module(RADIO_CS_PIN, RADIO_DI0_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
void ButtonHandleEvent(AceButton *, uint8_t eventType, uint8_t buttonState);
void MsOverlay(OLEDDisplay *display, OLEDDisplayUiState *state);
void DrawFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void DrawFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void DrawFrame3(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void DrawFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
void SenderLoop(void);
void GpsLoop(void);
void ReceiveLoop(void);
typedef void (*funcCallBackTypedef)(void);
funcCallBackTypedef LilyGoCallBack[] = {GpsLoop, SenderLoop, ReceiveLoop, NULL};
FrameCallback frames[] = {DrawFrame1, DrawFrame2, DrawFrame3, DrawFrame4};
OverlayCallback overlays[] = { MsOverlay };
// this function is called when a complete packet
// is received by the module
// IMPORTANT: this function MUST be 'void' type
// and MUST NOT have any arguments!
void setFlag(void)
{
// check if the interrupt is enabled
if (!enableInterrupt) {
return;
}
// we got a packet, set the flag
receivedFlag = true;
}
void setup()
{
initBoard();
pinMode(BUTTON_PIN, INPUT_PULLUP);
ButtonConfig *buttonConfig = btn.getButtonConfig();
buttonConfig->setEventHandler(ButtonHandleEvent);
buttonConfig->setFeature(ButtonConfig::kFeatureClick);
buttonConfig->setFeature(ButtonConfig::kFeatureLongPress);
Wire.beginTransmission(0x3C);
if (!Wire.endTransmission()) {
Serial.println("Started OLED");
oled = new SSD1306(0x3C, I2C_SDA, I2C_SCL);
ui = new OLEDDisplayUi(oled);
oled->init();
oled->flipScreenVertically();
oled->setFont(ArialMT_Plain_16);
oled->setTextAlignment(TEXT_ALIGN_CENTER);
ui->setTargetFPS(30);
ui->disableAutoTransition();
ui->setIndicatorPosition(BOTTOM);
ui->setIndicatorDirection(LEFT_RIGHT);
ui->setFrameAnimation(SLIDE_LEFT);
ui->setFrames(frames, sizeof(frames) / sizeof(*frames));
ui->setOverlays(overlays, sizeof(overlays) / sizeof(*overlays));
}
Serial.print(F("[Radio] Initializing ... "));
#ifndef LoRa_frequency
int state = radio.begin(868.0);
#else
int state = radio.begin(LoRa_frequency);
#endif
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
while (true);
}
// set the function that will be called
// when new packet is received
radio.setDio0Action(setFlag);
}
void loop()
{
btn.check();
if (LilyGoCallBack[funcSelectIndex]) {
LilyGoCallBack[funcSelectIndex]();
}
if (ui) {
ui->update();
}
}
void GpsLoop(void)
{
while (Serial1.available()) {
int r = Serial1.read();
Serial.write(r);
gps.encode(r);
}
if (millis() > 5000 && gps.charsProcessed() < 10) {
snprintf(buff[0], sizeof(buff[0]), "T-Beam GPS");
snprintf(buff[1], sizeof(buff[1]), "No GPS detected");
Serial.println("No GPS detected");
return;
}
if (!gps.location.isValid()) {
if (millis() - gpsLoopMillis > 1000) {
snprintf(buff[0], sizeof(buff[0]), "T-Beam GPS");
snprintf(buff[1], sizeof(buff[1]), "Positioning(%u)S", positioningMillis++);
gpsLoopMillis = millis();
}
} else {
if (millis() - gpsLoopMillis > 1000) {
snprintf(buff[0], sizeof(buff[0]), "UTC:%d:%d:%d", gps.time.hour(), gps.time.minute(), gps.time.second());
snprintf(buff[1], sizeof(buff[1]), "LNG:%.4f", gps.location.lng());
snprintf(buff[2], sizeof(buff[2]), "LAT:%.4f", gps.location.lat());
snprintf(buff[3], sizeof(buff[3]), "satellites:%u", gps.satellites.value());
Serial.printf("UTC:%d:%d:%d-LNG:%.4f-LAT:%.4f-satellites:%u\n",
gps.time.hour(),
gps.time.minute(),
gps.time.second(),
gps.location.lng(),
gps.location.lat(),
gps.satellites.value());
gpsLoopMillis = millis();
}
}
}
void SenderLoop(void)
{
snprintf(buff[0], sizeof(buff[0]), "T-Beam Lora Sender");
// Send data every 3 seconds
if (millis() - loraLoopMillis > 3000) {
int transmissionState = ERR_NONE;
transmissionState = radio.startTransmit(String(loraLoopMillis).c_str());
// check if the previous transmission finished
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
if (transmissionState == ERR_NONE) {
// packet was successfully sent
Serial.println(F("transmission finished!"));
// NOTE: when using interrupt-driven transmit method,
// it is not possible to automatically measure
// transmission data rate using getDataRate()
} else {
Serial.print(F("failed, code "));
Serial.println(transmissionState);
}
// wait a second before transmitting again
// delay(1000);
// send another one
Serial.print(F("[RADIO] Sending another packet ... "));
// you can transmit C-string or Arduino string up to
// 256 characters long
transmissionState = radio.startTransmit(String(loraLoopMillis).c_str());
// you can also transmit byte array up to 256 bytes long
/*
byte byteArr[] = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
int state = radio.startTransmit(byteArr, 8);
*/
// we're ready to send more packets,
// enable interrupt service routine
enableInterrupt = true;
}
snprintf(buff[1], sizeof(buff[1]), "Send: %u", loraLoopMillis);
loraLoopMillis = millis();
Serial.println(buff[1]);
}
}
void ReceiveLoop(void)
{
snprintf(buff[0], sizeof(buff[0]), "T-Beam Lora Received");
// check if the flag is set
if (receivedFlag) {
// disable the interrupt service routine while
// processing the data
enableInterrupt = false;
// reset flag
receivedFlag = false;
// you can read received data as an Arduino String
int state = radio.readData(recv);
// you can also read received data as byte array
/*
byte byteArr[8];
int state = radio.readData(byteArr, 8);
*/
if (state == ERR_NONE) {
// packet was successfully received
Serial.println(F("[RADIO] Received packet!"));
// print data of the packet
Serial.print(F("[RADIO] Data:\t\t"));
Serial.println(recv);
// print RSSI (Received Signal Strength Indicator)
Serial.print(F("[RADIO] RSSI:\t\t"));
Serial.print(radio.getRSSI());
Serial.println(F(" dBm"));
snprintf(buff[1], sizeof(buff[1]), "RSSI:%.2f dBm", radio.getRSSI());
// print SNR (Signal-to-Noise Ratio)
Serial.print(F("[RADIO] SNR:\t\t"));
Serial.print(radio.getSNR());
Serial.println(F(" dB"));
} else if (state == ERR_CRC_MISMATCH) {
// packet was received, but is malformed
Serial.println(F("CRC error!"));
} else {
// some other error occurred
Serial.print(F("failed, code "));
Serial.println(state);
}
// put module back to listen mode
radio.startReceive();
// we're ready to receive more packets,
// enable interrupt service routine
enableInterrupt = true;
}
}
/************************************
* BUTTON
* *********************************/
void ButtonHandleEvent(AceButton *, uint8_t eventType, uint8_t buttonState)
{
switch (eventType) {
case AceButton::kEventClicked:
if (ui) {
ui->nextFrame();
}
funcSelectIndex++;
funcSelectIndex %= sizeof(LilyGoCallBack) / sizeof(*LilyGoCallBack);
if (funcSelectIndex == 2) {
Serial.print(F("[RADIO] Starting to listen ... "));
int state = radio.startReceive();
if (state == ERR_NONE) {
Serial.println(F("success!"));
} else {
Serial.print(F("failed, code "));
Serial.println(state);
}
memset(buff, 0, sizeof(buff));
}
break;
case AceButton::kEventLongPressed:
//Power off all peripherals
disablePeripherals();
//If the power is not turned off, the peripheral should be set to sleep
/*
radio.sleep();
if (oled) {
oled->displayOff();
}
*/
delay(1000);
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_MASK, ESP_EXT1_WAKEUP_ALL_LOW);
esp_deep_sleep_start();
break;
}
}
/************************************
* DISPLAY
* *********************************/
void MsOverlay(OLEDDisplay *display, OLEDDisplayUiState *state)
{
static char volbuffer[128];
display->setTextAlignment(TEXT_ALIGN_LEFT);
display->setFont(ArialMT_Plain_10);
display->drawString(0, 0, "LilyGo");
multi_heap_info_t info;
heap_caps_get_info(&info, MALLOC_CAP_INTERNAL);
snprintf(volbuffer, sizeof(volbuffer), "%u/%uKB", info.total_allocated_bytes / 1024, info.total_free_bytes / 1024);
display->drawString(75, 0, volbuffer);
}
void DrawFrame1(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_CENTER);
if (!gps.location.isValid()) {
display->drawString(64 + x, 11 + y, buff[0]);
display->drawString(64 + x, 22 + y, buff[1]);
} else {
display->drawString(64 + x, 11 + y, buff[0]);
display->drawString(64 + x, 22 + y, buff[1]);
display->drawString(64 + x, 33 + y, buff[2]);
display->drawString(64 + x, 44 + y, buff[3]);
}
}
void DrawFrame2(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_CENTER);
display->drawString(64 + x, 11 + y, buff[0]);
display->drawString(64 + x, 22 + y, buff[1]);
}
void DrawFrame3(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_CENTER);
display->drawString(64 + x, 9 + y, buff[0]);
display->drawString(64 + x, 22 + y, recv == "" ? "No message" : recv);
display->drawString(64 + x, 35 + y, buff[1]);
}
void DrawFrame4(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
bool batteryConnect = PMU.isBatteryConnect();
snprintf(buff[0], sizeof(buff[0]), "BATTERY:%s", batteryConnect ? "CONNECT" : "DISCONNECT");
if (batteryConnect) {
snprintf(buff[1], sizeof(buff[1]), "VOLTAGE:%.2f", PMU.getBattVoltage());
snprintf(buff[2], sizeof(buff[2]), "CURRENT:%.2f", PMU.getBattDischargeCurrent());
} else {
snprintf(buff[1], sizeof(buff[1]), "VOLTAGE:%.2f", PMU.getVbusVoltage());
snprintf(buff[2], sizeof(buff[2]), "CURRENT:%.2f", PMU.getVbusCurrent());
}
display->setFont(ArialMT_Plain_10);
display->setTextAlignment(TEXT_ALIGN_CENTER);
display->drawString(64 + x, 12 + y, buff[0]);
display->drawString(64 + x, 24 + y, buff[1]);
display->drawString(64 + x, 37 + y, buff[2]);
}

View file

@ -0,0 +1,137 @@
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include "utilities.h"
#ifdef HAS_SDCARD
#include <SD.h>
#include <FS.h>
#endif
#if defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#include <axp20x.h>
AXP20X_Class PMU;
bool initPMU()
{
if (PMU.begin(Wire, AXP192_SLAVE_ADDRESS) == AXP_FAIL) {
return false;
}
/*
* The charging indicator can be turned on or off
* * * */
// PMU.setChgLEDMode(LED_BLINK_4HZ);
/*
* The default ESP32 power supply has been turned on,
* no need to set, please do not set it, if it is turned off,
* it will not be able to program
*
* PMU.setDCDC3Voltage(3300);
* PMU.setPowerOutPut(AXP192_DCDC3, AXP202_ON);
*
* * * */
/*
* Turn off unused power sources to save power
* **/
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_DCDC2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
PMU.setPowerOutPut(AXP192_EXTEN, AXP202_OFF);
/*
* Set the power of LoRa and GPS module to 3.3V
**/
PMU.setLDO2Voltage(3300); //LoRa VDD
PMU.setLDO3Voltage(3300); //GPS VDD
PMU.setDCDC1Voltage(3300); //3.3V Pin next to 21 and 22 is controlled by DCDC1
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_ON);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_ON);
pinMode(PMU_IRQ, INPUT_PULLUP);
attachInterrupt(PMU_IRQ, [] {
// pmu_irq = true;
}, FALLING);
PMU.adc1Enable(AXP202_VBUS_VOL_ADC1 |
AXP202_VBUS_CUR_ADC1 |
AXP202_BATT_CUR_ADC1 |
AXP202_BATT_VOL_ADC1,
AXP202_ON);
PMU.enableIRQ(AXP202_VBUS_REMOVED_IRQ |
AXP202_VBUS_CONNECT_IRQ |
AXP202_BATT_REMOVED_IRQ |
AXP202_BATT_CONNECT_IRQ,
AXP202_ON);
PMU.clearIRQ();
return true;
}
void disablePeripherals()
{
PMU.setPowerOutPut(AXP192_DCDC1, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO2, AXP202_OFF);
PMU.setPowerOutPut(AXP192_LDO3, AXP202_OFF);
}
#else
#define initPMU()
#define disablePeripherals()
#endif
SPIClass SDSPI(HSPI);
void initBoard()
{
Serial.begin(115200);
Serial.println("initBoard");
SPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN);
Wire.begin(I2C_SDA, I2C_SCL);
#ifdef HAS_GPS
Serial1.begin(GPS_BAUD_RATE, SERIAL_8N1, GPS_RX_PIN, GPS_TX_PIN);
#endif
#if OLED_RST
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, HIGH); delay(20);
digitalWrite(OLED_RST, LOW); delay(20);
digitalWrite(OLED_RST, HIGH); delay(20);
#endif
initPMU();
#ifdef HAS_SDCARD
SDSPI.begin(SDCARD_SCLK, SDCARD_MISO, SDCARD_MOSI, SDCARD_CS);
if (!SD.begin(SDCARD_CS, SDSPI)) {
Serial.println("setupSDCard FAIL");
} else {
uint32_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.print("setupSDCard PASS . SIZE = ");
Serial.print(cardSize);
Serial.println(" MB");
}
#endif
#ifdef BOARD_LED
/*
* T-BeamV1.0, V1.1 LED defaults to low level as trun on,
* so it needs to be forced to pull up
* * * * */
#if LED_ON == LOW
gpio_hold_dis(GPIO_NUM_4);
#endif
pinMode(BOARD_LED, OUTPUT);
digitalWrite(BOARD_LED, LED_ON);
#endif
}

View file

@ -0,0 +1,154 @@
#pragma once
/*
* This sample program only supports T-Beam
* */
// #define LILYGO_TBeam_V0_7
// #define LILYGO_TBeam_V1_0
// #define LILYGO_TBeam_V1_1
/*
* The default program uses 868MHz,
* if you need to change it,
* please open this note and change to the frequency you need to test
* */
// #define LoRa_frequency 433.0
#define UNUSE_PIN (0)
#if defined(LILYGO_TBeam_V0_7)
#define GPS_RX_PIN 12
#define GPS_TX_PIN 15
#define BUTTON_PIN 39
#define BUTTON_PIN_MASK GPIO_SEL_39
#define I2C_SDA 21
#define I2C_SCL 22
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 14
#define LED_ON HIGH
#define LED_OFF LOW
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_TBeam_V1_0) || defined(LILYGO_TBeam_V1_1)
#define GPS_RX_PIN 34
#define GPS_TX_PIN 12
#define BUTTON_PIN 38
#define BUTTON_PIN_MASK GPIO_SEL_38
#define I2C_SDA 21
#define I2C_SCL 22
#define PMU_IRQ 35
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define BOARD_LED 4
#define LED_ON LOW
#define LED_OFF HIGH
#define GPS_BAUD_RATE 9600
#define HAS_GPS
#define HAS_DISPLAY //Optional, bring your own board, no OLED !!
#elif defined(LILYGO_T3_V1_0)
#define I2C_SDA 4
#define I2C_SCL 15
#define OLED_RST 16
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V1_6)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 23
#define RADIO_DIO1_PIN 33
#define RADIO_BUSY_PIN 32
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 25
#define LED_ON HIGH
#define ADC_PIN 35
#define HAS_SDCARD
#define HAS_DISPLAY
#elif defined(LILYGO_T3_V2_0)
#define I2C_SDA 21
#define I2C_SCL 22
#define OLED_RST UNUSE_PIN
#define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27
#define RADIO_CS_PIN 18
#define RADIO_DI0_PIN 26
#define RADIO_RST_PIN 14
#define RADIO_DIO1_PIN UNUSE_PIN
#define RADIO_BUSY_PIN UNUSE_PIN
#define SDCARD_MOSI 15
#define SDCARD_MISO 2
#define SDCARD_SCLK 14
#define SDCARD_CS 13
#define BOARD_LED 0
#define LED_ON LOW
#define HAS_DISPLAY
#define HAS_SDCARD
#else
#error "Please select the version you purchased in utilities.h"
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

View file

@ -0,0 +1,86 @@
# Changelog
* Unreleased
* 1.3.3 (2019-03-10)
* Add blurb about using `pinMode()` and button wiring configurations in
README.md based on feedback from
[Issue #19](https://github.com/bxparks/AceButton/issues/19).
* Add `AceButton::isPressedRaw()` to determine the state of the button upon
booting the device.
(See [Issue #21](https://github.com/bxparks/AceButton/issues/21))
* 1.3.2 (2018-12-30)
* Year-end maintenance release. No functional change.
* Fix minor spelling and grammar mistakes in README.md.
* Remove `virtual` when using `override` per C++ core style guide.
* Update auniter.ini for compatibility with latest ESP32 and Sparkfun cores.
* 1.3.1 (2018-09-30)
* Fix botched release on GitHub. Same as v1.3.
* 1.3 (2018-09-30)
* Merge `AdjustableButtonConfig` into `ButtonConfig` and deprecated
`AdjustableButtonConfig`. See
[Issue #13](https://github.com/bxparks/AceButton/issues/13) for
benchmarks which show that the theoretical increase of static RAM
consumption does not often happen in practice because of compiler
optimization.
* Reduce default value of `getDebounceDelay()` from 50 ms to 20 ms
to improve perceived responsiveness of buttons when they are rapidly
pressed on and off. See
[Issue #14](https://github.com/bxparks/AceButton/issues/14)
for details.
* Update `tests/auniter.ini` and `Jenkinsfile` for compatibility with
AUniter v1.7. Add `CapacitiveSensor` to the exclude list for
`env:esp8266` and `env:esp32` because it doesn't compile under those
environments.
* Remove leading zero in `ACE_BUTTON_VERSION` because that I forgot that it
means an octal number.
* 1.2 (2018-08-14)
* Add `AceButton(ButtonConfig*)` constructor to support constructor
dependency injection. Recommended over `setButtonConfig()`.
Should be 100% backwards compatible.
* Add examples/CapacitiveSwitch program to demonstrate integration
with CapacitiveSensor library to support capacitive switches.
* Add continuous integration using AUniter/Jenkins.
* 1.1.1 (2018-06-21)
* Fix compiler warnings about unused parameters in eventHandler callback.
* Move AutoBenchmark results into AutoBenchmark/README.md.
* Update various links in AceButton/README.md.
* No functional or API change.
* 1.1.0 (2018-05-03)
* Change to MIT License.
* Add instrumentation of AceButton.check() using TimingStats to measure
performance. (Fixes #9)
* Add `examples/AutoBenchmark` sketch to auto-generate benchmarks for
various microcontrollers.
* Verify that library and examples compile, and the tests pass for ESP32.
* Add a third method for distinguishing Clicked from DoubleClicked using
both techniques described in 1.0.6.
* 1.0.6 (2018-03-25)
* Add `kFeatureSuppressClickBeforeDoubleClick` flag to suppress
Clicked event before a DoubleClicked event, at the cost of slower
response time of the Clicked event. Added 2 more examples to demonstrate 2
methods to distinguish between a Clicked and DoubleClicked.
* Publish [doxygen docs](https://bxparks.github.io/AceButton/html/)
on GitHub Pages.
* 1.0.5 (2018-03-17)
* Migrate unit tests to [AUnit](https://github.com/bxparks/AUnit).
* Fix various typos in README.md.
* 1.0.4 (2018-03-07)
* Support ESP8266.
* Split `loop()` in `Stopwatch.ino` into inner and outer loops, to
allow `loop()` to return periodically.
* Perform manual testing, since ArduinoUnit does not work on ESP8266.
* Optimize `check()` so that `checkOrphanedClick()` is called only when
needed.
* README.md: add benchmark numbers for ESP8266, fix typos.
* Fix various compiler warnings about unused variables.
* 1.0.3 (2018-02-13)
* Make library work on Teensy LC and 3.2.
* Fix `elapsedTime` expression that breaks on 32-bit processors
(whose `int` is 4 bytes instead of 2).
* 1.0.2 (2018-02-07)
* Add documentation and unit tests for `AdjustableButtonConfig`.
* Reduce `orphanClickDelay` to 1X `getDoubleClickDelay()` instead of 10X.
* 1.0.1 (2018-02-03)
* Fix typo in 'library.properties'.
* 1.0.0 (2018-02-03)
* Initial public release.

View file

@ -0,0 +1,85 @@
# How to Contribute
Thank you for your interest in this library. I do appreciate any constructive
comments or suggestions about this library. If you would like to contribute
code, please do the following for non-trivial changes:
1. Create an [issue](https://github.com/bxparks/AceButton/issues) or send me
an email so that I have some advance warning on what you would like to
change.
1. Please rebase your branch off the 'develop' branch, and preferably squash all
your changes into a single commit so that it's easier to review.
## Coding Style
I use the following style for this library. New code should follow the same
style for consistency and ease of diffing.
* formatting
* 80 column lines
* _rationale_: I often use vertically split, side-by-side editing on my
small laptop screen.
* 2 space indents, no tabs
* 4 space indents for continuation lines
* no trailing white spaces
* spacing
* consistent and generous spaces around operators and symbols
* e.g. `for (int i = 0; i < 10; i++) {`
* e.g. `a = (flag) ? 3 : -1;`
* _rationale_: Helps readability.
* space after language keywords: e.g. `for`, `while`, `if`, etc
* no space after function names
* pointer declaration `*` attached to the class, not the variable
* e.g. `AceButton* button`, not `AceButton *button`
* _rationale_: I know the latter could be argued to be technically more
correct under the C/C++ syntax, but I think the former is more intuitive for
many people. I've personally gone back and forth, and I decided to just pick
a style.
* only one variable declaration per line
* e.g. `int i, j;` not allowed, use 2 lines
* _rationale_: Helps readability, and avoids the confusion of
`AceButton* b1, *b2;` caused by the previous rule.
* open brace on the same line as the function name (Java style)
* naming conventions
* class names: CamelCase
* e.g. `MyClass`, `YourClass`
* methods: camelCase
* e.g. `doSomething()`, `isCondition()`, etc
* _rationale_: Seems like the Arduino convention. Helps readability.
* class static constants: 'k' followed by CamelCase
* e.g. `kSomeConstant`
* _rationale_: Prevents conflicts with `#define` macros which use the
`ALL_CAPS_MACRO` pattern. Since AceButton is a library, I cannot predict
which other libraries may be used by the end-user. If there is a macro
conflict, I have no way to fix the problem.
* in user-land codes, `ALL_CAPS` for constants would be ok because if
there's a conflict, you can change it
* member variables: 'm' followed by CamelCase
* e.g. `mSomeVariable`
* _rationale_: Many symbols beginning with a single or double underscore
`__` are reserved by the C language, C++ language, or their standard
libraries. So I avoid them completely. One alternative is to append an
underscore *after* the variable name. But this makes the `->` and the `.`
operators hard to read. The 'm' prefix seems consistent with the 'k'
prefix for constants, and it's easy on the eyes.
* global variables
* there ought to be no global variables in this library
* if there were any, the naming convention would be 'gCamelCase'
* [doxygen](http://www.doxygen.org) comments for all public and protected
methods and constants
* comments are recommended for private methods and variables as well, since
private methods sometimes become protected or public
## Unit Tests
Any non-trivial change should have a unit test. Even a seemingly
trivial change can often use a unit test to prevent typos.
Make sure that all the unit tests under the `tests` directory pass. I had to
split the unit tests into multiple `*.ino` files because they became too big to
fit into the 32KB flash memory space of an Arduino board.
## Authorship and License
I will assume that your code is licensed under the same MIT License as
the rest of the library.

View file

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017 LennartHennigs
Copyright (c) 2018 Brian T. Park
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

1028
libdeps/AceButton/README.md Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,4 @@
# Documentation
These [Doxygen docs](https://bxparks.github.io/AceButton/html/) are
viewable on GitHub Pages.

View file

@ -0,0 +1 @@
theme: jekyll-theme-minimal

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,79 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: /home/brian/dev/AceButton/src/AdjustableButtonConfig.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">AdjustableButtonConfig.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * This file has moved to &lt;ace_button/AdjustableButtonConfig.h&gt; and is</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * deprecated as of version 1.1. The &lt;AceButton.h&gt; header automatically includes</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * &lt;ace_button/AdjustableButtonConfig.h&gt;. You can remove the line in your code</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * that does:</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> * #include &lt;AdjustableButtonConfig.h&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * You only need to do:</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> * #include &lt;AceButton.h&gt;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="comment"> */</span></div></div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,79 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: /home/brian/dev/AceButton/src/ButtonConfig.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ButtonConfig.h</div> </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * This file has moved to &lt;ace_button/ButtonConfig.h&gt; and is deprecated as</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> * of version 1.1. The &lt;AceButton.h&gt; header automatically includes</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * &lt;ace_button/ButtonConfig.h&gt;. You can remove the line in your code that does:</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * #include &lt;ButtonConfig.h&gt;</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * You only need to do:</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> * #include &lt;AceButton.h&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment"> */</span></div></div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,84 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Class List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>ace_button</b></td><td class="desc"></td></tr>
<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classace__button_1_1AceButton.html" target="_self">AceButton</a></td><td class="desc">An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events to a user-defined event handler </td></tr>
<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classace__button_1_1AdjustableButtonConfig.html" target="_self">AdjustableButtonConfig</a></td><td class="desc">A subclass of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> which allows the user to override the varous timing parameters of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> at runtime </td></tr>
<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classace__button_1_1ButtonConfig.html" target="_self">ButtonConfig</a></td><td class="desc">Class that defines the timing parameters and event handler of an <a class="el" href="classace__button_1_1AceButton.html" title="An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events t...">AceButton</a> or a group of <a class="el" href="classace__button_1_1AceButton.html" title="An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events t...">AceButton</a> instances </td></tr>
<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classace__button_1_1TimingStats.html" target="_self">TimingStats</a></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

View file

@ -0,0 +1,102 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1AceButton.html">AceButton</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ace_button::AceButton Member List</div> </div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a3c480636223edc899a79c821c32c6982">AceButton</a>(uint8_t pin=0, uint8_t defaultReleasedState=HIGH, uint8_t id=0)</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">explicit</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#ab2ec2d3b98e2e2228f85271385e07521">AceButton</a>(ButtonConfig *buttonConfig)</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">explicit</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1">check</a>()</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a5e4ea4aca852a5e0b1d426bccb131cfb">getButtonConfig</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#afa8013bb98f5fbd79654aebca613ba71">getDefaultReleasedState</a>()</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a4a693b836e3fed29d4e7203a5a97910b">getId</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca">getLastButtonState</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#ac6b12ca62c7c055325bfebd036579ed6">getPin</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34">init</a>(uint8_t pin=0, uint8_t defaultReleasedState=HIGH, uint8_t id=0)</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#af80a2bd19d929bff5dcce54a3db6fb0a">isPressedRaw</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#aa3cbb3fb16076cfe9255e0f70cc6aa72">isReleased</a>(uint8_t buttonState) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#afe8e8e22146f510afa487e6ec98b6253">kButtonStateUnknown</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a21797e5e069da3f7bba42b40ab3a7305">kEventClicked</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a0c63f30106e4688425ba37d8f7a9546b">kEventDoubleClicked</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a769599d288f64dc0e55a69184596d804">kEventLongPressed</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#ae723d826fe219a8415764b9fed5d8976">kEventPressed</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#ada5bd7c31950e2acdb8a9464e795c13c">kEventReleased</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a9c4195cb128da40677ea223eb81743c9">kEventRepeatPressed</a></td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#abc9d705d1ca4341cf6f9434962b5b5e7">setButtonConfig</a>(ButtonConfig *buttonConfig) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1AceButton.html#a42edbfeb4091c867d976a4d24622f19c">setEventHandler</a>(ButtonConfig::EventHandler eventHandler) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1AceButton.html">ace_button::AceButton</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,723 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: ace_button::AceButton Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1AceButton.html">AceButton</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
<a href="classace__button_1_1AceButton-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">ace_button::AceButton Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events to a user-defined event handler.
<a href="classace__button_1_1AceButton.html#details">More...</a></p>
<p><code>#include &lt;<a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>&gt;</code></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:a3c480636223edc899a79c821c32c6982"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a3c480636223edc899a79c821c32c6982">AceButton</a> (uint8_t pin=0, uint8_t defaultReleasedState=HIGH, uint8_t id=0)</td></tr>
<tr class="memdesc:a3c480636223edc899a79c821c32c6982"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor defines parameters of the button that changes from button to button. <a href="#a3c480636223edc899a79c821c32c6982">More...</a><br /></td></tr>
<tr class="separator:a3c480636223edc899a79c821c32c6982"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab2ec2d3b98e2e2228f85271385e07521"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#ab2ec2d3b98e2e2228f85271385e07521">AceButton</a> (<a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *buttonConfig)</td></tr>
<tr class="memdesc:ab2ec2d3b98e2e2228f85271385e07521"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor that accepts a <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> as a dependency. <a href="#ab2ec2d3b98e2e2228f85271385e07521">More...</a><br /></td></tr>
<tr class="separator:ab2ec2d3b98e2e2228f85271385e07521"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a18c47304c694c6f084a343a7c83bef34"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34">init</a> (uint8_t pin=0, uint8_t defaultReleasedState=HIGH, uint8_t id=0)</td></tr>
<tr class="memdesc:a18c47304c694c6f084a343a7c83bef34"><td class="mdescLeft">&#160;</td><td class="mdescRight">Reset the button to the initial constructed state. <a href="#a18c47304c694c6f084a343a7c83bef34">More...</a><br /></td></tr>
<tr class="separator:a18c47304c694c6f084a343a7c83bef34"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5e4ea4aca852a5e0b1d426bccb131cfb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a5e4ea4aca852a5e0b1d426bccb131cfb">getButtonConfig</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a5e4ea4aca852a5e0b1d426bccb131cfb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> associated with this Button. <a href="#a5e4ea4aca852a5e0b1d426bccb131cfb">More...</a><br /></td></tr>
<tr class="separator:a5e4ea4aca852a5e0b1d426bccb131cfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abc9d705d1ca4341cf6f9434962b5b5e7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#abc9d705d1ca4341cf6f9434962b5b5e7">setButtonConfig</a> (<a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *buttonConfig) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:abc9d705d1ca4341cf6f9434962b5b5e7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> associated with this Button. <a href="#abc9d705d1ca4341cf6f9434962b5b5e7">More...</a><br /></td></tr>
<tr class="separator:abc9d705d1ca4341cf6f9434962b5b5e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a42edbfeb4091c867d976a4d24622f19c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a42edbfeb4091c867d976a4d24622f19c">setEventHandler</a> (<a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">ButtonConfig::EventHandler</a> eventHandler) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a42edbfeb4091c867d976a4d24622f19c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience method to set the event handler. <a href="#a42edbfeb4091c867d976a4d24622f19c">More...</a><br /></td></tr>
<tr class="separator:a42edbfeb4091c867d976a4d24622f19c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac6b12ca62c7c055325bfebd036579ed6"><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#ac6b12ca62c7c055325bfebd036579ed6">getPin</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:ac6b12ca62c7c055325bfebd036579ed6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the button's pin number. <a href="#ac6b12ca62c7c055325bfebd036579ed6">More...</a><br /></td></tr>
<tr class="separator:ac6b12ca62c7c055325bfebd036579ed6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4a693b836e3fed29d4e7203a5a97910b"><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a4a693b836e3fed29d4e7203a5a97910b">getId</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a4a693b836e3fed29d4e7203a5a97910b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the custom identifier of the button. <a href="#a4a693b836e3fed29d4e7203a5a97910b">More...</a><br /></td></tr>
<tr class="separator:a4a693b836e3fed29d4e7203a5a97910b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afa8013bb98f5fbd79654aebca613ba71"><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#afa8013bb98f5fbd79654aebca613ba71">getDefaultReleasedState</a> ()</td></tr>
<tr class="memdesc:afa8013bb98f5fbd79654aebca613ba71"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the initial released state of the button, HIGH or LOW. <a href="#afa8013bb98f5fbd79654aebca613ba71">More...</a><br /></td></tr>
<tr class="separator:afa8013bb98f5fbd79654aebca613ba71"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3c49e9edf8cbb5e3800c5f4506d0beca"><td class="memItemLeft" align="right" valign="top">uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca">getLastButtonState</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a3c49e9edf8cbb5e3800c5f4506d0beca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the button state that was last valid. <a href="#a3c49e9edf8cbb5e3800c5f4506d0beca">More...</a><br /></td></tr>
<tr class="separator:a3c49e9edf8cbb5e3800c5f4506d0beca"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af710048a654fa5d5e45405661282a7b1"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1">check</a> ()</td></tr>
<tr class="memdesc:af710048a654fa5d5e45405661282a7b1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check state of button and trigger event processing. <a href="#af710048a654fa5d5e45405661282a7b1">More...</a><br /></td></tr>
<tr class="separator:af710048a654fa5d5e45405661282a7b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa3cbb3fb16076cfe9255e0f70cc6aa72"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#aa3cbb3fb16076cfe9255e0f70cc6aa72">isReleased</a> (uint8_t buttonState) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:aa3cbb3fb16076cfe9255e0f70cc6aa72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns true if the given buttonState represents a 'Released' state for the button. <a href="#aa3cbb3fb16076cfe9255e0f70cc6aa72">More...</a><br /></td></tr>
<tr class="separator:aa3cbb3fb16076cfe9255e0f70cc6aa72"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af80a2bd19d929bff5dcce54a3db6fb0a"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#af80a2bd19d929bff5dcce54a3db6fb0a">isPressedRaw</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:af80a2bd19d929bff5dcce54a3db6fb0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read the button state directly using <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> and return true if the button is in the Pressed state. <a href="#af80a2bd19d929bff5dcce54a3db6fb0a">More...</a><br /></td></tr>
<tr class="separator:af80a2bd19d929bff5dcce54a3db6fb0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
Static Public Attributes</h2></td></tr>
<tr class="memitem:ae723d826fe219a8415764b9fed5d8976"><td class="memItemLeft" align="right" valign="top">static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#ae723d826fe219a8415764b9fed5d8976">kEventPressed</a> = 0</td></tr>
<tr class="memdesc:ae723d826fe219a8415764b9fed5d8976"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was pressed. <a href="#ae723d826fe219a8415764b9fed5d8976">More...</a><br /></td></tr>
<tr class="separator:ae723d826fe219a8415764b9fed5d8976"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ada5bd7c31950e2acdb8a9464e795c13c"><td class="memItemLeft" align="right" valign="top">static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#ada5bd7c31950e2acdb8a9464e795c13c">kEventReleased</a> = 1</td></tr>
<tr class="memdesc:ada5bd7c31950e2acdb8a9464e795c13c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was released. <a href="#ada5bd7c31950e2acdb8a9464e795c13c">More...</a><br /></td></tr>
<tr class="separator:ada5bd7c31950e2acdb8a9464e795c13c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a21797e5e069da3f7bba42b40ab3a7305"><td class="memItemLeft" align="right" valign="top"><a id="a21797e5e069da3f7bba42b40ab3a7305"></a>
static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a21797e5e069da3f7bba42b40ab3a7305">kEventClicked</a> = 2</td></tr>
<tr class="memdesc:a21797e5e069da3f7bba42b40ab3a7305"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was clicked (Pressed and Released within <a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a" title="Milliseconds to wait for a possible click. ">ButtonConfig::getClickDelay()</a>). <br /></td></tr>
<tr class="separator:a21797e5e069da3f7bba42b40ab3a7305"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0c63f30106e4688425ba37d8f7a9546b"><td class="memItemLeft" align="right" valign="top">static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a0c63f30106e4688425ba37d8f7a9546b">kEventDoubleClicked</a> = 3</td></tr>
<tr class="memdesc:a0c63f30106e4688425ba37d8f7a9546b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was double-clicked. <a href="#a0c63f30106e4688425ba37d8f7a9546b">More...</a><br /></td></tr>
<tr class="separator:a0c63f30106e4688425ba37d8f7a9546b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a769599d288f64dc0e55a69184596d804"><td class="memItemLeft" align="right" valign="top"><a id="a769599d288f64dc0e55a69184596d804"></a>
static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a769599d288f64dc0e55a69184596d804">kEventLongPressed</a> = 4</td></tr>
<tr class="memdesc:a769599d288f64dc0e55a69184596d804"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was held down for longer than <a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531" title="Milliseconds for a long press event. ">ButtonConfig::getLongPressDelay()</a>). <br /></td></tr>
<tr class="separator:a769599d288f64dc0e55a69184596d804"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9c4195cb128da40677ea223eb81743c9"><td class="memItemLeft" align="right" valign="top">static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#a9c4195cb128da40677ea223eb81743c9">kEventRepeatPressed</a> = 5</td></tr>
<tr class="memdesc:a9c4195cb128da40677ea223eb81743c9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button was held down and auto generated multiple presses. <a href="#a9c4195cb128da40677ea223eb81743c9">More...</a><br /></td></tr>
<tr class="separator:a9c4195cb128da40677ea223eb81743c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afe8e8e22146f510afa487e6ec98b6253"><td class="memItemLeft" align="right" valign="top">static const uint8_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1AceButton.html#afe8e8e22146f510afa487e6ec98b6253">kButtonStateUnknown</a> = 2</td></tr>
<tr class="memdesc:afe8e8e22146f510afa487e6ec98b6253"><td class="mdescLeft">&#160;</td><td class="mdescRight">Button state is unknown. <a href="#afe8e8e22146f510afa487e6ec98b6253">More...</a><br /></td></tr>
<tr class="separator:afe8e8e22146f510afa487e6ec98b6253"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events to a user-defined event handler. </p>
<p>Supported events types are:</p>
<ul>
<li>kEventPressed</li>
<li>kEventReleased</li>
<li>kEventClicked</li>
<li>kEventDoubleClicked</li>
<li>kEventLongPressed</li>
<li>kEventRepeatPressed</li>
</ul>
<p>The <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1" title="Check state of button and trigger event processing. ">check()</a> method should be called from the loop() at least 2-3 times during the debouncing time period. For 20 ms delay, the <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1" title="Check state of button and trigger event processing. ">check()</a> method should be called at a minimum of every 5 ms. The execution time of <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1" title="Check state of button and trigger event processing. ">check()</a> on a 16 MHz Arduino ATmega328P MCU seems to about about 12-14 microseconds. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00050">50</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="a3c480636223edc899a79c821c32c6982"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3c480636223edc899a79c821c32c6982">&#9670;&nbsp;</a></span>AceButton() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">ace_button::AceButton::AceButton </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>pin</em> = <code>0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>defaultReleasedState</em> = <code>HIGH</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>id</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Constructor defines parameters of the button that changes from button to button. </p>
<p>These parameters don't change during the runtime of the program. Another way to initialize the object is to create an instance using an empty constructor, then use the <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34" title="Reset the button to the initial constructed state. ">init()</a> method to initialize the object with these parameters.</p>
<p>Using the constructor often reads better for simple situations where only a single button is used, and it doesn't need to be configured significantly. Using the <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34" title="Reset the button to the initial constructed state. ">init()</a> method can make the code be more readable when multiple buttons are used, and they need to be significantly customized. The <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34" title="Reset the button to the initial constructed state. ">init()</a> method allows the button configuration code to appear in close proximity to the pinMode() methods which sets up the hardware pins.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">pin</td><td>The pin number of the button. Default 0. Normally the pin number should be given at construction time. However, the pin number the pin number can be omitted so that the pin number can be assigned at setup() time using the setPin() method.</td></tr>
<tr><td class="paramname">defaultReleasedState</td><td>The pin state when the button is in the initial released position. Default HIGH. When using a pullup resistor (either external or internal) and the button is connected to ground, this should be set to HIGH. When using an external pulldown resistor and the button is connected to Vcc (5V or 3.3V), this should be set to LOW. The defaultReleasedState can be assigned using the constructor or the <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34" title="Reset the button to the initial constructed state. ">init()</a> method.</td></tr>
<tr><td class="paramname">id</td><td>This is an optional user-defined identifier for the button. For example, this could be an index into an array of data that is associated with the button. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="AceButton_8cpp_source.html#l00039">39</a> of file <a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a>.</p>
</div>
</div>
<a id="ab2ec2d3b98e2e2228f85271385e07521"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab2ec2d3b98e2e2228f85271385e07521">&#9670;&nbsp;</a></span>AceButton() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">ace_button::AceButton::AceButton </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *&#160;</td>
<td class="paramname"><em>buttonConfig</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">explicit</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Constructor that accepts a <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> as a dependency. </p>
<p>Dependency injection using this constructor is now recommended over using the <a class="el" href="classace__button_1_1AceButton.html#abc9d705d1ca4341cf6f9434962b5b5e7" title="Set the ButtonConfig associated with this Button. ">setButtonConfig()</a> method because it makes the dependency more clear. </p>
<p class="definition">Definition at line <a class="el" href="AceButton_8cpp_source.html#l00044">44</a> of file <a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="af710048a654fa5d5e45405661282a7b1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af710048a654fa5d5e45405661282a7b1">&#9670;&nbsp;</a></span>check()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ace_button::AceButton::check </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Check state of button and trigger event processing. </p>
<p>This method should be called from the loop() method in Arduino every 4-5 times during the getDebounceDelay() time (default 20 ms), so about every 5 ms. If this is called less often than that, the debouncing algorithm may not work correctly, which may cause other event detection algorithms to fail. </p>
<p class="definition">Definition at line <a class="el" href="AceButton_8cpp_source.html#l00073">73</a> of file <a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a>.</p>
</div>
</div>
<a id="a5e4ea4aca852a5e0b1d426bccb131cfb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5e4ea4aca852a5e0b1d426bccb131cfb">&#9670;&nbsp;</a></span>getButtonConfig()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a>* ace_button::AceButton::getButtonConfig </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> associated with this Button. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00143">143</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="afa8013bb98f5fbd79654aebca613ba71"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afa8013bb98f5fbd79654aebca613ba71">&#9670;&nbsp;</a></span>getDefaultReleasedState()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">uint8_t ace_button::AceButton::getDefaultReleasedState </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the initial released state of the button, HIGH or LOW. </p>
<p class="definition">Definition at line <a class="el" href="AceButton_8cpp_source.html#l00067">67</a> of file <a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a>.</p>
</div>
</div>
<a id="a4a693b836e3fed29d4e7203a5a97910b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a693b836e3fed29d4e7203a5a97910b">&#9670;&nbsp;</a></span>getId()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint8_t ace_button::AceButton::getId </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the custom identifier of the button. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00174">174</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="a3c49e9edf8cbb5e3800c5f4506d0beca"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3c49e9edf8cbb5e3800c5f4506d0beca">&#9670;&nbsp;</a></span>getLastButtonState()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint8_t ace_button::AceButton::getLastButtonState </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Return the button state that was last valid. </p>
<p>This is a tri-state function. It may return HIGH, LOW or kButtonStateUnknown to indicate that the last state is not known. This method is <b>not</b> for public consumption, it is exposed only for testing purposes. Consider it to be a private method. Use the buttonState parameter provided to the EventHandler.</p>
<p>In a more general multi-threaded environment (which the Arduino is not, fortunately or unfortunately), the <a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca" title="Return the button state that was last valid. ">getLastButtonState()</a> may have changed from the value of buttonState provided to the event handler. In other words, there is a race-condition. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00192">192</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="ac6b12ca62c7c055325bfebd036579ed6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac6b12ca62c7c055325bfebd036579ed6">&#9670;&nbsp;</a></span>getPin()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint8_t ace_button::AceButton::getPin </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the button's pin number. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00171">171</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="a18c47304c694c6f084a343a7c83bef34"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a18c47304c694c6f084a343a7c83bef34">&#9670;&nbsp;</a></span>init()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void ace_button::AceButton::init </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>pin</em> = <code>0</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>defaultReleasedState</em> = <code>HIGH</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>id</em> = <code>0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Reset the button to the initial constructed state. </p>
<p>In particular, <a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca" title="Return the button state that was last valid. ">getLastButtonState()</a> returns kButtonStateUnknown. The parameters are identical as the parameters in the <a class="el" href="classace__button_1_1AceButton.html#a3c480636223edc899a79c821c32c6982" title="Constructor defines parameters of the button that changes from button to button. ">AceButton()</a> constructor. </p>
<p class="definition">Definition at line <a class="el" href="AceButton_8cpp_source.html#l00049">49</a> of file <a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a>.</p>
</div>
</div>
<a id="af80a2bd19d929bff5dcce54a3db6fb0a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af80a2bd19d929bff5dcce54a3db6fb0a">&#9670;&nbsp;</a></span>isPressedRaw()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool ace_button::AceButton::isPressedRaw </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Read the button state directly using <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> and return true if the button is in the Pressed state. </p>
<p>This method is intended to be used in the global setup() to determine if the button was pressed while the device was booted. This method does not use the <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1" title="Check state of button and trigger event processing. ">check()</a> method, does not perform any debouncing, and does not dispatch events to the EventHandler. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00231">231</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="aa3cbb3fb16076cfe9255e0f70cc6aa72"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa3cbb3fb16076cfe9255e0f70cc6aa72">&#9670;&nbsp;</a></span>isReleased()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">bool ace_button::AceButton::isReleased </td>
<td>(</td>
<td class="paramtype">uint8_t&#160;</td>
<td class="paramname"><em>buttonState</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns true if the given buttonState represents a 'Released' state for the button. </p>
<p>Returns false if the buttonState is 'Pressed' or kButtonStateUnknown.</p>
<p>The HIGH or LOW logical value of buttonState represents different a button position depending on whether the button is wired with a pull-up or a pull-down resistor. This method translates the logical level to the physical position which allows the client code to be independent of the physical wiring.</p>
<p>Normally, the eventType given to the EventHandler should be sufficient because the value of the eventType already encodes this information. This method is provided just in case. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00220">220</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="abc9d705d1ca4341cf6f9434962b5b5e7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abc9d705d1ca4341cf6f9434962b5b5e7">&#9670;&nbsp;</a></span>setButtonConfig()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void ace_button::AceButton::setButtonConfig </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *&#160;</td>
<td class="paramname"><em>buttonConfig</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Set the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> associated with this Button. </p>
<p>It is recommended that the <a class="el" href="classace__button_1_1AceButton.html#ab2ec2d3b98e2e2228f85271385e07521" title="Constructor that accepts a ButtonConfig as a dependency. ">AceButton(ButtonConfig*)</a> constructor is used instead to make the dependency to <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> more explicit. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00152">152</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="a42edbfeb4091c867d976a4d24622f19c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a42edbfeb4091c867d976a4d24622f19c">&#9670;&nbsp;</a></span>setEventHandler()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">void ace_button::AceButton::setEventHandler </td>
<td>(</td>
<td class="paramtype"><a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">ButtonConfig::EventHandler</a>&#160;</td>
<td class="paramname"><em>eventHandler</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Convenience method to set the event handler. </p>
<p>Event handlers are stored in the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> object, not in the <a class="el" href="classace__button_1_1AceButton.html" title="An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events t...">AceButton</a> object, to save memory. (Multiple buttons are likely to share the same event handler.) So this method is just a pass-through to <a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be" title="Install the event handler. ">ButtonConfig::setEventHandler()</a>. If you are using multiple <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> objects, you should call the <a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be" title="Install the event handler. ">ButtonConfig::setEventHandler()</a> method on those objects directly, instead of using this method. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00165">165</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Data Documentation</h2>
<a id="afe8e8e22146f510afa487e6ec98b6253"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afe8e8e22146f510afa487e6ec98b6253">&#9670;&nbsp;</a></span>kButtonStateUnknown</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">const uint8_t ace_button::AceButton::kButtonStateUnknown = 2</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Button state is unknown. </p>
<p>This is a third state (different from LOW or HIGH) used when the class is first initialized upon reboot. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00090">90</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="a0c63f30106e4688425ba37d8f7a9546b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a0c63f30106e4688425ba37d8f7a9546b">&#9670;&nbsp;</a></span>kEventDoubleClicked</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">const uint8_t ace_button::AceButton::kEventDoubleClicked = 3</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Button was double-clicked. </p>
<p>(Two clicks within <a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6" title="Milliseconds between the first and second click to register as a double-click. ">ButtonConfig::getDoubleClickDelay()</a>). </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00070">70</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="ae723d826fe219a8415764b9fed5d8976"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae723d826fe219a8415764b9fed5d8976">&#9670;&nbsp;</a></span>kEventPressed</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">const uint8_t ace_button::AceButton::kEventPressed = 0</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Button was pressed. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00055">55</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="ada5bd7c31950e2acdb8a9464e795c13c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ada5bd7c31950e2acdb8a9464e795c13c">&#9670;&nbsp;</a></span>kEventReleased</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">const uint8_t ace_button::AceButton::kEventReleased = 1</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Button was released. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00058">58</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<a id="a9c4195cb128da40677ea223eb81743c9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9c4195cb128da40677ea223eb81743c9">&#9670;&nbsp;</a></span>kEventRepeatPressed</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">const uint8_t ace_button::AceButton::kEventRepeatPressed = 5</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Button was held down and auto generated multiple presses. </p>
<p>The first event is triggered after <a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2" title="Milliseconds that a button needs to be Pressed down before the start of the sequence of RepeatPressed...">ButtonConfig::getRepeatPressDelay()</a>, then the event fires repeatedly every <a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43" title="Milliseconds between two successive RepeatPressed events. ">ButtonConfig::getRepeatPressInterval()</a> until the button is released. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AceButton_8h_source.html#l00084">84</a> of file <a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>/home/brian/dev/AceButton/src/ace_button/<a class="el" href="ace__button_2AceButton_8h_source.html">AceButton.h</a></li>
<li>/home/brian/dev/AceButton/src/ace_button/<a class="el" href="AceButton_8cpp_source.html">AceButton.cpp</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,125 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1AdjustableButtonConfig.html">AdjustableButtonConfig</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ace_button::AdjustableButtonConfig Member List</div> </div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classace__button_1_1AdjustableButtonConfig.html">ace_button::AdjustableButtonConfig</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">ButtonConfig</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">clearFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">EventHandler</a> typedef</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a> typedef</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">getClickDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">getClock</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">getClockMicros</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">getDebounceDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6">getDoubleClickDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">getEventHandler</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">getLongPressDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">getRepeatPressDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43">getRepeatPressInterval</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ab780f081ef691b48deb5182d206a4b9d">getSystemButtonConfig</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">getTimingStats</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">init</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">isFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">kClickDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">kDebounceDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">kDoubleClickDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">kFeatureClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">kFeatureDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">kFeatureLongPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">kFeatureRepeatPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">kFeatureSuppressAfterClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">kFeatureSuppressAfterDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">kFeatureSuppressAfterLongPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">kFeatureSuppressAfterRepeatPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">kFeatureSuppressAll</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">kFeatureSuppressClickBeforeDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">kLongPressDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">kRepeatPressDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">kRepeatPressInterval</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">readButton</a>(uint8_t pin)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">setClickDelay</a>(uint16_t clickDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">setDebounceDelay</a>(uint16_t debounceDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">setDoubleClickDelay</a>(uint16_t doubleClickDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">setEventHandler</a>(EventHandler eventHandler) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">setFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">setLongPressDelay</a>(uint16_t longPressDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">setRepeatPressDelay</a>(uint16_t repeatPressDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">setRepeatPressInterval</a>(uint16_t repeatPressInterval)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">setTimingStats</a>(TimingStats *timingStats)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,252 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: ace_button::AdjustableButtonConfig Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1AdjustableButtonConfig.html">AdjustableButtonConfig</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="classace__button_1_1AdjustableButtonConfig-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">ace_button::AdjustableButtonConfig Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>A subclass of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> which allows the user to override the varous timing parameters of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> at runtime.
<a href="classace__button_1_1AdjustableButtonConfig.html#details">More...</a></p>
<p><code>#include &lt;<a class="el" href="ace__button_2AdjustableButtonConfig_8h_source.html">AdjustableButtonConfig.h</a>&gt;</code></p>
<div class="dynheader">
Inheritance diagram for ace_button::AdjustableButtonConfig:</div>
<div class="dyncontent">
<div class="center"><img src="classace__button_1_1AdjustableButtonConfig__inherit__graph.png" border="0" usemap="#ace__button_1_1AdjustableButtonConfig_inherit__map" alt="Inheritance graph"/></div>
<map name="ace__button_1_1AdjustableButtonConfig_inherit__map" id="ace__button_1_1AdjustableButtonConfig_inherit__map">
<area shape="rect" id="node2" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in..." alt="" coords="17,5,187,32"/>
</map>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<div class="dynheader">
Collaboration diagram for ace_button::AdjustableButtonConfig:</div>
<div class="dyncontent">
<div class="center"><img src="classace__button_1_1AdjustableButtonConfig__coll__graph.png" border="0" usemap="#ace__button_1_1AdjustableButtonConfig_coll__map" alt="Collaboration graph"/></div>
<map name="ace__button_1_1AdjustableButtonConfig_coll__map" id="ace__button_1_1AdjustableButtonConfig_coll__map">
<area shape="rect" id="node2" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in..." alt="" coords="17,5,187,32"/>
</map>
<center><span class="legend">[<a href="graph_legend.html">legend</a>]</span></center></div>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
Additional Inherited Members</h2></td></tr>
<tr class="inherit_header pub_types_classace__button_1_1ButtonConfig"><td colspan="2" onclick="javascript:toggleInherit('pub_types_classace__button_1_1ButtonConfig')"><img src="closed.png" alt="-"/>&#160;Public Types inherited from <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td></tr>
<tr class="memitem:a1c7c7bfc42738278330243dfc43f23eb inherit pub_types_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">typedef uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a></td></tr>
<tr class="memdesc:a1c7c7bfc42738278330243dfc43f23eb inherit pub_types_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Type of the feature flag. <a href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">More...</a><br /></td></tr>
<tr class="separator:a1c7c7bfc42738278330243dfc43f23eb inherit pub_types_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6d9db3c7b221b474c3cfd8fca5f4ba1e inherit pub_types_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">typedef void(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">EventHandler</a>) (<a class="el" href="classace__button_1_1AceButton.html">AceButton</a> *button, uint8_t eventType, uint8_t buttonState)</td></tr>
<tr class="memdesc:a6d9db3c7b221b474c3cfd8fca5f4ba1e inherit pub_types_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">The event handler signature. <a href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">More...</a><br /></td></tr>
<tr class="separator:a6d9db3c7b221b474c3cfd8fca5f4ba1e inherit pub_types_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_methods_classace__button_1_1ButtonConfig"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classace__button_1_1ButtonConfig')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td></tr>
<tr class="memitem:a66924aac157a81cc54a9776fb975893a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">ButtonConfig</a> ()</td></tr>
<tr class="memdesc:a66924aac157a81cc54a9776fb975893a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">More...</a><br /></td></tr>
<tr class="separator:a66924aac157a81cc54a9776fb975893a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad7be58d0fe0b242f78f15319d201a565 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">getDebounceDelay</a> ()</td></tr>
<tr class="memdesc:ad7be58d0fe0b242f78f15319d201a565 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds to wait for debouncing. <a href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">More...</a><br /></td></tr>
<tr class="separator:ad7be58d0fe0b242f78f15319d201a565 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a19db203ce87dc2cafb2cab6ba124387a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">getClickDelay</a> ()</td></tr>
<tr class="memdesc:a19db203ce87dc2cafb2cab6ba124387a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds to wait for a possible click. <a href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">More...</a><br /></td></tr>
<tr class="separator:a19db203ce87dc2cafb2cab6ba124387a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5ba500367e03c36f39225a5858e110e6 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top"><a id="a5ba500367e03c36f39225a5858e110e6"></a>
uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6">getDoubleClickDelay</a> ()</td></tr>
<tr class="memdesc:a5ba500367e03c36f39225a5858e110e6 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds between the first and second click to register as a double-click. <br /></td></tr>
<tr class="separator:a5ba500367e03c36f39225a5858e110e6 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a46d4213a827a94bf82ba99a9c2e59531 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">getLongPressDelay</a> ()</td></tr>
<tr class="memdesc:a46d4213a827a94bf82ba99a9c2e59531 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds for a long press event. <a href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">More...</a><br /></td></tr>
<tr class="separator:a46d4213a827a94bf82ba99a9c2e59531 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad85c75d2a2dd200552a181fb154d5fd2 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">getRepeatPressDelay</a> ()</td></tr>
<tr class="memdesc:ad85c75d2a2dd200552a181fb154d5fd2 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds that a button needs to be Pressed down before the start of the sequence of RepeatPressed events. <a href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">More...</a><br /></td></tr>
<tr class="separator:ad85c75d2a2dd200552a181fb154d5fd2 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aec4a97a1a1306b9ff12f1cdf44515c43 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top"><a id="aec4a97a1a1306b9ff12f1cdf44515c43"></a>
uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43">getRepeatPressInterval</a> ()</td></tr>
<tr class="memdesc:aec4a97a1a1306b9ff12f1cdf44515c43 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Milliseconds between two successive RepeatPressed events. <br /></td></tr>
<tr class="separator:aec4a97a1a1306b9ff12f1cdf44515c43 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9860d2c8a6ab33d40ea126b02d168cab inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">setDebounceDelay</a> (uint16_t debounceDelay)</td></tr>
<tr class="memdesc:a9860d2c8a6ab33d40ea126b02d168cab inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the debounceDelay. <a href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">More...</a><br /></td></tr>
<tr class="separator:a9860d2c8a6ab33d40ea126b02d168cab inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aef65e12128997c46bc2754a988b98f14 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">setClickDelay</a> (uint16_t clickDelay)</td></tr>
<tr class="memdesc:aef65e12128997c46bc2754a988b98f14 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the clickDelay. <a href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">More...</a><br /></td></tr>
<tr class="separator:aef65e12128997c46bc2754a988b98f14 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a367a809017e1d633a5cf6b117981d579 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">setDoubleClickDelay</a> (uint16_t doubleClickDelay)</td></tr>
<tr class="memdesc:a367a809017e1d633a5cf6b117981d579 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the doubleClickDelay. <a href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">More...</a><br /></td></tr>
<tr class="separator:a367a809017e1d633a5cf6b117981d579 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7d90d39aeddacb5abc9d8741611d7c4a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">setLongPressDelay</a> (uint16_t longPressDelay)</td></tr>
<tr class="memdesc:a7d90d39aeddacb5abc9d8741611d7c4a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the longPressDelay. <a href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">More...</a><br /></td></tr>
<tr class="separator:a7d90d39aeddacb5abc9d8741611d7c4a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af813c969eddd884e9fa83b334a59a0a5 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">setRepeatPressDelay</a> (uint16_t repeatPressDelay)</td></tr>
<tr class="memdesc:af813c969eddd884e9fa83b334a59a0a5 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the repeatPressDelay. <a href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">More...</a><br /></td></tr>
<tr class="separator:af813c969eddd884e9fa83b334a59a0a5 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa1b1217e0042512fc8d9b6544536aed3 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">setRepeatPressInterval</a> (uint16_t repeatPressInterval)</td></tr>
<tr class="memdesc:aa1b1217e0042512fc8d9b6544536aed3 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the repeatPressInterval. <a href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">More...</a><br /></td></tr>
<tr class="separator:aa1b1217e0042512fc8d9b6544536aed3 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a440271e22d5e7e161cdcb3b73f092111 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">virtual unsigned long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">getClock</a> ()</td></tr>
<tr class="memdesc:a440271e22d5e7e161cdcb3b73f092111 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the milliseconds of the internal clock. <a href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">More...</a><br /></td></tr>
<tr class="separator:a440271e22d5e7e161cdcb3b73f092111 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8a74d1a1c082bfb0e4ddf55e67d3ac2d inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">virtual unsigned long&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">getClockMicros</a> ()</td></tr>
<tr class="memdesc:a8a74d1a1c082bfb0e4ddf55e67d3ac2d inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the microseconds of the internal clock. <a href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">More...</a><br /></td></tr>
<tr class="separator:a8a74d1a1c082bfb0e4ddf55e67d3ac2d inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5dab877bf124bfdf5a5eb703ca123027 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">virtual int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">readButton</a> (uint8_t pin)</td></tr>
<tr class="memdesc:a5dab877bf124bfdf5a5eb703ca123027 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the HIGH or LOW state of the button. <a href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">More...</a><br /></td></tr>
<tr class="separator:a5dab877bf124bfdf5a5eb703ca123027 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aae51c7a2986eafd400784cdbe6bb1815 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">isFeature</a> (<a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a> features) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:aae51c7a2986eafd400784cdbe6bb1815 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check if the given features are enabled. <a href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">More...</a><br /></td></tr>
<tr class="separator:aae51c7a2986eafd400784cdbe6bb1815 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aac1c9029b1cf9aa793060d372fc09a1a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">setFeature</a> (<a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a> features) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:aac1c9029b1cf9aa793060d372fc09a1a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Enable the given features. <a href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">More...</a><br /></td></tr>
<tr class="separator:aac1c9029b1cf9aa793060d372fc09a1a inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac782903e4a60924db3d17c00accc7f3b inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">clearFeature</a> (<a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a> features) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:ac782903e4a60924db3d17c00accc7f3b inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Disable the given features. <a href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">More...</a><br /></td></tr>
<tr class="separator:ac782903e4a60924db3d17c00accc7f3b inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8fc32804ba102f61ba97bcc5f4fe8448 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">EventHandler</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">getEventHandler</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a8fc32804ba102f61ba97bcc5f4fe8448 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the eventHandler. <a href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">More...</a><br /></td></tr>
<tr class="separator:a8fc32804ba102f61ba97bcc5f4fe8448 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5d228f08e9943fd4ab90caab39ef80be inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">setEventHandler</a> (<a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">EventHandler</a> eventHandler) ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:a5d228f08e9943fd4ab90caab39ef80be inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Install the event handler. <a href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">More...</a><br /></td></tr>
<tr class="separator:a5d228f08e9943fd4ab90caab39ef80be inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a16d7dbbe1bb075018378e463cd8106de inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">setTimingStats</a> (<a class="el" href="classace__button_1_1TimingStats.html">TimingStats</a> *timingStats)</td></tr>
<tr class="memdesc:a16d7dbbe1bb075018378e463cd8106de inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the timing stats object. <a href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">More...</a><br /></td></tr>
<tr class="separator:a16d7dbbe1bb075018378e463cd8106de inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aff7101f2fe0f0c3bba67924b01e9d493 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classace__button_1_1TimingStats.html">TimingStats</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">getTimingStats</a> ()</td></tr>
<tr class="memdesc:aff7101f2fe0f0c3bba67924b01e9d493 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the timing stats. <a href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">More...</a><br /></td></tr>
<tr class="separator:aff7101f2fe0f0c3bba67924b01e9d493 inherit pub_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_static_methods_classace__button_1_1ButtonConfig"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classace__button_1_1ButtonConfig')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td></tr>
<tr class="memitem:ab780f081ef691b48deb5182d206a4b9d inherit pub_static_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top"><a id="ab780f081ef691b48deb5182d206a4b9d"></a>
static <a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ab780f081ef691b48deb5182d206a4b9d">getSystemButtonConfig</a> () ACE_BUTTON_INLINE</td></tr>
<tr class="memdesc:ab780f081ef691b48deb5182d206a4b9d inherit pub_static_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return a pointer to the singleton instance of the <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> which is attached to all <a class="el" href="classace__button_1_1AceButton.html" title="An Adjustable Compact Event-driven (ACE) Button library that debounces and dispatches button events t...">AceButton</a> instances by default. <br /></td></tr>
<tr class="separator:ab780f081ef691b48deb5182d206a4b9d inherit pub_static_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pub_static_attribs_classace__button_1_1ButtonConfig"><td colspan="2" onclick="javascript:toggleInherit('pub_static_attribs_classace__button_1_1ButtonConfig')"><img src="closed.png" alt="-"/>&#160;Static Public Attributes inherited from <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td></tr>
<tr class="memitem:a8fbe63588107a1375d05911d27df3ad8 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">kDebounceDelay</a> = 20</td></tr>
<tr class="memdesc:a8fbe63588107a1375d05911d27df3ad8 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565" title="Milliseconds to wait for debouncing. ">getDebounceDelay()</a>. <a href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">More...</a><br /></td></tr>
<tr class="separator:a8fbe63588107a1375d05911d27df3ad8 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5691e38564dae63592d22abf74fb15f3 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">kClickDelay</a> = 200</td></tr>
<tr class="memdesc:a5691e38564dae63592d22abf74fb15f3 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a" title="Milliseconds to wait for a possible click. ">getClickDelay()</a>. <a href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">More...</a><br /></td></tr>
<tr class="separator:a5691e38564dae63592d22abf74fb15f3 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af0a0d503f3396acef6a84aca4390fd6a inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">kDoubleClickDelay</a> = 400</td></tr>
<tr class="memdesc:af0a0d503f3396acef6a84aca4390fd6a inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6" title="Milliseconds between the first and second click to register as a double-click. ">getDoubleClickDelay()</a>. <a href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">More...</a><br /></td></tr>
<tr class="separator:af0a0d503f3396acef6a84aca4390fd6a inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a60bf588a2c067a561887eadf18cedccd inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">kLongPressDelay</a> = 1000</td></tr>
<tr class="memdesc:a60bf588a2c067a561887eadf18cedccd inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531" title="Milliseconds for a long press event. ">getLongPressDelay()</a>. <a href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">More...</a><br /></td></tr>
<tr class="separator:a60bf588a2c067a561887eadf18cedccd inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3d20bc5800532085fd046fc64b80ae9f inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">kRepeatPressDelay</a> = 1000</td></tr>
<tr class="memdesc:a3d20bc5800532085fd046fc64b80ae9f inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2" title="Milliseconds that a button needs to be Pressed down before the start of the sequence of RepeatPressed...">getRepeatPressDelay()</a>. <a href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">More...</a><br /></td></tr>
<tr class="separator:a3d20bc5800532085fd046fc64b80ae9f inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a218c1aa09b45ea2fe6884e3af3a18310 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">kRepeatPressInterval</a> = 200</td></tr>
<tr class="memdesc:a218c1aa09b45ea2fe6884e3af3a18310 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Default value returned by <a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43" title="Milliseconds between two successive RepeatPressed events. ">getRepeatPressInterval()</a>. <a href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">More...</a><br /></td></tr>
<tr class="separator:a218c1aa09b45ea2fe6884e3af3a18310 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac662555100416c4843c6ee5156699c56 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">kFeatureClick</a> = 0x01</td></tr>
<tr class="memdesc:ac662555100416c4843c6ee5156699c56 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to activate the <a class="el" href="classace__button_1_1AceButton.html#a21797e5e069da3f7bba42b40ab3a7305" title="Button was clicked (Pressed and Released within ButtonConfig::getClickDelay()). ">AceButton::kEventClicked</a> event. <a href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">More...</a><br /></td></tr>
<tr class="separator:ac662555100416c4843c6ee5156699c56 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a638943c127dd60288a83e83260825d01 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">kFeatureDoubleClick</a> = 0x02</td></tr>
<tr class="memdesc:a638943c127dd60288a83e83260825d01 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to activate the <a class="el" href="classace__button_1_1AceButton.html#a0c63f30106e4688425ba37d8f7a9546b" title="Button was double-clicked. ">AceButton::kEventDoubleClicked</a> event. <a href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">More...</a><br /></td></tr>
<tr class="separator:a638943c127dd60288a83e83260825d01 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4d175560047a4ca245186fb26fa413f2 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">kFeatureLongPress</a> = 0x04</td></tr>
<tr class="memdesc:a4d175560047a4ca245186fb26fa413f2 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to activate the AceButton::kEventLongPress event. <a href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">More...</a><br /></td></tr>
<tr class="separator:a4d175560047a4ca245186fb26fa413f2 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac9b941ca87f0eeb899ed503481439c92 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">kFeatureRepeatPress</a> = 0x08</td></tr>
<tr class="memdesc:ac9b941ca87f0eeb899ed503481439c92 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to activate the <a class="el" href="classace__button_1_1AceButton.html#a9c4195cb128da40677ea223eb81743c9" title="Button was held down and auto generated multiple presses. ">AceButton::kEventRepeatPressed</a> event. <a href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">More...</a><br /></td></tr>
<tr class="separator:ac9b941ca87f0eeb899ed503481439c92 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a57327066d135bcc99c4a68b55fca162e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">kFeatureSuppressAfterClick</a> = 0x10</td></tr>
<tr class="memdesc:a57327066d135bcc99c4a68b55fca162e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to suppress kEventReleased after a kEventClicked. <a href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">More...</a><br /></td></tr>
<tr class="separator:a57327066d135bcc99c4a68b55fca162e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7642e16b2cc8dd0136312054b1da8f9e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">kFeatureSuppressAfterDoubleClick</a> = 0x20</td></tr>
<tr class="memdesc:a7642e16b2cc8dd0136312054b1da8f9e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to suppress kEventReleased after a kEventDoubleClicked. <a href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">More...</a><br /></td></tr>
<tr class="separator:a7642e16b2cc8dd0136312054b1da8f9e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a15b8e90b1ffe01009a1d7dd18b5b6aae inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">kFeatureSuppressAfterLongPress</a> = 0x40</td></tr>
<tr class="memdesc:a15b8e90b1ffe01009a1d7dd18b5b6aae inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to suppress kEventReleased after a kEventLongPressed. <a href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">More...</a><br /></td></tr>
<tr class="separator:a15b8e90b1ffe01009a1d7dd18b5b6aae inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6b43b591ba53d360e787bf780af0abbc inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">kFeatureSuppressAfterRepeatPress</a> = 0x80</td></tr>
<tr class="memdesc:a6b43b591ba53d360e787bf780af0abbc inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to suppress kEventReleased after a kEventRepeatPressed. <a href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">More...</a><br /></td></tr>
<tr class="separator:a6b43b591ba53d360e787bf780af0abbc inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a80d621dbcf533c9bb91a111b8fec2c53 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">kFeatureSuppressClickBeforeDoubleClick</a> = 0x100</td></tr>
<tr class="memdesc:a80d621dbcf533c9bb91a111b8fec2c53 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Flag to suppress kEventClicked before a kEventDoubleClicked. <a href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">More...</a><br /></td></tr>
<tr class="separator:a80d621dbcf533c9bb91a111b8fec2c53 inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abfd736234ae852f22894c7aceb4e534e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">static const <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">kFeatureSuppressAll</a></td></tr>
<tr class="memdesc:abfd736234ae852f22894c7aceb4e534e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convenience flag to suppress all suppressions. <a href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">More...</a><br /></td></tr>
<tr class="separator:abfd736234ae852f22894c7aceb4e534e inherit pub_static_attribs_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="inherit_header pro_methods_classace__button_1_1ButtonConfig"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classace__button_1_1ButtonConfig')"><img src="closed.png" alt="-"/>&#160;Protected Member Functions inherited from <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td></tr>
<tr class="memitem:a86f8f6b62825258e477e0a41846e0223 inherit pro_methods_classace__button_1_1ButtonConfig"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">init</a> ()</td></tr>
<tr class="memdesc:a86f8f6b62825258e477e0a41846e0223 inherit pro_methods_classace__button_1_1ButtonConfig"><td class="mdescLeft">&#160;</td><td class="mdescRight">Initialize to its pristine state, except for the EventHandler which is unchanged. <a href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">More...</a><br /></td></tr>
<tr class="separator:a86f8f6b62825258e477e0a41846e0223 inherit pro_methods_classace__button_1_1ButtonConfig"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>A subclass of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> which allows the user to override the varous timing parameters of <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> at runtime. </p>
<p>Each timing parameter is stored in a member variable, so an instance of <a class="el" href="classace__button_1_1AdjustableButtonConfig.html" title="A subclass of ButtonConfig which allows the user to override the varous timing parameters of ButtonCo...">AdjustableButtonConfig</a> consumes far more static RAM than <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a>. In return, this class allows these parameters to be changed at runtime by the user.</p>
<p>Warning: This class is deprecated and replaced with its parent <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> class. You can just use <a class="el" href="classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in...">ButtonConfig</a> everywhere you previously used <a class="el" href="classace__button_1_1AdjustableButtonConfig.html" title="A subclass of ButtonConfig which allows the user to override the varous timing parameters of ButtonCo...">AdjustableButtonConfig</a>. </p>
<p class="definition">Definition at line <a class="el" href="ace__button_2AdjustableButtonConfig_8h_source.html#l00043">43</a> of file <a class="el" href="ace__button_2AdjustableButtonConfig_8h_source.html">AdjustableButtonConfig.h</a>.</p>
</div><hr/>The documentation for this class was generated from the following file:<ul>
<li>/home/brian/dev/AceButton/src/ace_button/<a class="el" href="ace__button_2AdjustableButtonConfig_8h_source.html">AdjustableButtonConfig.h</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,3 @@
<map id="ace_button::AdjustableButtonConfig" name="ace_button::AdjustableButtonConfig">
<area shape="rect" id="node2" href="$classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in..." alt="" coords="17,5,187,32"/>
</map>

View file

@ -0,0 +1 @@
24afbad6ac053e22de7b42f0fa06d3d1

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,3 @@
<map id="ace_button::AdjustableButtonConfig" name="ace_button::AdjustableButtonConfig">
<area shape="rect" id="node2" href="$classace__button_1_1ButtonConfig.html" title="Class that defines the timing parameters and event handler of an AceButton or a group of AceButton in..." alt="" coords="17,5,187,32"/>
</map>

View file

@ -0,0 +1 @@
1fa92ec2e1aa7d5f08e922e62e347ea6

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,125 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ace_button::ButtonConfig Member List</div> </div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a>, including all inherited members.</p>
<table class="directory">
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">ButtonConfig</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">clearFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">EventHandler</a> typedef</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">FeatureFlagType</a> typedef</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">getClickDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">getClock</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">getClockMicros</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">getDebounceDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6">getDoubleClickDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">getEventHandler</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">getLongPressDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">getRepeatPressDelay</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43">getRepeatPressInterval</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ab780f081ef691b48deb5182d206a4b9d">getSystemButtonConfig</a>() ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">getTimingStats</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">init</a>()</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">protected</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">isFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">kClickDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">kDebounceDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">kDoubleClickDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">kFeatureClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">kFeatureDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">kFeatureLongPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">kFeatureRepeatPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">kFeatureSuppressAfterClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">kFeatureSuppressAfterDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">kFeatureSuppressAfterLongPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">kFeatureSuppressAfterRepeatPress</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">kFeatureSuppressAll</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">kFeatureSuppressClickBeforeDoubleClick</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">kLongPressDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">kRepeatPressDelay</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">kRepeatPressInterval</a></td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">readButton</a>(uint8_t pin)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span><span class="mlabel">virtual</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">setClickDelay</a>(uint16_t clickDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">setDebounceDelay</a>(uint16_t debounceDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">setDoubleClickDelay</a>(uint16_t doubleClickDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">setEventHandler</a>(EventHandler eventHandler) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">setFeature</a>(FeatureFlagType features) ACE_BUTTON_INLINE</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">setLongPressDelay</a>(uint16_t longPressDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">setRepeatPressDelay</a>(uint16_t repeatPressDelay)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">setRepeatPressInterval</a>(uint16_t repeatPressInterval)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">setTimingStats</a>(TimingStats *timingStats)</td><td class="entry"><a class="el" href="classace__button_1_1ButtonConfig.html">ace_button::ButtonConfig</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,3 @@
<map id="ace_button::ButtonConfig" name="ace_button::ButtonConfig">
<area shape="rect" id="node2" href="$classace__button_1_1AdjustableButtonConfig.html" title="A subclass of ButtonConfig which allows the user to override the varous timing parameters of ButtonCo..." alt="" coords="5,80,199,121"/>
</map>

View file

@ -0,0 +1 @@
884078a211be4f42b1d83fd9a9e04dc6

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,91 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Member List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1TimingStats.html">TimingStats</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ace_button::TimingStats Member List</div> </div>
</div><!--header-->
<div class="contents">
<p>This is the complete list of members for <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getAvg</b>() const (defined in <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>)</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html#ad23641b3302acb7050317c8749febe3d">getCount</a>() const</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html#a3eab5a6a7a43e1a565d91faf14b148b2">getCounter</a>() const</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html#a04c9dbea755eafeed3bb7872d7fb0d24">getExpDecayAvg</a>() const</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>getMax</b>() const (defined in <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>)</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0"><td class="entry"><b>getMin</b>() const (defined in <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>)</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>reset</b>() (defined in <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>)</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html#ad763ef53d333dd86964acd7b5458491b">TimingStats</a>()</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>update</b>(uint16_t duration) (defined in <a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a>)</td><td class="entry"><a class="el" href="classace__button_1_1TimingStats.html">ace_button::TimingStats</a></td><td class="entry"><span class="mlabel">inline</span></td></tr>
</table></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,239 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: ace_button::TimingStats Class Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><b>ace_button</b></li><li class="navelem"><a class="el" href="classace__button_1_1TimingStats.html">TimingStats</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="classace__button_1_1TimingStats-members.html">List of all members</a> </div>
<div class="headertitle">
<div class="title">ace_button::TimingStats Class Reference</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:ad763ef53d333dd86964acd7b5458491b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1TimingStats.html#ad763ef53d333dd86964acd7b5458491b">TimingStats</a> ()</td></tr>
<tr class="memdesc:ad763ef53d333dd86964acd7b5458491b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="#ad763ef53d333dd86964acd7b5458491b">More...</a><br /></td></tr>
<tr class="separator:ad763ef53d333dd86964acd7b5458491b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a1e53cdacce4a86a2e3c466512cdc6661"><td class="memItemLeft" align="right" valign="top"><a id="a1e53cdacce4a86a2e3c466512cdc6661"></a>
void&#160;</td><td class="memItemRight" valign="bottom"><b>reset</b> ()</td></tr>
<tr class="separator:a1e53cdacce4a86a2e3c466512cdc6661"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6f1fbf56ed9dc9b87b1b709a91a397e9"><td class="memItemLeft" align="right" valign="top"><a id="a6f1fbf56ed9dc9b87b1b709a91a397e9"></a>
uint16_t&#160;</td><td class="memItemRight" valign="bottom"><b>getMax</b> () const</td></tr>
<tr class="separator:a6f1fbf56ed9dc9b87b1b709a91a397e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6729f8db8e00f95637008fa26dd9be2c"><td class="memItemLeft" align="right" valign="top"><a id="a6729f8db8e00f95637008fa26dd9be2c"></a>
uint16_t&#160;</td><td class="memItemRight" valign="bottom"><b>getMin</b> () const</td></tr>
<tr class="separator:a6729f8db8e00f95637008fa26dd9be2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3ae11745d54cc603a9c66fd18aa631be"><td class="memItemLeft" align="right" valign="top"><a id="a3ae11745d54cc603a9c66fd18aa631be"></a>
uint16_t&#160;</td><td class="memItemRight" valign="bottom"><b>getAvg</b> () const</td></tr>
<tr class="separator:a3ae11745d54cc603a9c66fd18aa631be"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a04c9dbea755eafeed3bb7872d7fb0d24"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1TimingStats.html#a04c9dbea755eafeed3bb7872d7fb0d24">getExpDecayAvg</a> () const</td></tr>
<tr class="memdesc:a04c9dbea755eafeed3bb7872d7fb0d24"><td class="mdescLeft">&#160;</td><td class="mdescRight">An exponential decay average. <a href="#a04c9dbea755eafeed3bb7872d7fb0d24">More...</a><br /></td></tr>
<tr class="separator:a04c9dbea755eafeed3bb7872d7fb0d24"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad23641b3302acb7050317c8749febe3d"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1TimingStats.html#ad23641b3302acb7050317c8749febe3d">getCount</a> () const</td></tr>
<tr class="memdesc:ad23641b3302acb7050317c8749febe3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of times update() was called since last reset. <a href="#ad23641b3302acb7050317c8749febe3d">More...</a><br /></td></tr>
<tr class="separator:ad23641b3302acb7050317c8749febe3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a3eab5a6a7a43e1a565d91faf14b148b2"><td class="memItemLeft" align="right" valign="top">uint16_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classace__button_1_1TimingStats.html#a3eab5a6a7a43e1a565d91faf14b148b2">getCounter</a> () const</td></tr>
<tr class="memdesc:a3eab5a6a7a43e1a565d91faf14b148b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Number of times update() was called from the beginning of time. <a href="#a3eab5a6a7a43e1a565d91faf14b148b2">More...</a><br /></td></tr>
<tr class="separator:a3eab5a6a7a43e1a565d91faf14b148b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a10d5cf8bd11da5e1d07ddc256b97a2ce"><td class="memItemLeft" align="right" valign="top"><a id="a10d5cf8bd11da5e1d07ddc256b97a2ce"></a>
void&#160;</td><td class="memItemRight" valign="bottom"><b>update</b> (uint16_t duration)</td></tr>
<tr class="separator:a10d5cf8bd11da5e1d07ddc256b97a2ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock">
<p class="definition">Definition at line <a class="el" href="TimingStats_8h_source.html#l00032">32</a> of file <a class="el" href="TimingStats_8h_source.html">TimingStats.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="ad763ef53d333dd86964acd7b5458491b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad763ef53d333dd86964acd7b5458491b">&#9670;&nbsp;</a></span>TimingStats()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">ace_button::TimingStats::TimingStats </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Constructor. </p>
<p>Default copy-constructor and assignment operator ok. </p>
<p class="definition">Definition at line <a class="el" href="TimingStats_8h_source.html#l00035">35</a> of file <a class="el" href="TimingStats_8h_source.html">TimingStats.h</a>.</p>
</div>
</div>
<h2 class="groupheader">Member Function Documentation</h2>
<a id="ad23641b3302acb7050317c8749febe3d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad23641b3302acb7050317c8749febe3d">&#9670;&nbsp;</a></span>getCount()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint16_t ace_button::TimingStats::getCount </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Number of times update() was called since last reset. </p>
<p class="definition">Definition at line <a class="el" href="TimingStats_8h_source.html#l00057">57</a> of file <a class="el" href="TimingStats_8h_source.html">TimingStats.h</a>.</p>
</div>
</div>
<a id="a3eab5a6a7a43e1a565d91faf14b148b2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a3eab5a6a7a43e1a565d91faf14b148b2">&#9670;&nbsp;</a></span>getCounter()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint16_t ace_button::TimingStats::getCounter </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Number of times update() was called from the beginning of time. </p>
<p>Never reset. This is useful to determining how many times update() was called since it was last checked from the client code. </p>
<p class="definition">Definition at line <a class="el" href="TimingStats_8h_source.html#l00064">64</a> of file <a class="el" href="TimingStats_8h_source.html">TimingStats.h</a>.</p>
</div>
</div>
<a id="a04c9dbea755eafeed3bb7872d7fb0d24"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a04c9dbea755eafeed3bb7872d7fb0d24">&#9670;&nbsp;</a></span>getExpDecayAvg()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">uint16_t ace_button::TimingStats::getExpDecayAvg </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td> const</td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>An exponential decay average. </p>
<p class="definition">Definition at line <a class="el" href="TimingStats_8h_source.html#l00054">54</a> of file <a class="el" href="TimingStats_8h_source.html">TimingStats.h</a>.</p>
</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li>/home/brian/dev/AceButton/src/ace_button/<a class="el" href="TimingStats_8h_source.html">TimingStats.h</a></li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,87 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Class Index</div> </div>
</div><!--header-->
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a></div>
<table class="classindex">
<tr><td rowspan="2" valign="bottom"><a name="letter_a"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;a&#160;&#160;</div></td></tr></table>
</td><td valign="top"><a class="el" href="classace__button_1_1AdjustableButtonConfig.html">AdjustableButtonConfig</a> (ace_button)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_t"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;t&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td rowspan="2" valign="bottom"><a name="letter_b"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;b&#160;&#160;</div></td></tr></table>
</td><td></td></tr>
<tr><td valign="top"><a class="el" href="classace__button_1_1AceButton.html">AceButton</a> (ace_button)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classace__button_1_1TimingStats.html">TimingStats</a> (ace_button)&#160;&#160;&#160;</td><td></td></tr>
<tr><td></td><td valign="top"><a class="el" href="classace__button_1_1ButtonConfig.html">ButtonConfig</a> (ace_button)&#160;&#160;&#160;</td><td></td><td></td></tr>
<tr><td></td><td></td><td></td><td></td></tr>
</table>
<div class="qindex"><a class="qindex" href="#letter_a">a</a>&#160;|&#160;<a class="qindex" href="#letter_b">b</a>&#160;|&#160;<a class="qindex" href="#letter_t">t</a></div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

View file

@ -0,0 +1,83 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: /home/brian/dev/AceButton/src Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">src Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
Directories</h2></td></tr>
</table>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,79 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: /home/brian/dev/AceButton/src/ace_button Directory Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_ebbe9b537c0e01d975153fa119b09658.html">ace_button</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="headertitle">
<div class="title">ace_button Directory Reference</div> </div>
</div><!--header-->
<div class="contents">
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 B

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,104 @@
function toggleVisibility(linkObj)
{
var base = $(linkObj).attr('id');
var summary = $('#'+base+'-summary');
var content = $('#'+base+'-content');
var trigger = $('#'+base+'-trigger');
var src=$(trigger).attr('src');
if (content.is(':visible')===true) {
content.hide();
summary.show();
$(linkObj).addClass('closed').removeClass('opened');
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
content.show();
summary.hide();
$(linkObj).removeClass('closed').addClass('opened');
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
}
return false;
}
function updateStripes()
{
$('table.directory tr').
removeClass('even').filter(':visible:even').addClass('even');
}
function toggleLevel(level)
{
$('table.directory tr').each(function() {
var l = this.id.split('_').length-1;
var i = $('#img'+this.id.substring(3));
var a = $('#arr'+this.id.substring(3));
if (l<level+1) {
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
a.html('&#9660;');
$(this).show();
} else if (l==level+1) {
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
a.html('&#9658;');
$(this).show();
} else {
$(this).hide();
}
});
updateStripes();
}
function toggleFolder(id)
{
// the clicked row
var currentRow = $('#row_'+id);
// all rows after the clicked row
var rows = currentRow.nextAll("tr");
var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
// only match elements AFTER this one (can't hide elements before)
var childRows = rows.filter(function() { return this.id.match(re); });
// first row is visible we are HIDING
if (childRows.filter(':first').is(':visible')===true) {
// replace down arrow by right arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
currentRowSpans.filter(".arrow").html('&#9658;');
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
} else { // we are SHOWING
// replace right arrow by down arrow for current row
var currentRowSpans = currentRow.find("span");
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
currentRowSpans.filter(".arrow").html('&#9660;');
// replace down arrows by right arrows for child rows
var childRowsSpans = childRows.find("span");
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
childRowsSpans.filter(".arrow").html('&#9658;');
childRows.show(); //show all children
}
updateStripes();
}
function toggleInherit(id)
{
var rows = $('tr.inherit.'+id);
var img = $('tr.inherit_header.'+id+' img');
var src = $(img).attr('src');
if (rows.filter(':first').is(':visible')===true) {
rows.css('display','none');
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
} else {
rows.css('display','table-row'); // using show() causes jump in firefox
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
}
}
$(document).ready(function() {
$('.code,.codeRef').each(function() {
$(this).data('powertip',$('#'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html());
$(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true });
});
});

View file

@ -0,0 +1,90 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9660;</span><span id="img_0_0_" class="iconfopen" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_ebbe9b537c0e01d975153fa119b09658.html" target="_self">ace_button</a></td><td class="desc"></td></tr>
<tr id="row_0_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="AceButton_8cpp_source.html"><span class="icondoc"></span></a><b>AceButton.cpp</b></td><td class="desc"></td></tr>
<tr id="row_0_0_1_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ace__button_2AceButton_8h_source.html"><span class="icondoc"></span></a><b>AceButton.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_2_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ace__button_2AdjustableButtonConfig_8h_source.html"><span class="icondoc"></span></a><b>AdjustableButtonConfig.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_3_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ButtonConfig_8cpp_source.html"><span class="icondoc"></span></a><b>ButtonConfig.cpp</b></td><td class="desc"></td></tr>
<tr id="row_0_0_4_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="ace__button_2ButtonConfig_8h_source.html"><span class="icondoc"></span></a><b>ButtonConfig.h</b></td><td class="desc"></td></tr>
<tr id="row_0_0_5_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="TimingStats_8h_source.html"><span class="icondoc"></span></a><b>TimingStats.h</b></td><td class="desc"></td></tr>
<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="AceButton_8h_source.html"><span class="icondoc"></span></a><b>AceButton.h</b></td><td class="desc"></td></tr>
<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="AdjustableButtonConfig_8h_source.html"><span class="icondoc"></span></a><b>AdjustableButtonConfig.h</b></td><td class="desc"></td></tr>
<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ButtonConfig_8h_source.html"><span class="icondoc"></span></a><b>ButtonConfig.h</b></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

View file

@ -0,0 +1,309 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class Members</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="contents">
<div class="textblock">Here is a list of all documented class members with links to the class documentation for each member:</div>
<h3><a id="index_a"></a>- a -</h3><ul>
<li>AceButton()
: <a class="el" href="classace__button_1_1AceButton.html#a3c480636223edc899a79c821c32c6982">ace_button::AceButton</a>
</li>
</ul>
<h3><a id="index_b"></a>- b -</h3><ul>
<li>ButtonConfig()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_c"></a>- c -</h3><ul>
<li>check()
: <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1">ace_button::AceButton</a>
</li>
<li>clearFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_e"></a>- e -</h3><ul>
<li>EventHandler
: <a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_f"></a>- f -</h3><ul>
<li>FeatureFlagType
: <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_g"></a>- g -</h3><ul>
<li>getButtonConfig()
: <a class="el" href="classace__button_1_1AceButton.html#a5e4ea4aca852a5e0b1d426bccb131cfb">ace_button::AceButton</a>
</li>
<li>getClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">ace_button::ButtonConfig</a>
</li>
<li>getClock()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">ace_button::ButtonConfig</a>
</li>
<li>getClockMicros()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">ace_button::ButtonConfig</a>
</li>
<li>getCount()
: <a class="el" href="classace__button_1_1TimingStats.html#ad23641b3302acb7050317c8749febe3d">ace_button::TimingStats</a>
</li>
<li>getCounter()
: <a class="el" href="classace__button_1_1TimingStats.html#a3eab5a6a7a43e1a565d91faf14b148b2">ace_button::TimingStats</a>
</li>
<li>getDebounceDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">ace_button::ButtonConfig</a>
</li>
<li>getDefaultReleasedState()
: <a class="el" href="classace__button_1_1AceButton.html#afa8013bb98f5fbd79654aebca613ba71">ace_button::AceButton</a>
</li>
<li>getDoubleClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6">ace_button::ButtonConfig</a>
</li>
<li>getEventHandler()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">ace_button::ButtonConfig</a>
</li>
<li>getExpDecayAvg()
: <a class="el" href="classace__button_1_1TimingStats.html#a04c9dbea755eafeed3bb7872d7fb0d24">ace_button::TimingStats</a>
</li>
<li>getId()
: <a class="el" href="classace__button_1_1AceButton.html#a4a693b836e3fed29d4e7203a5a97910b">ace_button::AceButton</a>
</li>
<li>getLastButtonState()
: <a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca">ace_button::AceButton</a>
</li>
<li>getLongPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">ace_button::ButtonConfig</a>
</li>
<li>getPin()
: <a class="el" href="classace__button_1_1AceButton.html#ac6b12ca62c7c055325bfebd036579ed6">ace_button::AceButton</a>
</li>
<li>getRepeatPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">ace_button::ButtonConfig</a>
</li>
<li>getRepeatPressInterval()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43">ace_button::ButtonConfig</a>
</li>
<li>getSystemButtonConfig()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ab780f081ef691b48deb5182d206a4b9d">ace_button::ButtonConfig</a>
</li>
<li>getTimingStats()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_i"></a>- i -</h3><ul>
<li>init()
: <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34">ace_button::AceButton</a>
, <a class="el" href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">ace_button::ButtonConfig</a>
</li>
<li>isFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">ace_button::ButtonConfig</a>
</li>
<li>isPressedRaw()
: <a class="el" href="classace__button_1_1AceButton.html#af80a2bd19d929bff5dcce54a3db6fb0a">ace_button::AceButton</a>
</li>
<li>isReleased()
: <a class="el" href="classace__button_1_1AceButton.html#aa3cbb3fb16076cfe9255e0f70cc6aa72">ace_button::AceButton</a>
</li>
</ul>
<h3><a id="index_k"></a>- k -</h3><ul>
<li>kButtonStateUnknown
: <a class="el" href="classace__button_1_1AceButton.html#afe8e8e22146f510afa487e6ec98b6253">ace_button::AceButton</a>
</li>
<li>kClickDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">ace_button::ButtonConfig</a>
</li>
<li>kDebounceDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">ace_button::ButtonConfig</a>
</li>
<li>kDoubleClickDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">ace_button::ButtonConfig</a>
</li>
<li>kEventClicked
: <a class="el" href="classace__button_1_1AceButton.html#a21797e5e069da3f7bba42b40ab3a7305">ace_button::AceButton</a>
</li>
<li>kEventDoubleClicked
: <a class="el" href="classace__button_1_1AceButton.html#a0c63f30106e4688425ba37d8f7a9546b">ace_button::AceButton</a>
</li>
<li>kEventLongPressed
: <a class="el" href="classace__button_1_1AceButton.html#a769599d288f64dc0e55a69184596d804">ace_button::AceButton</a>
</li>
<li>kEventPressed
: <a class="el" href="classace__button_1_1AceButton.html#ae723d826fe219a8415764b9fed5d8976">ace_button::AceButton</a>
</li>
<li>kEventReleased
: <a class="el" href="classace__button_1_1AceButton.html#ada5bd7c31950e2acdb8a9464e795c13c">ace_button::AceButton</a>
</li>
<li>kEventRepeatPressed
: <a class="el" href="classace__button_1_1AceButton.html#a9c4195cb128da40677ea223eb81743c9">ace_button::AceButton</a>
</li>
<li>kFeatureClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">ace_button::ButtonConfig</a>
</li>
<li>kFeatureDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">ace_button::ButtonConfig</a>
</li>
<li>kFeatureLongPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">ace_button::ButtonConfig</a>
</li>
<li>kFeatureRepeatPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterLongPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterRepeatPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAll
: <a class="el" href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressClickBeforeDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">ace_button::ButtonConfig</a>
</li>
<li>kLongPressDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">ace_button::ButtonConfig</a>
</li>
<li>kRepeatPressDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">ace_button::ButtonConfig</a>
</li>
<li>kRepeatPressInterval
: <a class="el" href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_r"></a>- r -</h3><ul>
<li>readButton()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_s"></a>- s -</h3><ul>
<li>setButtonConfig()
: <a class="el" href="classace__button_1_1AceButton.html#abc9d705d1ca4341cf6f9434962b5b5e7">ace_button::AceButton</a>
</li>
<li>setClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">ace_button::ButtonConfig</a>
</li>
<li>setDebounceDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">ace_button::ButtonConfig</a>
</li>
<li>setDoubleClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">ace_button::ButtonConfig</a>
</li>
<li>setEventHandler()
: <a class="el" href="classace__button_1_1AceButton.html#a42edbfeb4091c867d976a4d24622f19c">ace_button::AceButton</a>
, <a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">ace_button::ButtonConfig</a>
</li>
<li>setFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">ace_button::ButtonConfig</a>
</li>
<li>setLongPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">ace_button::ButtonConfig</a>
</li>
<li>setRepeatPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">ace_button::ButtonConfig</a>
</li>
<li>setRepeatPressInterval()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">ace_button::ButtonConfig</a>
</li>
<li>setTimingStats()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_t"></a>- t -</h3><ul>
<li>TimingStats()
: <a class="el" href="classace__button_1_1TimingStats.html#ad763ef53d333dd86964acd7b5458491b">ace_button::TimingStats</a>
</li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,222 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class Members - Functions</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="contents">
&#160;
<h3><a id="index_a"></a>- a -</h3><ul>
<li>AceButton()
: <a class="el" href="classace__button_1_1AceButton.html#a3c480636223edc899a79c821c32c6982">ace_button::AceButton</a>
</li>
</ul>
<h3><a id="index_b"></a>- b -</h3><ul>
<li>ButtonConfig()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a66924aac157a81cc54a9776fb975893a">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_c"></a>- c -</h3><ul>
<li>check()
: <a class="el" href="classace__button_1_1AceButton.html#af710048a654fa5d5e45405661282a7b1">ace_button::AceButton</a>
</li>
<li>clearFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac782903e4a60924db3d17c00accc7f3b">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_g"></a>- g -</h3><ul>
<li>getButtonConfig()
: <a class="el" href="classace__button_1_1AceButton.html#a5e4ea4aca852a5e0b1d426bccb131cfb">ace_button::AceButton</a>
</li>
<li>getClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a19db203ce87dc2cafb2cab6ba124387a">ace_button::ButtonConfig</a>
</li>
<li>getClock()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a440271e22d5e7e161cdcb3b73f092111">ace_button::ButtonConfig</a>
</li>
<li>getClockMicros()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8a74d1a1c082bfb0e4ddf55e67d3ac2d">ace_button::ButtonConfig</a>
</li>
<li>getCount()
: <a class="el" href="classace__button_1_1TimingStats.html#ad23641b3302acb7050317c8749febe3d">ace_button::TimingStats</a>
</li>
<li>getCounter()
: <a class="el" href="classace__button_1_1TimingStats.html#a3eab5a6a7a43e1a565d91faf14b148b2">ace_button::TimingStats</a>
</li>
<li>getDebounceDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ad7be58d0fe0b242f78f15319d201a565">ace_button::ButtonConfig</a>
</li>
<li>getDefaultReleasedState()
: <a class="el" href="classace__button_1_1AceButton.html#afa8013bb98f5fbd79654aebca613ba71">ace_button::AceButton</a>
</li>
<li>getDoubleClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5ba500367e03c36f39225a5858e110e6">ace_button::ButtonConfig</a>
</li>
<li>getEventHandler()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8fc32804ba102f61ba97bcc5f4fe8448">ace_button::ButtonConfig</a>
</li>
<li>getExpDecayAvg()
: <a class="el" href="classace__button_1_1TimingStats.html#a04c9dbea755eafeed3bb7872d7fb0d24">ace_button::TimingStats</a>
</li>
<li>getId()
: <a class="el" href="classace__button_1_1AceButton.html#a4a693b836e3fed29d4e7203a5a97910b">ace_button::AceButton</a>
</li>
<li>getLastButtonState()
: <a class="el" href="classace__button_1_1AceButton.html#a3c49e9edf8cbb5e3800c5f4506d0beca">ace_button::AceButton</a>
</li>
<li>getLongPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a46d4213a827a94bf82ba99a9c2e59531">ace_button::ButtonConfig</a>
</li>
<li>getPin()
: <a class="el" href="classace__button_1_1AceButton.html#ac6b12ca62c7c055325bfebd036579ed6">ace_button::AceButton</a>
</li>
<li>getRepeatPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ad85c75d2a2dd200552a181fb154d5fd2">ace_button::ButtonConfig</a>
</li>
<li>getRepeatPressInterval()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aec4a97a1a1306b9ff12f1cdf44515c43">ace_button::ButtonConfig</a>
</li>
<li>getSystemButtonConfig()
: <a class="el" href="classace__button_1_1ButtonConfig.html#ab780f081ef691b48deb5182d206a4b9d">ace_button::ButtonConfig</a>
</li>
<li>getTimingStats()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aff7101f2fe0f0c3bba67924b01e9d493">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_i"></a>- i -</h3><ul>
<li>init()
: <a class="el" href="classace__button_1_1AceButton.html#a18c47304c694c6f084a343a7c83bef34">ace_button::AceButton</a>
, <a class="el" href="classace__button_1_1ButtonConfig.html#a86f8f6b62825258e477e0a41846e0223">ace_button::ButtonConfig</a>
</li>
<li>isFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aae51c7a2986eafd400784cdbe6bb1815">ace_button::ButtonConfig</a>
</li>
<li>isPressedRaw()
: <a class="el" href="classace__button_1_1AceButton.html#af80a2bd19d929bff5dcce54a3db6fb0a">ace_button::AceButton</a>
</li>
<li>isReleased()
: <a class="el" href="classace__button_1_1AceButton.html#aa3cbb3fb16076cfe9255e0f70cc6aa72">ace_button::AceButton</a>
</li>
</ul>
<h3><a id="index_r"></a>- r -</h3><ul>
<li>readButton()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5dab877bf124bfdf5a5eb703ca123027">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_s"></a>- s -</h3><ul>
<li>setButtonConfig()
: <a class="el" href="classace__button_1_1AceButton.html#abc9d705d1ca4341cf6f9434962b5b5e7">ace_button::AceButton</a>
</li>
<li>setClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aef65e12128997c46bc2754a988b98f14">ace_button::ButtonConfig</a>
</li>
<li>setDebounceDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a9860d2c8a6ab33d40ea126b02d168cab">ace_button::ButtonConfig</a>
</li>
<li>setDoubleClickDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a367a809017e1d633a5cf6b117981d579">ace_button::ButtonConfig</a>
</li>
<li>setEventHandler()
: <a class="el" href="classace__button_1_1AceButton.html#a42edbfeb4091c867d976a4d24622f19c">ace_button::AceButton</a>
, <a class="el" href="classace__button_1_1ButtonConfig.html#a5d228f08e9943fd4ab90caab39ef80be">ace_button::ButtonConfig</a>
</li>
<li>setFeature()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aac1c9029b1cf9aa793060d372fc09a1a">ace_button::ButtonConfig</a>
</li>
<li>setLongPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a7d90d39aeddacb5abc9d8741611d7c4a">ace_button::ButtonConfig</a>
</li>
<li>setRepeatPressDelay()
: <a class="el" href="classace__button_1_1ButtonConfig.html#af813c969eddd884e9fa83b334a59a0a5">ace_button::ButtonConfig</a>
</li>
<li>setRepeatPressInterval()
: <a class="el" href="classace__button_1_1ButtonConfig.html#aa1b1217e0042512fc8d9b6544536aed3">ace_button::ButtonConfig</a>
</li>
<li>setTimingStats()
: <a class="el" href="classace__button_1_1ButtonConfig.html#a16d7dbbe1bb075018378e463cd8106de">ace_button::ButtonConfig</a>
</li>
</ul>
<h3><a id="index_t"></a>- t -</h3><ul>
<li>TimingStats()
: <a class="el" href="classace__button_1_1TimingStats.html#ad763ef53d333dd86964acd7b5458491b">ace_button::TimingStats</a>
</li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,79 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class Members - Typedefs</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="contents">
&#160;<ul>
<li>EventHandler
: <a class="el" href="classace__button_1_1ButtonConfig.html#a6d9db3c7b221b474c3cfd8fca5f4ba1e">ace_button::ButtonConfig</a>
</li>
<li>FeatureFlagType
: <a class="el" href="classace__button_1_1ButtonConfig.html#a1c7c7bfc42738278330243dfc43f23eb">ace_button::ButtonConfig</a>
</li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,142 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Class Members - Variables</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="contents">
&#160;<ul>
<li>kButtonStateUnknown
: <a class="el" href="classace__button_1_1AceButton.html#afe8e8e22146f510afa487e6ec98b6253">ace_button::AceButton</a>
</li>
<li>kClickDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a5691e38564dae63592d22abf74fb15f3">ace_button::ButtonConfig</a>
</li>
<li>kDebounceDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a8fbe63588107a1375d05911d27df3ad8">ace_button::ButtonConfig</a>
</li>
<li>kDoubleClickDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#af0a0d503f3396acef6a84aca4390fd6a">ace_button::ButtonConfig</a>
</li>
<li>kEventClicked
: <a class="el" href="classace__button_1_1AceButton.html#a21797e5e069da3f7bba42b40ab3a7305">ace_button::AceButton</a>
</li>
<li>kEventDoubleClicked
: <a class="el" href="classace__button_1_1AceButton.html#a0c63f30106e4688425ba37d8f7a9546b">ace_button::AceButton</a>
</li>
<li>kEventLongPressed
: <a class="el" href="classace__button_1_1AceButton.html#a769599d288f64dc0e55a69184596d804">ace_button::AceButton</a>
</li>
<li>kEventPressed
: <a class="el" href="classace__button_1_1AceButton.html#ae723d826fe219a8415764b9fed5d8976">ace_button::AceButton</a>
</li>
<li>kEventReleased
: <a class="el" href="classace__button_1_1AceButton.html#ada5bd7c31950e2acdb8a9464e795c13c">ace_button::AceButton</a>
</li>
<li>kEventRepeatPressed
: <a class="el" href="classace__button_1_1AceButton.html#a9c4195cb128da40677ea223eb81743c9">ace_button::AceButton</a>
</li>
<li>kFeatureClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac662555100416c4843c6ee5156699c56">ace_button::ButtonConfig</a>
</li>
<li>kFeatureDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a638943c127dd60288a83e83260825d01">ace_button::ButtonConfig</a>
</li>
<li>kFeatureLongPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a4d175560047a4ca245186fb26fa413f2">ace_button::ButtonConfig</a>
</li>
<li>kFeatureRepeatPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#ac9b941ca87f0eeb899ed503481439c92">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a57327066d135bcc99c4a68b55fca162e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a7642e16b2cc8dd0136312054b1da8f9e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterLongPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a15b8e90b1ffe01009a1d7dd18b5b6aae">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAfterRepeatPress
: <a class="el" href="classace__button_1_1ButtonConfig.html#a6b43b591ba53d360e787bf780af0abbc">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressAll
: <a class="el" href="classace__button_1_1ButtonConfig.html#abfd736234ae852f22894c7aceb4e534e">ace_button::ButtonConfig</a>
</li>
<li>kFeatureSuppressClickBeforeDoubleClick
: <a class="el" href="classace__button_1_1ButtonConfig.html#a80d621dbcf533c9bb91a111b8fec2c53">ace_button::ButtonConfig</a>
</li>
<li>kLongPressDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a60bf588a2c067a561887eadf18cedccd">ace_button::ButtonConfig</a>
</li>
<li>kRepeatPressDelay
: <a class="el" href="classace__button_1_1ButtonConfig.html#a3d20bc5800532085fd046fc64b80ae9f">ace_button::ButtonConfig</a>
</li>
<li>kRepeatPressInterval
: <a class="el" href="classace__button_1_1ButtonConfig.html#a218c1aa09b45ea2fe6884e3af3a18310">ace_button::ButtonConfig</a>
</li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1,104 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>AceButton: Graph Legend</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">AceButton
&#160;<span id="projectnumber">1.3.3</span>
</div>
<div id="projectbrief">An adjustable, compact, event-driven button library for Arduino.</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Graph Legend</div> </div>
</div><!--header-->
<div class="contents">
<p>This page explains how to interpret the graphs that are generated by doxygen.</p>
<p>Consider the following example: </p><div class="fragment"><div class="line">/*! Invisible class because of truncation */</div><div class="line">class Invisible { };</div><div class="line"></div><div class="line">/*! Truncated class, inheritance relation is hidden */</div><div class="line">class Truncated : public Invisible { };</div><div class="line"></div><div class="line">/* Class not documented with doxygen comments */</div><div class="line">class Undocumented { };</div><div class="line"></div><div class="line">/*! Class that is inherited using public inheritance */</div><div class="line">class PublicBase : public Truncated { };</div><div class="line"></div><div class="line">/*! A template class */</div><div class="line">template&lt;class T&gt; class Templ { };</div><div class="line"></div><div class="line">/*! Class that is inherited using protected inheritance */</div><div class="line">class ProtectedBase { };</div><div class="line"></div><div class="line">/*! Class that is inherited using private inheritance */</div><div class="line">class PrivateBase { };</div><div class="line"></div><div class="line">/*! Class that is used by the Inherited class */</div><div class="line">class Used { };</div><div class="line"></div><div class="line">/*! Super class that inherits a number of other classes */</div><div class="line">class Inherited : public PublicBase,</div><div class="line"> protected ProtectedBase,</div><div class="line"> private PrivateBase,</div><div class="line"> public Undocumented,</div><div class="line"> public Templ&lt;int&gt;</div><div class="line">{</div><div class="line"> private:</div><div class="line"> Used *m_usedClass;</div><div class="line">};</div></div><!-- fragment --><p> This will result in the following graph:</p>
<center><div class="image">
<img src="graph_legend.png"/>
</div>
</center><p>The boxes in the above graph have the following meaning: </p>
<ul>
<li>
A filled gray box represents the struct or class for which the graph is generated. </li>
<li>
A box with a black border denotes a documented struct or class. </li>
<li>
A box with a gray border denotes an undocumented struct or class. </li>
<li>
A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries. </li>
</ul>
<p>The arrows have the following meaning: </p>
<ul>
<li>
A dark blue arrow is used to visualize a public inheritance relation between two classes. </li>
<li>
A dark green arrow is used for protected inheritance. </li>
<li>
A dark red arrow is used for private inheritance. </li>
<li>
A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible. </li>
<li>
A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance. </li>
</ul>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>

View file

@ -0,0 +1 @@
387ff8eb65306fa251338d3c9bd7bfff

Some files were not shown because too many files have changed in this diff Show more