mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-21 05:46:15 +00:00
Compare commits
61 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
968adc2ec0 | ||
|
|
f1b01f4318 | ||
|
|
af837c6b21 | ||
|
|
a59d413e3d | ||
|
|
387f92ba49 | ||
|
|
f3f49d3318 | ||
|
|
89fd7dae70 | ||
|
|
ad7128544a | ||
|
|
1f6e4d6a2e | ||
|
|
05cc3e683c | ||
|
|
c0dda82685 | ||
|
|
0d398731b2 | ||
|
|
e72008adf6 | ||
|
|
2d1b0f4737 | ||
|
|
bb0323bd7c | ||
|
|
b26b64f871 | ||
|
|
13df9e5632 | ||
|
|
a9385b92d8 | ||
|
|
5bd251fa22 | ||
|
|
8a767328df | ||
|
|
1a05ac08a5 | ||
|
|
b27398de74 | ||
|
|
76e23159f2 | ||
|
|
75960b95f6 | ||
|
|
9bf00849b3 | ||
|
|
ec5a82bd93 | ||
|
|
d28b6f985c | ||
|
|
2343bee2fa | ||
|
|
e5dc3e108e | ||
|
|
de3d723574 | ||
|
|
978284d55f | ||
|
|
e6b839c34f | ||
|
|
bb1470a029 | ||
|
|
f9a41c99c8 | ||
|
|
bc15ded405 | ||
|
|
38c1e017a2 | ||
|
|
d5658f4488 | ||
|
|
e7e5465b74 | ||
|
|
44f801d55c | ||
|
|
92c7f00138 | ||
|
|
d0f1d0d33d | ||
|
|
34e5cd87ca | ||
|
|
d064c7dd5b | ||
|
|
33c2e36033 | ||
|
|
b8ef1c3e92 | ||
|
|
f04b014da5 | ||
|
|
fa2f5f9352 | ||
|
|
864ed3ad4d | ||
|
|
fc96667673 | ||
|
|
7d30c2ff78 | ||
|
|
ebbefa835f | ||
|
|
fba0ee0ae5 | ||
|
|
0221081f25 | ||
|
|
cf7b49389c | ||
|
|
3aebf42ca8 | ||
|
|
0486c4f25a | ||
|
|
25de5b79d6 | ||
|
|
17628525af | ||
|
|
cb01593db0 | ||
|
|
9e2c41230c | ||
|
|
3bdc6a65a6 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
*.un~
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
*.sublime-workspace
|
||||
*.DS_Store
|
||||
22
.travis.yml
22
.travis.yml
@@ -1,22 +0,0 @@
|
||||
language: python
|
||||
python:
|
||||
- "2.7"
|
||||
|
||||
env:
|
||||
- PLATFORMIO_CI_SRC=examples/AiwaRCT501SendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_AIWA_RC_T501"
|
||||
- PLATFORMIO_CI_SRC=examples/IRrecord PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||
- PLATFORMIO_CI_SRC=examples/IRrecvDemo
|
||||
- PLATFORMIO_CI_SRC=examples/IRrecvDump
|
||||
- PLATFORMIO_CI_SRC=examples/IRrecvDumpV2
|
||||
- PLATFORMIO_CI_SRC=examples/IRrelay
|
||||
- PLATFORMIO_CI_SRC=examples/IRsendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_SONY"
|
||||
- PLATFORMIO_CI_SRC=examples/IRtest PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||
- PLATFORMIO_CI_SRC=examples/IRtest2 PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||
- PLATFORMIO_CI_SRC=examples/JVCPanasonicSendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_JVC -DSEND_PANASONIC"
|
||||
- PLATFORMIO_CI_SRC=examples/IRremoteInfo
|
||||
|
||||
install:
|
||||
- python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
|
||||
|
||||
script:
|
||||
- platformio ci --lib="." --board=uno --board=leonardo --board=pro16MHzatmega168
|
||||
11
Contributing.md
Normal file
11
Contributing.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Contribution Guidlines
|
||||
|
||||
This library is the culmination of the expertise of many members of the open source community who have dedicated their time and hard work. The best way to ask for help or propose a new idea is to [create a new issue](https://github.com/z3t0/Arduino-IRremote/issues/new) while creating a Pull Request with your code changes allows you to share your own innovations with the rest of the community.
|
||||
|
||||
The following are some guidelines to observe when creating issues or PRs:
|
||||
- Be friendly; it is important that we can all enjoy a safe space as we are all working on the same project and it is okay for people to have different ideas
|
||||
- [Use code blocks](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#code); it helps us help you when we can read your code! On that note also refrain from pasting more than 30 lines of code in a post, instead [create a gist](https://gist.github.com/) if you need to share large snippets
|
||||
- Use reasonable titles; refrain from using overly long or capitalized titles as they are usually annoying and do little to encourage others to help :smile:
|
||||
- Be detailed; refrain from mentioning code problems without sharing your source code and always give information regarding your board and version of the library
|
||||
|
||||
If there is any need to contact me then you can find my email on the README, I do not mind responding to emails but it would be in your own interests to create issues if you need help with the library as responses would be from a larger community with greater knowledge!
|
||||
@@ -1,5 +1,5 @@
|
||||
## Contributors
|
||||
These are the active contributors of this project that you may contact if there is anything you need help with or if you have suggestions.
|
||||
These are the active contributors of this project that you may contact if there is anything you need help with or if you have suggestions.
|
||||
|
||||
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
||||
* Email: zetoslab@gmail.com
|
||||
@@ -15,7 +15,7 @@ These are the active contributors of this project that you may contact if there
|
||||
- [Sebazzz](https://github.com/sebazz): Contributor
|
||||
- [lumbric](https://github.com/lumbric): Contributor
|
||||
- [ElectricRCAircraftGuy](https://github.com/electricrcaircraftguy): Active Contributor
|
||||
- [henkel](https://github.com/henkel): Contributor
|
||||
- [MCUdude](https://github.com/MCUdude): Contributor
|
||||
|
||||
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
||||
|
||||
|
||||
|
||||
14
IRremote.h
14
IRremote.h
@@ -56,7 +56,7 @@
|
||||
#define SEND_AIWA_RC_T501 1
|
||||
|
||||
#define DECODE_LG 1
|
||||
#define SEND_LG 1
|
||||
#define SEND_LG 1
|
||||
|
||||
#define DECODE_SANYO 1
|
||||
#define SEND_SANYO 0 // NOT WRITTEN
|
||||
@@ -76,6 +76,9 @@
|
||||
#define DECODE_PRONTO 0 // This function doe not logically make sense
|
||||
#define SEND_PRONTO 1
|
||||
|
||||
#define DECODE_LEGO_PF 0 // NOT WRITTEN
|
||||
#define SEND_LEGO_PF 1
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// When sending a Pronto code we request to send either the "once" code
|
||||
// or the "repeat" code
|
||||
@@ -115,6 +118,7 @@ typedef
|
||||
SHARP,
|
||||
DENON,
|
||||
PRONTO,
|
||||
LEGO_PF,
|
||||
}
|
||||
decode_type_t;
|
||||
|
||||
@@ -243,6 +247,10 @@ class IRrecv
|
||||
# if DECODE_DENON
|
||||
bool decodeDenon (decode_results *results) ;
|
||||
# endif
|
||||
//......................................................................
|
||||
# if DECODE_LEGO_PF
|
||||
bool decodeLegoPowerFunctions (decode_results *results) ;
|
||||
# endif
|
||||
} ;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -327,6 +335,10 @@ class IRsend
|
||||
# if SEND_PRONTO
|
||||
void sendPronto (char* code, bool repeat, bool fallback) ;
|
||||
# endif
|
||||
//......................................................................
|
||||
# if SEND_LEGO_PF
|
||||
void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ;
|
||||
# endif
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -171,7 +171,7 @@ EXTERN volatile irparams_t irparams;
|
||||
#define IR_USE_TIMER4_HS // tx = pin 10
|
||||
|
||||
// Teensy 3.0 / Teensy 3.1
|
||||
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
|
||||
#elif defined(__MK20DX128__) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)
|
||||
#define IR_USE_TIMER_CMT // tx = pin 5
|
||||
|
||||
// Teensy-LC
|
||||
@@ -184,13 +184,30 @@ EXTERN volatile irparams_t irparams;
|
||||
#define IR_USE_TIMER2 // tx = pin 1
|
||||
//#define IR_USE_TIMER3 // tx = pin 16
|
||||
|
||||
// Sanguino
|
||||
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||
// MightyCore - ATmega1284
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
||||
//#define IR_USE_TIMER1 // tx = pin 13
|
||||
#define IR_USE_TIMER2 // tx = pin 14
|
||||
//#define IR_USE_TIMER3 // tx = pin 6
|
||||
|
||||
// MightyCore - ATmega164, ATmega324, ATmega644
|
||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__)
|
||||
//#define IR_USE_TIMER1 // tx = pin 13
|
||||
#define IR_USE_TIMER2 // tx = pin 14
|
||||
|
||||
//MegaCore - ATmega64, ATmega128
|
||||
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||
#define IR_USE_TIMER1 // tx = pin 13
|
||||
|
||||
// MightyCore - ATmega8535, ATmega16, ATmega32
|
||||
#elif defined(__AVR_ATmega8535__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__)
|
||||
#define IR_USE_TIMER1 // tx = pin 13
|
||||
|
||||
// Atmega8
|
||||
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
|
||||
#elif defined(__AVR_ATmega8__)
|
||||
#define IR_USE_TIMER1 // tx = pin 9
|
||||
|
||||
// ATtiny84
|
||||
@@ -202,6 +219,7 @@ EXTERN volatile irparams_t irparams;
|
||||
#define IR_USE_TIMER_TINY0 // tx = pin 1
|
||||
|
||||
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
||||
// ATmega48, ATmega88, ATmega168, ATmega328
|
||||
#else
|
||||
//#define IR_USE_TIMER1 // tx = pin 9
|
||||
#define IR_USE_TIMER2 // tx = pin 3
|
||||
@@ -255,11 +273,15 @@ EXTERN volatile irparams_t irparams;
|
||||
# define TIMER_PWM_PIN CORE_OC2B_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 9 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||
# define TIMER_PWM_PIN 14 // Sanguino
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__)
|
||||
# define TIMER_PWM_PIN 14 // MightyCore
|
||||
#else
|
||||
# define TIMER_PWM_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
#endif
|
||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Timer1 (16 bits)
|
||||
@@ -271,7 +293,9 @@ EXTERN volatile irparams_t irparams;
|
||||
#define TIMER_DISABLE_PWM (TCCR1A &= ~(_BV(COM1A1)))
|
||||
|
||||
//-----------------
|
||||
#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
|
||||
#if defined(__AVR_ATmega8__) || defined(__AVR_ATmega8535__) \
|
||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||
# define TIMER_ENABLE_INTR (TIMSK |= _BV(OCIE1A))
|
||||
# define TIMER_DISABLE_INTR (TIMSK &= ~_BV(OCIE1A))
|
||||
#else
|
||||
@@ -302,13 +326,20 @@ EXTERN volatile irparams_t irparams;
|
||||
# define TIMER_PWM_PIN CORE_OC1A_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 11 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||
# define TIMER_PWM_PIN 13 // Sanguino
|
||||
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||
# define TIMER_PWM_PIN 13 // MegaCore
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__)
|
||||
# define TIMER_PWM_PIN 13 // MightyCore
|
||||
#elif defined(__AVR_ATtiny84__)
|
||||
# define TIMER_PWM_PIN 6
|
||||
# define TIMER_PWM_PIN 6
|
||||
#else
|
||||
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||
#endif
|
||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||
|
||||
//---------------------------------------------------------
|
||||
// Timer3 (16 bits)
|
||||
@@ -342,6 +373,8 @@ EXTERN volatile irparams_t irparams;
|
||||
# define TIMER_PWM_PIN CORE_OC3A_PIN // Teensy
|
||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||
# define TIMER_PWM_PIN 5 // Arduino Mega
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
||||
# define TIMER_PWM_PIN 6 // MightyCore
|
||||
#else
|
||||
# error "Please add OC3A pin number here\n"
|
||||
#endif
|
||||
@@ -470,7 +503,7 @@ EXTERN volatile irparams_t irparams;
|
||||
#elif defined(IR_USE_TIMER_CMT)
|
||||
|
||||
#define TIMER_RESET ({ \
|
||||
uint8_t tmp = CMT_MSC; \
|
||||
uint8_t tmp __attribute__((unused)) = CMT_MSC; \
|
||||
CMT_CMD2 = 30; \
|
||||
})
|
||||
|
||||
@@ -493,19 +526,18 @@ EXTERN volatile irparams_t irparams;
|
||||
#define ISR(f) void f(void)
|
||||
|
||||
//-----------------
|
||||
#if (F_BUS == 48000000)
|
||||
# define CMT_PPS_VAL 5
|
||||
#else
|
||||
# define CMT_PPS_VAL 2
|
||||
#define CMT_PPS_DIV ((F_BUS + 7999999) / 8000000)
|
||||
#if F_BUS < 8000000
|
||||
#error IRremote requires at least 8 MHz on Teensy 3.x
|
||||
#endif
|
||||
|
||||
//-----------------
|
||||
#define TIMER_CONFIG_KHZ(val) ({ \
|
||||
SIM_SCGC4 |= SIM_SCGC4_CMT; \
|
||||
SIM_SOPT2 |= SIM_SOPT2_PTD7PAD; \
|
||||
CMT_PPS = CMT_PPS_VAL; \
|
||||
CMT_CGH1 = 2667 / val; \
|
||||
CMT_CGL1 = 5333 / val; \
|
||||
CMT_PPS = CMT_PPS_DIV - 1; \
|
||||
CMT_CGH1 = ((F_BUS / CMT_PPS_DIV / 3000) + ((val)/2)) / (val); \
|
||||
CMT_CGL1 = ((F_BUS / CMT_PPS_DIV / 1500) + ((val)/2)) / (val); \
|
||||
CMT_CMD1 = 0; \
|
||||
CMT_CMD2 = 30; \
|
||||
CMT_CMD3 = 0; \
|
||||
@@ -516,13 +548,13 @@ EXTERN volatile irparams_t irparams;
|
||||
|
||||
#define TIMER_CONFIG_NORMAL() ({ \
|
||||
SIM_SCGC4 |= SIM_SCGC4_CMT; \
|
||||
CMT_PPS = CMT_PPS_VAL; \
|
||||
CMT_PPS = CMT_PPS_DIV - 1; \
|
||||
CMT_CGH1 = 1; \
|
||||
CMT_CGL1 = 1; \
|
||||
CMT_CMD1 = 0; \
|
||||
CMT_CMD2 = 30 \
|
||||
CMT_CMD2 = 30; \
|
||||
CMT_CMD3 = 0; \
|
||||
CMT_CMD4 = 19; \
|
||||
CMT_CMD4 = (F_BUS / 160000 + CMT_PPS_DIV / 2) / CMT_PPS_DIV - 31; \
|
||||
CMT_OC = 0; \
|
||||
CMT_MSC = 0x03; \
|
||||
})
|
||||
|
||||
21
ISSUE_TEMPLATE.md
Normal file
21
ISSUE_TEMPLATE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
**Board:** ARDUINO UNO
|
||||
**Library Version:** 2.1.0
|
||||
**Protocol:** Sony (if any)
|
||||
|
||||
**Code Block:**
|
||||
```c
|
||||
|
||||
#include <IRremote.h>
|
||||
|
||||
.....
|
||||
|
||||
```
|
||||
|
||||
Use [a gist](gist.github.com) if the code exceeds 30 lines
|
||||
|
||||
**checklist:**
|
||||
- [] The latest [release](https://github.com/z3t0/Arduino-IRremote/releases/latest) is used
|
||||
- [] Any code referenced is provided
|
||||
- [] The title of the issue is helpful and relevant
|
||||
|
||||
The above is a short template allowing you to make detailed issues!
|
||||
58
README.md
58
README.md
@@ -1,14 +1,29 @@
|
||||
# IRremote Arduino Library
|
||||
|
||||
[](https://travis-ci.org/z3t0/Arduino-IRremote)
|
||||
# todo
|
||||
|
||||
- [ ] only keep base functions in the library
|
||||
- [ ] move all protocols to examples as sketches
|
||||
- [ ] notation for ir protocols
|
||||
- [ ] update keywords.txt
|
||||
- [ ] write some documentation on library development
|
||||
- [ ] write documentation for library usage
|
||||
- [ ] remove documentation from source code? cleaner code
|
||||
- [ ] write tutorials
|
||||
- [ ] update links (library.properties)
|
||||
- [ ] update travis coverage
|
||||
- [ ] create a rules list for issues and prs
|
||||
- [ ] create guidlines for contributions, line-endings, indentations etc.
|
||||
|
||||
[](https://travis-ci.org/z3t0/Arduino-IRremote)
|
||||
|
||||
[](https://gitter.im/z3t0/Arduino-IRremote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
This library enables you to send and receive using infra-red signals on an Arduino.
|
||||
|
||||
Check [here](http://z3t0.github.io/Arduino-IRremote/) for tutorials and more information.
|
||||
Tutorials and more information will be made available on [the official homepage](http://z3t0.github.io/Arduino-IRremote/).
|
||||
|
||||
## Version - 2.1.0
|
||||
## Version - 3.0.0b
|
||||
|
||||
## Installation
|
||||
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
|
||||
@@ -17,6 +32,39 @@ Check [here](http://z3t0.github.io/Arduino-IRremote/) for tutorials and more inf
|
||||
4. Move the "IRremote" folder that has been extracted to your libraries directory.
|
||||
5. Make sure to delete Arduino_Root/libraries/RobotIRremote. Where Arduino_Root refers to the install directory of Arduino. The library RobotIRremote has similar definitions to IRremote and causes errors.
|
||||
|
||||
## Supported Boards
|
||||
- Arduino Uno / Mega / Leonardo / Duemilanove / Diecimila / LilyPad / Mini / Fio / Nano etc.
|
||||
- Teensy 1.0 / 1.0++ / 2.0 / 2++ / 3.0 / 3.1 / Teensy-LC; Credits: @PaulStoffregen (Teensy Team)
|
||||
- Sanguino
|
||||
- ATmega8, 48, 88, 168, 328
|
||||
- ATmega8535, 16, 32, 164, 324, 644, 1284,
|
||||
- ATmega64, 128
|
||||
- ATtiny 84 / 85
|
||||
|
||||
We are open to suggestions for adding support to new boards, however we highly recommend you contact your supplier first and ask them to provide support from their side.
|
||||
|
||||
### Hardware specifications
|
||||
|
||||
| Board/CPU | Send Pin | Timers |
|
||||
|--------------------------------------------------------------------------|---------------------|-------------------|
|
||||
| [ATtiny84](https://github.com/SpenceKonde/ATTinyCore) | **6** | **1** |
|
||||
| [ATtiny85](https://github.com/SpenceKonde/ATTinyCore) | **1** | **TINY0** |
|
||||
| [ATmega8](https://github.com/MCUdude/MiniCore) | **9** | **1** |
|
||||
| Atmega32u4 | 5, 9, **13** | 1, 3, **4** |
|
||||
| [ATmega48, ATmega88, ATmega168, ATmega328](https://github.com/MCUdude/MiniCore) | **3**, 9 | 1, **2** |
|
||||
| [ATmega1284](https://github.com/MCUdude/MightyCore) | 13, 14, 6 | 1, **2**, 3 |
|
||||
| [ATmega164, ATmega324, ATmega644](https://github.com/MCUdude/MightyCore) | 13, **14** | 1, **2** |
|
||||
| [ATmega8535 ATmega16, ATmega32](https://github.com/MCUdude/MightyCore) | **13** | **1** |
|
||||
| [ATmega64, ATmega128](https://github.com/MCUdude/MegaCore) | **13** | **1** |
|
||||
| ATmega1280, ATmega2560 | 5, 6, **9**, 11, 46 | 1, **2**, 3, 4, 5 |
|
||||
| [Teensy 1.0](https://www.pjrc.com/teensy/) | **17** | **1** |
|
||||
| [Teensy 2.0](https://www.pjrc.com/teensy/) | 9, **10**, 14 | 1, 3, **4_HS** |
|
||||
| [Teensy++ 1.0 / 2.0](https://www.pjrc.com/teensy/) | **1**, 16, 25 | 1, **2**, 3 |
|
||||
| [Teensy 3.0 / 3.1](https://www.pjrc.com/teensy/) | **5** | **CMT** |
|
||||
| [Teensy-LC](https://www.pjrc.com/teensy/) | **16** | **TPM1** |
|
||||
|
||||
The table above lists the currently supported timers and corresponding send pins, many of these can have additional pins opened up and we are open to requests if a need arises for other pins.
|
||||
|
||||
## Usage
|
||||
- TODO (Check examples for now)
|
||||
|
||||
@@ -27,7 +75,8 @@ If you want to contribute to this project:
|
||||
- Create issues and pull requests
|
||||
- Tell other people about this library
|
||||
- Contribute new protocols
|
||||
-
|
||||
|
||||
Check [here](Contributing.md) for some guidelines.
|
||||
|
||||
## Contact
|
||||
The only way to contact me at the moment is by email: zetoslab@gmail.com
|
||||
@@ -38,3 +87,4 @@ Check [here](Contributors.md)
|
||||
|
||||
## Copyright
|
||||
Copyright 2009-2012 Ken Shirriff
|
||||
Copyright (c) 2016 Rafi Khan
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
{
|
||||
"auto_complete":
|
||||
{
|
||||
"selected_items":
|
||||
[
|
||||
[
|
||||
"vb",
|
||||
"vboMatrix"
|
||||
]
|
||||
]
|
||||
},
|
||||
"buffers":
|
||||
[
|
||||
],
|
||||
"build_system": "",
|
||||
"build_system_choices":
|
||||
[
|
||||
],
|
||||
"build_varint": "",
|
||||
"command_palette":
|
||||
{
|
||||
"height": 275.0,
|
||||
"last_filter": "blame",
|
||||
"selected_items":
|
||||
[
|
||||
[
|
||||
"blame",
|
||||
"Git: Blame"
|
||||
],
|
||||
[
|
||||
"install",
|
||||
"Package Control: Install Package"
|
||||
],
|
||||
[
|
||||
"diff",
|
||||
"Git: Diff Current File"
|
||||
],
|
||||
[
|
||||
"js",
|
||||
"Set Syntax: JavaScript"
|
||||
],
|
||||
[
|
||||
"i",
|
||||
"Package Control: Install Package"
|
||||
],
|
||||
[
|
||||
"instal",
|
||||
"Package Control: Install Package"
|
||||
]
|
||||
],
|
||||
"width": 510.0
|
||||
},
|
||||
"console":
|
||||
{
|
||||
"height": 126.0,
|
||||
"history":
|
||||
[
|
||||
"import urllib.request,os,hashlib; h = '2915d1851351e5ee549c20394736b442' + '8bc59f460fa1548d1514676163dafc88'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)"
|
||||
]
|
||||
},
|
||||
"distraction_free":
|
||||
{
|
||||
"menu_visible": true,
|
||||
"show_minimap": false,
|
||||
"show_open_files": false,
|
||||
"show_tabs": false,
|
||||
"side_bar_visible": false,
|
||||
"status_bar_visible": false
|
||||
},
|
||||
"expanded_folders":
|
||||
[
|
||||
"/C/Users/Rafi Khan/Documents/Arduino/libraries/Arduino-IRremote"
|
||||
],
|
||||
"file_history":
|
||||
[
|
||||
"/C/Users/Rafi Khan/Documents/Arduino/libraries/Arduino-IRremote/changelog.md",
|
||||
"/C/Users/Rafi Khan/Documents/Development/Arduino-IRremote/arduino-irremote.sublime-project",
|
||||
"/C/Users/Rafi Khan/Documents/Development/Arduino-IRremote/.gitignore",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/README.md",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/shader.frag",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/package.json",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/block.js",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/chunker.js",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/index.js",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/blocks",
|
||||
"/C/Users/Rafi Khan/AppData/Roaming/Sublime Text 3/Packages/User/Preferences.sublime-settings",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/shader.vert",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/magic.sublime-project",
|
||||
"/C/Users/Rafi Khan/Documents/Development/magic/node_modules/browserify/node_modules/syntax-error/node_modules/acorn/.tern-project",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/supermarket.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/takingavacation.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/TipCalculator.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/battleship.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/exam.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/pyglatin.py",
|
||||
"/C/Users/Rafi Khan/OneDrive/Documents/School-RafiKhan/Grade 11/CS30/Python/student.py"
|
||||
],
|
||||
"find":
|
||||
{
|
||||
"height": 28.0
|
||||
},
|
||||
"find_in_files":
|
||||
{
|
||||
"height": 0.0,
|
||||
"where_history":
|
||||
[
|
||||
]
|
||||
},
|
||||
"find_state":
|
||||
{
|
||||
"case_sensitive": false,
|
||||
"find_history":
|
||||
[
|
||||
"i",
|
||||
"Direction",
|
||||
";",
|
||||
";\n",
|
||||
"north",
|
||||
"cubeMatrix",
|
||||
")\n",
|
||||
"vec3.set",
|
||||
"f",
|
||||
";",
|
||||
"();\n",
|
||||
"render",
|
||||
"this",
|
||||
"y"
|
||||
],
|
||||
"highlight": true,
|
||||
"in_selection": false,
|
||||
"preserve_case": false,
|
||||
"regex": false,
|
||||
"replace_history":
|
||||
[
|
||||
],
|
||||
"reverse": false,
|
||||
"show_context": true,
|
||||
"use_buffer2": true,
|
||||
"whole_word": false,
|
||||
"wrap": true
|
||||
},
|
||||
"groups":
|
||||
[
|
||||
{
|
||||
"sheets":
|
||||
[
|
||||
]
|
||||
}
|
||||
],
|
||||
"incremental_find":
|
||||
{
|
||||
"height": 28.0
|
||||
},
|
||||
"input":
|
||||
{
|
||||
"height": 66.0
|
||||
},
|
||||
"layout":
|
||||
{
|
||||
"cells":
|
||||
[
|
||||
[
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1
|
||||
]
|
||||
],
|
||||
"cols":
|
||||
[
|
||||
0.0,
|
||||
1.0
|
||||
],
|
||||
"rows":
|
||||
[
|
||||
0.0,
|
||||
1.0
|
||||
]
|
||||
},
|
||||
"menu_visible": true,
|
||||
"output.find_results":
|
||||
{
|
||||
"height": 0.0
|
||||
},
|
||||
"pinned_build_system": "",
|
||||
"project": "arduino-irremote.sublime-project",
|
||||
"replace":
|
||||
{
|
||||
"height": 52.0
|
||||
},
|
||||
"save_all_on_build": true,
|
||||
"select_file":
|
||||
{
|
||||
"height": 0.0,
|
||||
"last_filter": "",
|
||||
"selected_items":
|
||||
[
|
||||
[
|
||||
"json",
|
||||
"package.json"
|
||||
],
|
||||
[
|
||||
"inde",
|
||||
"index.js"
|
||||
]
|
||||
],
|
||||
"width": 0.0
|
||||
},
|
||||
"select_project":
|
||||
{
|
||||
"height": 0.0,
|
||||
"last_filter": "",
|
||||
"selected_items":
|
||||
[
|
||||
],
|
||||
"width": 0.0
|
||||
},
|
||||
"select_symbol":
|
||||
{
|
||||
"height": 0.0,
|
||||
"last_filter": "",
|
||||
"selected_items":
|
||||
[
|
||||
],
|
||||
"width": 0.0
|
||||
},
|
||||
"selected_group": 0,
|
||||
"settings":
|
||||
{
|
||||
},
|
||||
"show_minimap": true,
|
||||
"show_open_files": false,
|
||||
"show_tabs": true,
|
||||
"side_bar_visible": true,
|
||||
"side_bar_width": 150.0,
|
||||
"status_bar_visible": true,
|
||||
"template_settings":
|
||||
{
|
||||
}
|
||||
}
|
||||
25
changelog.md
25
changelog.md
@@ -1,3 +1,22 @@
|
||||
## 2.2.1 - 2016/07/27
|
||||
- Added tests for Lego Power Functions Protocol [PR #336](https://github.com/z3t0/Arduino-IRremote/pull/336)
|
||||
|
||||
## 2.2.0 - 2016/06/28
|
||||
- Added support for ATmega8535
|
||||
- Added support for ATmega16
|
||||
- Added support for ATmega32
|
||||
- Added support for ATmega164
|
||||
- Added support for ATmega324
|
||||
- Added support for ATmega644
|
||||
- Added support for ATmega1284
|
||||
- Added support for ATmega64
|
||||
- Added support for ATmega128
|
||||
|
||||
[PR](https://github.com/z3t0/Arduino-IRremote/pull/324)
|
||||
|
||||
## 2.1.1 - 2016/05/04
|
||||
- Added Lego Power Functions Protocol [PR #309](https://github.com/z3t0/Arduino-IRremote/pull/309)
|
||||
|
||||
## 2.1.0 - 2016/02/20
|
||||
- Improved Debugging [PR #258](https://github.com/z3t0/Arduino-IRremote/pull/258)
|
||||
- Display TIME instead of TICKS [PR #258](https://github.com/z3t0/Arduino-IRremote/pull/258)
|
||||
@@ -15,7 +34,7 @@
|
||||
## 2.0.1 - 2015/07/26 - [Release](https://github.com/shirriff/Arduino-IRremote/releases/tag/BETA)
|
||||
### Changes
|
||||
- Updated README
|
||||
- Updated Contributors
|
||||
- Updated Contributors
|
||||
- Fixed #110 Mess
|
||||
- Created Gitter Room
|
||||
- Added Gitter Badge
|
||||
@@ -35,7 +54,7 @@
|
||||
- Added Denon Protocol
|
||||
- Added Pronto Support
|
||||
- Added Library Properties
|
||||
- Added Template For New Protocols
|
||||
- Added Template For New Protocols
|
||||
- Added this changelog
|
||||
- Added Teensy LC Support
|
||||
- Added ATtiny84 Support
|
||||
@@ -44,7 +63,7 @@
|
||||
|
||||
### Deletions
|
||||
- Removed (Fixed) #110
|
||||
- Broke Teensy 3 / 3.1 Support
|
||||
- Broke Teensy 3 / 3.1 Support
|
||||
|
||||
### Not Working
|
||||
- Teensy 3 / 3.1 Support is in Development
|
||||
|
||||
@@ -107,10 +107,30 @@ void dumpPlatform() {
|
||||
Serial.println(F("Teensy++ 1.0 / AT90USB646"));
|
||||
#elif defined(__AVR_AT90USB1286__)
|
||||
Serial.println(F("Teensy++ 2.0 / AT90USB1286"));
|
||||
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||
Serial.println(F("Sanguino / ATmega644(P)"));
|
||||
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
|
||||
Serial.println(F("Atmega8 / ATmega8(P)"));
|
||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
||||
Serial.println(F("ATmega1284"));
|
||||
#elif defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__)
|
||||
Serial.println(F("ATmega644"));
|
||||
#elif defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) || defined(__AVR_ATmega324PA__)
|
||||
Serial.println(F("ATmega324"));
|
||||
#elif defined(__AVR_ATmega164A__) || defined(__AVR_ATmega164P__)
|
||||
Serial.println(F("ATmega164"));
|
||||
#elif defined(__AVR_ATmega128__)
|
||||
Serial.println(F("ATmega128"));
|
||||
#elif defined(__AVR_ATmega88__) || defined(__AVR_ATmega88P__)
|
||||
Serial.println(F("ATmega88"));
|
||||
#elif defined(__AVR_ATmega64__)
|
||||
Serial.println(F("ATmega64"));
|
||||
#elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega48P__)
|
||||
Serial.println(F("ATmega48"));
|
||||
#elif defined(__AVR_ATmega32__)
|
||||
Serial.println(F("ATmega32"));
|
||||
#elif defined(__AVR_ATmega16__)
|
||||
Serial.println(F("ATmega16"));
|
||||
#elif defined(__AVR_ATmega8535__)
|
||||
Serial.println(F("ATmega8535"));
|
||||
#elif defined(__AVR_ATmega8__)
|
||||
Serial.println(F("Atmega8"));
|
||||
#elif defined(__AVR_ATtiny84__)
|
||||
Serial.println(F("ATtiny84"));
|
||||
#elif defined(__AVR_ATtiny85__)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* LegoPowerFunctionsSendDemo: LEGO Power Functions
|
||||
* Copyright (c) 2016 Philipp Henkel
|
||||
*/
|
||||
|
||||
#include <IRremote.h>
|
||||
#include <IRremoteInt.h>
|
||||
|
||||
IRsend irsend;
|
||||
|
||||
void setup() {
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// Send repeated command "channel 1, blue forward, red backward"
|
||||
irsend.sendLegoPowerFunctions(0x197);
|
||||
delay(2000);
|
||||
|
||||
// Send single command "channel 1, blue forward, red backward"
|
||||
irsend.sendLegoPowerFunctions(0x197, false);
|
||||
delay(2000);
|
||||
}
|
||||
197
examples/LegoPowerFunctionsTests/LegoPowerFunctionsTests.ino
Normal file
197
examples/LegoPowerFunctionsTests/LegoPowerFunctionsTests.ino
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* LegoPowerFunctionsTest: LEGO Power Functions Tests
|
||||
* Copyright (c) 2016 Philipp Henkel
|
||||
*/
|
||||
|
||||
#include <ir_Lego_PF_BitStreamEncoder.h>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
delay(1000); // wait for reset triggered by serial connection
|
||||
runBitStreamEncoderTests();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
||||
|
||||
void runBitStreamEncoderTests() {
|
||||
Serial.println();
|
||||
Serial.println("BitStreamEncoder Tests");
|
||||
static LegoPfBitStreamEncoder bitStreamEncoder;
|
||||
testStartBit(bitStreamEncoder);
|
||||
testLowBit(bitStreamEncoder);
|
||||
testHighBit(bitStreamEncoder);
|
||||
testMessageBitCount(bitStreamEncoder);
|
||||
testMessageBitCountRepeat(bitStreamEncoder);
|
||||
testMessage407(bitStreamEncoder);
|
||||
testMessage407Repeated(bitStreamEncoder);
|
||||
testGetChannelId1(bitStreamEncoder);
|
||||
testGetChannelId2(bitStreamEncoder);
|
||||
testGetChannelId3(bitStreamEncoder);
|
||||
testGetChannelId4(bitStreamEncoder);
|
||||
testGetMessageLengthAllHigh(bitStreamEncoder);
|
||||
testGetMessageLengthAllLow(bitStreamEncoder);
|
||||
}
|
||||
|
||||
void logTestResult(bool testPassed) {
|
||||
if (testPassed) {
|
||||
Serial.println("OK");
|
||||
}
|
||||
else {
|
||||
Serial.println("FAIL ############");
|
||||
}
|
||||
}
|
||||
|
||||
void testStartBit(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testStartBit ");
|
||||
bitStreamEncoder.reset(0, false);
|
||||
int startMark = bitStreamEncoder.getMarkDuration();
|
||||
int startPause = bitStreamEncoder.getPauseDuration();
|
||||
logTestResult(startMark == 158 && startPause == 1184-158);
|
||||
}
|
||||
|
||||
void testLowBit(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testLowBit ");
|
||||
bitStreamEncoder.reset(0, false);
|
||||
bitStreamEncoder.next();
|
||||
int lowMark = bitStreamEncoder.getMarkDuration();
|
||||
int lowPause = bitStreamEncoder.getPauseDuration();
|
||||
logTestResult(lowMark == 158 && lowPause == 421-158);
|
||||
}
|
||||
|
||||
void testHighBit(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testHighBit ");
|
||||
bitStreamEncoder.reset(0xFFFF, false);
|
||||
bitStreamEncoder.next();
|
||||
int highMark = bitStreamEncoder.getMarkDuration();
|
||||
int highPause = bitStreamEncoder.getPauseDuration();
|
||||
logTestResult(highMark == 158 && highPause == 711-158);
|
||||
}
|
||||
|
||||
void testMessageBitCount(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testMessageBitCount ");
|
||||
bitStreamEncoder.reset(0xFFFF, false);
|
||||
int bitCount = 1;
|
||||
while (bitStreamEncoder.next()) {
|
||||
bitCount++;
|
||||
}
|
||||
logTestResult(bitCount == 18);
|
||||
}
|
||||
|
||||
boolean check(LegoPfBitStreamEncoder& bitStreamEncoder, int markDuration, int pauseDuration) {
|
||||
bool result = true;
|
||||
result = result && bitStreamEncoder.getMarkDuration() == markDuration;
|
||||
result = result && bitStreamEncoder.getPauseDuration() == pauseDuration;
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean checkNext(LegoPfBitStreamEncoder& bitStreamEncoder, int markDuration, int pauseDuration) {
|
||||
bool result = bitStreamEncoder.next();
|
||||
result = result && check(bitStreamEncoder, markDuration, pauseDuration);
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean checkDataBitsOfMessage407(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
bool result = true;
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 263);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 553);
|
||||
return result;
|
||||
}
|
||||
|
||||
void testMessage407(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testMessage407 ");
|
||||
bitStreamEncoder.reset(407, false);
|
||||
bool result = true;
|
||||
result = result && check(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && !bitStreamEncoder.next();
|
||||
logTestResult(result);
|
||||
}
|
||||
|
||||
void testMessage407Repeated(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testMessage407Repeated ");
|
||||
bitStreamEncoder.reset(407, true);
|
||||
bool result = true;
|
||||
result = result && check(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 5 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 5 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 8 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026 + 8 * 16000 - 10844);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && checkDataBitsOfMessage407(bitStreamEncoder);
|
||||
result = result && checkNext(bitStreamEncoder, 158, 1026);
|
||||
result = result && !bitStreamEncoder.next();
|
||||
logTestResult(result);
|
||||
}
|
||||
|
||||
void testMessageBitCountRepeat(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testMessageBitCountRepeat ");
|
||||
bitStreamEncoder.reset(0xFFFF, true);
|
||||
int bitCount = 1;
|
||||
while (bitStreamEncoder.next()) {
|
||||
bitCount++;
|
||||
}
|
||||
logTestResult(bitCount == 5*18);
|
||||
}
|
||||
|
||||
void testGetChannelId1(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetChannelId1 ");
|
||||
bitStreamEncoder.reset(407, false);
|
||||
logTestResult(bitStreamEncoder.getChannelId() == 1);
|
||||
}
|
||||
|
||||
void testGetChannelId2(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetChannelId2 ");
|
||||
bitStreamEncoder.reset(4502, false);
|
||||
logTestResult(bitStreamEncoder.getChannelId() == 2);
|
||||
}
|
||||
|
||||
void testGetChannelId3(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetChannelId3 ");
|
||||
bitStreamEncoder.reset(8597, false);
|
||||
logTestResult(bitStreamEncoder.getChannelId() == 3);
|
||||
}
|
||||
|
||||
void testGetChannelId4(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetChannelId4 ");
|
||||
bitStreamEncoder.reset(12692, false);
|
||||
logTestResult(bitStreamEncoder.getChannelId() == 4);
|
||||
}
|
||||
|
||||
void testGetMessageLengthAllHigh(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetMessageLengthAllHigh ");
|
||||
bitStreamEncoder.reset(0xFFFF, false);
|
||||
logTestResult(bitStreamEncoder.getMessageLength() == 13744);
|
||||
}
|
||||
|
||||
void testGetMessageLengthAllLow(LegoPfBitStreamEncoder& bitStreamEncoder) {
|
||||
Serial.print(" testGetMessageLengthAllLow ");
|
||||
bitStreamEncoder.reset(0x0, false);
|
||||
logTestResult(bitStreamEncoder.getMessageLength() == 9104);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
513
irPronto.cpp
513
irPronto.cpp
@@ -1,513 +0,0 @@
|
||||
#define TEST 0
|
||||
|
||||
#if TEST
|
||||
# define SEND_PRONTO 1
|
||||
# define PRONTO_ONCE false
|
||||
# define PRONTO_REPEAT true
|
||||
# define PRONTO_FALLBACK true
|
||||
# define PRONTO_NOFALLBACK false
|
||||
#endif
|
||||
|
||||
#if SEND_PRONTO
|
||||
|
||||
//******************************************************************************
|
||||
#if TEST
|
||||
# include <stdio.h>
|
||||
void enableIROut (int freq) { printf("\nFreq = %d KHz\n", freq); }
|
||||
void mark (int t) { printf("+%d," , t); }
|
||||
void space (int t) { printf("-%d, ", t); }
|
||||
#else
|
||||
# include "IRremote.h"
|
||||
#endif // TEST
|
||||
|
||||
//+=============================================================================
|
||||
// Check for a valid hex digit
|
||||
//
|
||||
bool ishex (char ch)
|
||||
{
|
||||
return ( ((ch >= '0') && (ch <= '9')) ||
|
||||
((ch >= 'A') && (ch <= 'F')) ||
|
||||
((ch >= 'a') && (ch <= 'f')) ) ? true : false ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Check for a valid "blank" ... '\0' is a valid "blank"
|
||||
//
|
||||
bool isblank (char ch)
|
||||
{
|
||||
return ((ch == ' ') || (ch == '\t') || (ch == '\0')) ? true : false ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Bypass spaces
|
||||
//
|
||||
bool byp (char** pcp)
|
||||
{
|
||||
while (isblank(**pcp)) (*pcp)++ ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Hex-to-Byte : Decode a hex digit
|
||||
// We assume the character has already been validated
|
||||
//
|
||||
uint8_t htob (char ch)
|
||||
{
|
||||
if ((ch >= '0') && (ch <= '9')) return ch - '0' ;
|
||||
if ((ch >= 'A') && (ch <= 'F')) return ch - 'A' + 10 ;
|
||||
if ((ch >= 'a') && (ch <= 'f')) return ch - 'a' + 10 ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Hex-to-Word : Decode a block of 4 hex digits
|
||||
// We assume the string has already been validated
|
||||
// and the pointer being passed points at the start of a block of 4 hex digits
|
||||
//
|
||||
uint16_t htow (char* cp)
|
||||
{
|
||||
return ( (htob(cp[0]) << 12) | (htob(cp[1]) << 8) |
|
||||
(htob(cp[2]) << 4) | (htob(cp[3]) ) ) ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
bool sendPronto (char* s, bool repeat, bool fallback)
|
||||
{
|
||||
int i;
|
||||
int len;
|
||||
int skip;
|
||||
char* cp;
|
||||
uint16_t freq; // Frequency in KHz
|
||||
uint8_t usec; // pronto uSec/tick
|
||||
uint8_t once;
|
||||
uint8_t rpt;
|
||||
|
||||
// Validate the string
|
||||
for (cp = s; *cp; cp += 4) {
|
||||
byp(&cp);
|
||||
if ( !ishex(cp[0]) || !ishex(cp[1]) ||
|
||||
!ishex(cp[2]) || !ishex(cp[3]) || !isblank(cp[4]) ) return false ;
|
||||
}
|
||||
|
||||
// We will use cp to traverse the string
|
||||
cp = s;
|
||||
|
||||
// Check mode = Oscillated/Learned
|
||||
byp(&cp);
|
||||
if (htow(cp) != 0000) return false;
|
||||
cp += 4;
|
||||
|
||||
// Extract & set frequency
|
||||
byp(&cp);
|
||||
freq = (int)(1000000 / (htow(cp) * 0.241246)); // Rounding errors will occur, tolerance is +/- 10%
|
||||
usec = (int)(((1.0 / freq) * 1000000) + 0.5); // Another rounding error, thank Cod for analogue electronics
|
||||
freq /= 1000; // This will introduce a(nother) rounding error which we do not want in the usec calcualtion
|
||||
cp += 4;
|
||||
|
||||
// Get length of "once" code
|
||||
byp(&cp);
|
||||
once = htow(cp);
|
||||
cp += 4;
|
||||
|
||||
// Get length of "repeat" code
|
||||
byp(&cp);
|
||||
rpt = htow(cp);
|
||||
cp += 4;
|
||||
|
||||
// Which code are we sending?
|
||||
if (fallback) { // fallback on the "other" code if "this" code is not present
|
||||
if (!repeat) { // requested 'once'
|
||||
if (once) len = once * 2, skip = 0 ; // if once exists send it
|
||||
else len = rpt * 2, skip = 0 ; // else send repeat code
|
||||
} else { // requested 'repeat'
|
||||
if (rpt) len = rpt * 2, skip = 0 ; // if rpt exists send it
|
||||
else len = once * 2, skip = 0 ; // else send once code
|
||||
}
|
||||
} else { // Send what we asked for, do not fallback if the code is empty!
|
||||
if (!repeat) len = once * 2, skip = 0 ; // 'once' starts at 0
|
||||
else len = rpt * 2, skip = once ; // 'repeat' starts where 'once' ends
|
||||
}
|
||||
|
||||
// Skip to start of code
|
||||
for (i = 0; i < skip; i++, cp += 4) byp(&cp) ;
|
||||
|
||||
// Send code
|
||||
enableIROut(freq);
|
||||
for (i = 0; i < len; i++) {
|
||||
byp(&cp);
|
||||
if (i & 1) space(htow(cp) * usec);
|
||||
else mark (htow(cp) * usec);
|
||||
cp += 4;
|
||||
}
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
#if TEST
|
||||
|
||||
int main ( )
|
||||
{
|
||||
char prontoTest[] =
|
||||
"0000 0070 0000 0032 0080 0040 0010 0010 0010 0030 " // 10
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 20
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 30
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 " // 40
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 50
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 " // 60
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 70
|
||||
"0010 0010 0010 0030 0010 0010 0010 0030 0010 0010 " // 80
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0030 " // 90
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0030 " // 100
|
||||
"0010 0030 0010 0aa6"; // 104
|
||||
|
||||
sendPronto(prontoTest, PRONTO_ONCE, PRONTO_FALLBACK); // once code
|
||||
sendPronto(prontoTest, PRONTO_REPEAT, PRONTO_FALLBACK); // repeat code
|
||||
sendPronto(prontoTest, PRONTO_ONCE, PRONTO_NOFALLBACK); // once code
|
||||
sendPronto(prontoTest, PRONTO_REPEAT, PRONTO_NOFALLBACK); // repeat code
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // TEST
|
||||
|
||||
#endif // SEND_PRONTO
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
//******************************************************************************
|
||||
// Sources:
|
||||
// http://www.remotecentral.com/features/irdisp2.htm
|
||||
// http://www.hifi-remote.com/wiki/index.php?title=Working_With_Pronto_Hex
|
||||
//******************************************************************************
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define IRPRONTO
|
||||
#include "IRremoteInt.h" // The Arduino IRremote library defines USECPERTICK
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Source: https://www.google.co.uk/search?q=DENON+MASTER+IR+Hex+Command+Sheet
|
||||
// -> http://assets.denon.com/documentmaster/us/denon%20master%20ir%20hex.xls
|
||||
//
|
||||
char prontoTest[] =
|
||||
"0000 0070 0000 0032 0080 0040 0010 0010 0010 0030 " // 10
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 20
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 30
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 " // 40
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 50
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 " // 60
|
||||
"0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 " // 70
|
||||
"0010 0010 0010 0030 0010 0010 0010 0030 0010 0010 " // 80
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0030 " // 90
|
||||
"0010 0010 0010 0030 0010 0010 0010 0010 0010 0030 " // 100
|
||||
"0010 0030 0010 0aa6"; // 104
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// This is the longest code we can support
|
||||
#define CODEMAX 200
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// This is the data we pull out of the pronto code
|
||||
typedef
|
||||
struct {
|
||||
int freq; // Carrier frequency (in Hz)
|
||||
int usec; // uSec per tick (based on freq)
|
||||
|
||||
int codeLen; // Length of code
|
||||
uint16_t code[CODEMAX]; // Code in hex
|
||||
|
||||
int onceLen; // Length of "once" transmit
|
||||
uint16_t* once; // Pointer to start within 'code'
|
||||
|
||||
int rptLen; // Length of "repeat" transmit
|
||||
uint16_t* rpt; // Pointer to start within 'code'
|
||||
}
|
||||
pronto_t;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// From what I have seen, the only time we go over 8-bits is the 'space'
|
||||
// on the end which creates the lead-out/inter-code gap. Assuming I'm right,
|
||||
// we can code this up as a special case and otherwise halve the size of our
|
||||
// data!
|
||||
// Ignoring the first four values (the config data) and the last value
|
||||
// (the lead-out), if you find a protocol that uses values greater than 00fe
|
||||
// we are going to have to revisit this code!
|
||||
//
|
||||
//
|
||||
// So, the 0th byte will be the carrier frequency in Khz (NOT Hz)
|
||||
// " 1st " " " " length of the "once" code
|
||||
// " 2nd " " " " length of the "repeat" code
|
||||
//
|
||||
// Thereafter, odd bytes will be Mark lengths as a multiple of USECPERTICK uS
|
||||
// even " " " Space " " " " " " "
|
||||
//
|
||||
// Any occurence of "FF" in either a Mark or a Space will indicate
|
||||
// "Use the 16-bit FF value" which will also be a multiple of USECPERTICK uS
|
||||
//
|
||||
//
|
||||
// As a point of comparison, the test code (prontoTest[]) is 520 bytes
|
||||
// (yes, more than 0.5KB of our Arduino's precious 32KB) ... after conversion
|
||||
// to pronto hex that goes down to ((520/5)*2) = 208 bytes ... once converted to
|
||||
// our format we are down to ((208/2) -1 -1 +2) = 104 bytes
|
||||
//
|
||||
// In fariness this is still very memory-hungry
|
||||
// ...As a rough guide:
|
||||
// 10 codes cost 1K of memory (this will vary depending on the protocol).
|
||||
//
|
||||
// So if you're building a complex remote control, you will probably need to
|
||||
// keep the codes on an external memory device (not in the Arduino sketch) and
|
||||
// load them as you need them. Hmmm.
|
||||
//
|
||||
// This dictates that "Oscillated Pronto Codes" are probably NOT the way forward
|
||||
//
|
||||
// For example, prontoTest[] happens to be: A 48-bit IR code in Denon format
|
||||
// So we know it starts with 80/40 (Denon header)
|
||||
// and ends with 10/aa6 (Denon leadout)
|
||||
// and all (48) bits in between are either 10/10 (Denon 0)
|
||||
// or 10/30 (Denon 1)
|
||||
// So we could easily store this data in 1-byte ("Denon")
|
||||
// + 1-byte (Length=48)
|
||||
// + 6-bytes (IR code)
|
||||
// At 8-bytes per code, we can store 128 codes in 1KB or memory - that's a lot
|
||||
// better than the 2 (two) we started off with!
|
||||
//
|
||||
// And serendipitously, by reducing the amount of data, our program will run
|
||||
// a LOT faster!
|
||||
//
|
||||
// Again, I repeat, even after you have spent time converting the "Oscillated
|
||||
// Pronto Codes" in to IRremote format, it will be a LOT more memory-hungry
|
||||
// than using sendDenon() (or whichever) ...BUT these codes are easily
|
||||
// available on the internet, so we'll support them!
|
||||
//
|
||||
typedef
|
||||
struct {
|
||||
uint16_t FF;
|
||||
uint8_t code[CODEMAX];
|
||||
}
|
||||
irCode_t;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
#define DEBUGF(...) printf(__VA_ARGS__)
|
||||
|
||||
//+=============================================================================
|
||||
// String must be block of 4 hex digits separated with blanks
|
||||
//
|
||||
bool validate (char* cp, int* len)
|
||||
{
|
||||
for (*len = 0; *cp; (*len)++, cp += 4) {
|
||||
byp(&cp);
|
||||
if ( !ishex(cp[0]) || !ishex(cp[1]) ||
|
||||
!ishex(cp[2]) || !ishex(cp[3]) || !isblank(cp[4]) ) return false ;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Hex-to-Byte : Decode a hex digit
|
||||
// We assume the character has already been validated
|
||||
//
|
||||
uint8_t htob (char ch)
|
||||
{
|
||||
if ((ch >= '0') && (ch <= '9')) return ch - '0' ;
|
||||
if ((ch >= 'A') && (ch <= 'F')) return ch - 'A' + 10 ;
|
||||
if ((ch >= 'a') && (ch <= 'f')) return ch - 'a' + 10 ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Hex-to-Word : Decode a block of 4 hex digits
|
||||
// We assume the string has already been validated
|
||||
// and the pointer being passed points at the start of a block of 4 hex digits
|
||||
//
|
||||
uint16_t htow (char* cp)
|
||||
{
|
||||
return ( (htob(cp[0]) << 12) | (htob(cp[1]) << 8) |
|
||||
(htob(cp[2]) << 4) | (htob(cp[3]) ) ) ;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
// Convert the pronto string in to data
|
||||
//
|
||||
bool decode (char* s, pronto_t* p, irCode_t* ir)
|
||||
{
|
||||
int i, len;
|
||||
char* cp;
|
||||
|
||||
// Validate the Pronto string
|
||||
if (!validate(s, &p->codeLen)) {
|
||||
DEBUGF("Invalid pronto string\n");
|
||||
return false ;
|
||||
}
|
||||
DEBUGF("Found %d hex codes\n", p->codeLen);
|
||||
|
||||
// Allocate memory to store the decoded string
|
||||
//if (!(p->code = malloc(p->len))) {
|
||||
// DEBUGF("Memory allocation failed\n");
|
||||
// return false ;
|
||||
//}
|
||||
|
||||
// Check in case our code is too long
|
||||
if (p->codeLen > CODEMAX) {
|
||||
DEBUGF("Code too long, edit CODEMAX and recompile\n");
|
||||
return false ;
|
||||
}
|
||||
|
||||
// Decode the string
|
||||
cp = s;
|
||||
for (i = 0; i < p->codeLen; i++, cp += 4) {
|
||||
byp(&cp);
|
||||
p->code[i] = htow(cp);
|
||||
}
|
||||
|
||||
// Announce our findings
|
||||
DEBUGF("Input: |%s|\n", s);
|
||||
DEBUGF("Found: |");
|
||||
for (i = 0; i < p->codeLen; i++) DEBUGF("%04x ", p->code[i]) ;
|
||||
DEBUGF("|\n");
|
||||
|
||||
DEBUGF("Form [%04X] : ", p->code[0]);
|
||||
if (p->code[0] == 0x0000) DEBUGF("Oscillated (Learned)\n");
|
||||
else if (p->code[0] == 0x0100) DEBUGF("Unmodulated\n");
|
||||
else DEBUGF("Unknown\n");
|
||||
if (p->code[0] != 0x0000) return false ; // Can only handle Oscillated
|
||||
|
||||
// Calculate the carrier frequency (+/- 10%) & uSecs per pulse
|
||||
// Pronto uses a crystal which generates a timeabse of 0.241246
|
||||
p->freq = (int)(1000000 / (p->code[1] * 0.241246));
|
||||
p->usec = (int)(((1.0 / p->freq) * 1000000) + 0.5);
|
||||
ir->code[0] = p->freq / 1000;
|
||||
DEBUGF("Freq [%04X] : %d Hz (%d uS/pluse) -> %d KHz\n",
|
||||
p->code[1], p->freq, p->usec, ir->code[0]);
|
||||
|
||||
// Set the length & start pointer for the "once" code
|
||||
p->onceLen = p->code[2];
|
||||
p->once = &p->code[4];
|
||||
ir->code[1] = p->onceLen;
|
||||
DEBUGF("Once [%04X] : %d\n", p->code[2], p->onceLen);
|
||||
|
||||
// Set the length & start pointer for the "repeat" code
|
||||
p->rptLen = p->code[3];
|
||||
p->rpt = &p->code[4 + p->onceLen];
|
||||
ir->code[2] = p->rptLen;
|
||||
DEBUGF("Rpt [%04X] : %d\n", p->code[3], p->rptLen);
|
||||
|
||||
// Check everything tallies
|
||||
if (1 + 1 + 1 + 1 + (p->onceLen * 2) + (p->rptLen * 2) != p->codeLen) {
|
||||
DEBUGF("Bad code length\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Convert the IR data to our new format
|
||||
ir->FF = p->code[p->codeLen - 1];
|
||||
|
||||
len = (p->onceLen * 2) + (p->rptLen * 2);
|
||||
DEBUGF("Encoded: |");
|
||||
for (i = 0; i < len; i++) {
|
||||
if (p->code[i+4] == ir->FF) {
|
||||
ir->code[i+3] = 0xFF;
|
||||
} else if (p->code[i+4] > 0xFE) {
|
||||
DEBUGF("\n%04X : Mark/Space overflow\n", p->code[i+4]);
|
||||
return false;
|
||||
} else {
|
||||
ir->code[i+3] = (p->code[i+4] * p->usec) / USECPERTICK;
|
||||
}
|
||||
DEBUGF("%s%d", !i ? "" : (i&1 ? "," : ", "), ir->code[i+3]);
|
||||
}
|
||||
DEBUGF("|\n");
|
||||
|
||||
ir->FF = (ir->FF * p->usec) / USECPERTICK;
|
||||
DEBUGF("FF -> %d\n", ir->FF);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
void irDump (irCode_t* ir)
|
||||
{
|
||||
int i, len;
|
||||
|
||||
printf("uint8_t buttonName[%d] = {", len);
|
||||
|
||||
printf("%d,%d, ", (ir->FF >> 8), ir->FF & 0xFF);
|
||||
printf("%d,%d,%d, ", ir->code[0], ir->code[1], ir->code[2]);
|
||||
|
||||
len = (ir->code[1] * 2) + (ir->code[2] * 2);
|
||||
for (i = 0; i < len; i++) {
|
||||
printf("%s%d", !i ? "" : (i&1 ? "," : ", "), ir->code[i+3]);
|
||||
}
|
||||
|
||||
printf("};\n");
|
||||
|
||||
}
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
int main ( )
|
||||
{
|
||||
pronto_t pCode;
|
||||
irCode_t irCode;
|
||||
|
||||
decode(prontoTest, &pCode, &irCode);
|
||||
|
||||
irDump(&irCode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif //0
|
||||
@@ -80,6 +80,11 @@ int IRrecv::decode (decode_results *results)
|
||||
if (decodeDenon(results)) return true ;
|
||||
#endif
|
||||
|
||||
#if DECODE_LEGO_PF
|
||||
DBG_PRINTLN("Attempting Lego Power Functions");
|
||||
if (decodeLegoPowerFunctions(results)) return true ;
|
||||
#endif
|
||||
|
||||
// decodeHash returns a hash on any input.
|
||||
// Thus, it needs to be last in the list.
|
||||
// If you add any decodes, add them before this.
|
||||
@@ -145,8 +150,8 @@ void IRrecv::blink13 (int blinkflag)
|
||||
|
||||
//+=============================================================================
|
||||
// Return if receiving new IR signals
|
||||
//
|
||||
bool IRrecv::isIdle ( )
|
||||
//
|
||||
bool IRrecv::isIdle ( )
|
||||
{
|
||||
return (irparams.rcvstate == STATE_IDLE || irparams.rcvstate == STATE_STOP) ? true : false;
|
||||
}
|
||||
|
||||
105
ir_Aiwa.cpp
105
ir_Aiwa.cpp
@@ -1,105 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// AAA IIIII W W AAA
|
||||
// A A I W W A A
|
||||
// AAAAA I W W W AAAAA
|
||||
// A A I W W W A A
|
||||
// A A IIIII WWW A A
|
||||
//==============================================================================
|
||||
|
||||
// Based off the RC-T501 RCU
|
||||
// Lirc file http://lirc.sourceforge.net/remotes/aiwa/RC-T501
|
||||
|
||||
#define AIWA_RC_T501_HZ 38
|
||||
#define AIWA_RC_T501_BITS 15
|
||||
#define AIWA_RC_T501_PRE_BITS 26
|
||||
#define AIWA_RC_T501_POST_BITS 1
|
||||
#define AIWA_RC_T501_SUM_BITS (AIWA_RC_T501_PRE_BITS + AIWA_RC_T501_BITS + AIWA_RC_T501_POST_BITS)
|
||||
#define AIWA_RC_T501_HDR_MARK 8800
|
||||
#define AIWA_RC_T501_HDR_SPACE 4500
|
||||
#define AIWA_RC_T501_BIT_MARK 500
|
||||
#define AIWA_RC_T501_ONE_SPACE 600
|
||||
#define AIWA_RC_T501_ZERO_SPACE 1700
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_AIWA_RC_T501
|
||||
void IRsend::sendAiwaRCT501 (int code)
|
||||
{
|
||||
unsigned long pre = 0x0227EEC0; // 26-bits
|
||||
|
||||
// Set IR carrier frequency
|
||||
enableIROut(AIWA_RC_T501_HZ);
|
||||
|
||||
// Header
|
||||
mark(AIWA_RC_T501_HDR_MARK);
|
||||
space(AIWA_RC_T501_HDR_SPACE);
|
||||
|
||||
// Send "pre" data
|
||||
for (unsigned long mask = 1UL << (26 - 1); mask; mask >>= 1) {
|
||||
mark(AIWA_RC_T501_BIT_MARK);
|
||||
if (pre & mask) space(AIWA_RC_T501_ONE_SPACE) ;
|
||||
else space(AIWA_RC_T501_ZERO_SPACE) ;
|
||||
}
|
||||
|
||||
//-v- THIS CODE LOOKS LIKE IT MIGHT BE WRONG - CHECK!
|
||||
// it only send 15bits and ignores the top bit
|
||||
// then uses TOPBIT which is 0x80000000 to check the bit code
|
||||
// I suspect TOPBIT should be changed to 0x00008000
|
||||
|
||||
// Skip first code bit
|
||||
code <<= 1;
|
||||
// Send code
|
||||
for (int i = 0; i < 15; i++) {
|
||||
mark(AIWA_RC_T501_BIT_MARK);
|
||||
if (code & 0x80000000) space(AIWA_RC_T501_ONE_SPACE) ;
|
||||
else space(AIWA_RC_T501_ZERO_SPACE) ;
|
||||
code <<= 1;
|
||||
}
|
||||
|
||||
//-^- THIS CODE LOOKS LIKE IT MIGHT BE WRONG - CHECK!
|
||||
|
||||
// POST-DATA, 1 bit, 0x0
|
||||
mark(AIWA_RC_T501_BIT_MARK);
|
||||
space(AIWA_RC_T501_ZERO_SPACE);
|
||||
|
||||
mark(AIWA_RC_T501_BIT_MARK);
|
||||
space(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_AIWA_RC_T501
|
||||
bool IRrecv::decodeAiwaRCT501 (decode_results *results)
|
||||
{
|
||||
int data = 0;
|
||||
int offset = 1;
|
||||
|
||||
// Check SIZE
|
||||
if (irparams.rawlen < 2 * (AIWA_RC_T501_SUM_BITS) + 4) return false ;
|
||||
|
||||
// Check HDR Mark/Space
|
||||
if (!MATCH_MARK (results->rawbuf[offset++], AIWA_RC_T501_HDR_MARK )) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], AIWA_RC_T501_HDR_SPACE)) return false ;
|
||||
|
||||
offset += 26; // skip pre-data - optional
|
||||
while(offset < irparams.rawlen - 4) {
|
||||
if (MATCH_MARK(results->rawbuf[offset], AIWA_RC_T501_BIT_MARK)) offset++ ;
|
||||
else return false ;
|
||||
|
||||
// ONE & ZERO
|
||||
if (MATCH_SPACE(results->rawbuf[offset], AIWA_RC_T501_ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], AIWA_RC_T501_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else break ; // End of one & zero detected
|
||||
offset++;
|
||||
}
|
||||
|
||||
results->bits = (offset - 1) / 2;
|
||||
if (results->bits < 42) return false ;
|
||||
|
||||
results->value = data;
|
||||
results->decode_type = AIWA_RC_T501;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
94
ir_Denon.cpp
94
ir_Denon.cpp
@@ -1,94 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
// Reverse Engineered by looking at RAW dumps generated by IRremote
|
||||
|
||||
// I have since discovered that Denon publish all their IR codes:
|
||||
// https://www.google.co.uk/search?q=DENON+MASTER+IR+Hex+Command+Sheet
|
||||
// -> http://assets.denon.com/documentmaster/us/denon%20master%20ir%20hex.xls
|
||||
|
||||
// Having looked at the official Denon Pronto sheet and reverse engineered
|
||||
// the timing values from it, it is obvious that Denon have a range of
|
||||
// different timings and protocols ...the values here work for my AVR-3801 Amp!
|
||||
|
||||
//==============================================================================
|
||||
// DDDD EEEEE N N OOO N N
|
||||
// D D E NN N O O NN N
|
||||
// D D EEE N N N O O N N N
|
||||
// D D E N NN O O N NN
|
||||
// DDDD EEEEE N N OOO N N
|
||||
//==============================================================================
|
||||
|
||||
#define BITS 14 // The number of bits in the command
|
||||
|
||||
#define HDR_MARK 300 // The length of the Header:Mark
|
||||
#define HDR_SPACE 750 // The lenght of the Header:Space
|
||||
|
||||
#define BIT_MARK 300 // The length of a Bit:Mark
|
||||
#define ONE_SPACE 1800 // The length of a Bit:Space for 1's
|
||||
#define ZERO_SPACE 750 // The length of a Bit:Space for 0's
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
#if SEND_DENON
|
||||
void IRsend::sendDenon (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark (HDR_MARK);
|
||||
space(HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark (BIT_MARK);
|
||||
space(ONE_SPACE);
|
||||
} else {
|
||||
mark (BIT_MARK);
|
||||
space(ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
#if DECODE_DENON
|
||||
bool IRrecv::decodeDenon (decode_results *results)
|
||||
{
|
||||
unsigned long data = 0; // Somewhere to build our code
|
||||
int offset = 1; // Skip the Gap reading
|
||||
|
||||
// Check we have the right amount of data
|
||||
if (irparams.rawlen != 1 + 2 + (2 * BITS) + 1) return false ;
|
||||
|
||||
// Check initial Mark+Space match
|
||||
if (!MATCH_MARK (results->rawbuf[offset++], HDR_MARK )) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], HDR_SPACE)) return false ;
|
||||
|
||||
// Read the bits in
|
||||
for (int i = 0; i < BITS; i++) {
|
||||
// Each bit looks like: MARK + SPACE_1 -> 1
|
||||
// or : MARK + SPACE_0 -> 0
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], BIT_MARK)) return false ;
|
||||
|
||||
// IR data is big-endian, so we shuffle it in from the right:
|
||||
if (MATCH_SPACE(results->rawbuf[offset], ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = BITS;
|
||||
results->value = data;
|
||||
results->decode_type = DENON;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
53
ir_Dish.cpp
53
ir_Dish.cpp
@@ -1,53 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// DDDD IIIII SSSS H H
|
||||
// D D I S H H
|
||||
// D D I SSS HHHHH
|
||||
// D D I S H H
|
||||
// DDDD IIIII SSSS H H
|
||||
//==============================================================================
|
||||
|
||||
// Sharp and DISH support by Todd Treece ( http://unionbridge.org/design/ircommand )
|
||||
//
|
||||
// The sned function needs to be repeated 4 times
|
||||
//
|
||||
// Only send the last for characters of the hex.
|
||||
// I.E. Use 0x1C10 instead of 0x0000000000001C10 as listed in the LIRC file.
|
||||
//
|
||||
// Here is the LIRC file I found that seems to match the remote codes from the
|
||||
// oscilloscope:
|
||||
// DISH NETWORK (echostar 301):
|
||||
// http://lirc.sourceforge.net/remotes/echostar/301_501_3100_5100_58xx_59xx
|
||||
|
||||
#define DISH_BITS 16
|
||||
#define DISH_HDR_MARK 400
|
||||
#define DISH_HDR_SPACE 6100
|
||||
#define DISH_BIT_MARK 400
|
||||
#define DISH_ONE_SPACE 1700
|
||||
#define DISH_ZERO_SPACE 2800
|
||||
#define DISH_RPT_SPACE 6200
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_DISH
|
||||
void IRsend::sendDISH (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(56);
|
||||
|
||||
mark(DISH_HDR_MARK);
|
||||
space(DISH_HDR_SPACE);
|
||||
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(DISH_BIT_MARK);
|
||||
space(DISH_ONE_SPACE);
|
||||
} else {
|
||||
mark(DISH_BIT_MARK);
|
||||
space(DISH_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
101
ir_JVC.cpp
101
ir_JVC.cpp
@@ -1,101 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// JJJJJ V V CCCC
|
||||
// J V V C
|
||||
// J V V C
|
||||
// J J V V C
|
||||
// J V CCCC
|
||||
//==============================================================================
|
||||
|
||||
#define JVC_BITS 16
|
||||
#define JVC_HDR_MARK 8000
|
||||
#define JVC_HDR_SPACE 4000
|
||||
#define JVC_BIT_MARK 600
|
||||
#define JVC_ONE_SPACE 1600
|
||||
#define JVC_ZERO_SPACE 550
|
||||
#define JVC_RPT_LENGTH 60000
|
||||
|
||||
//+=============================================================================
|
||||
// JVC does NOT repeat by sending a separate code (like NEC does).
|
||||
// The JVC protocol repeats by skipping the header.
|
||||
// To send a JVC repeat signal, send the original code value
|
||||
// and set 'repeat' to true
|
||||
//
|
||||
#if SEND_JVC
|
||||
void IRsend::sendJVC (unsigned long data, int nbits, bool repeat)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Only send the Header if this is NOT a repeat command
|
||||
if (!repeat){
|
||||
mark(JVC_HDR_MARK);
|
||||
space(JVC_HDR_SPACE);
|
||||
}
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ONE_SPACE);
|
||||
} else {
|
||||
mark(JVC_BIT_MARK);
|
||||
space(JVC_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(JVC_BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_JVC
|
||||
bool IRrecv::decodeJVC (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 1; // Skip first space
|
||||
|
||||
// Check for repeat
|
||||
if ( (irparams.rawlen - 1 == 33)
|
||||
&& MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)
|
||||
&& MATCH_MARK(results->rawbuf[irparams.rawlen-1], JVC_BIT_MARK)
|
||||
) {
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = JVC;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], JVC_HDR_MARK)) return false ;
|
||||
|
||||
if (irparams.rawlen < (2 * JVC_BITS) + 1 ) return false ;
|
||||
|
||||
// Initial space
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], JVC_HDR_SPACE)) return false ;
|
||||
|
||||
for (int i = 0; i < JVC_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], JVC_BIT_MARK)) return false ;
|
||||
|
||||
if (MATCH_SPACE(results->rawbuf[offset], JVC_ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], JVC_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Stop bit
|
||||
if (!MATCH_MARK(results->rawbuf[offset], JVC_BIT_MARK)) return false ;
|
||||
|
||||
// Success
|
||||
results->bits = JVC_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = JVC;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
80
ir_LG.cpp
80
ir_LG.cpp
@@ -1,80 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// L GGGG
|
||||
// L G
|
||||
// L G GG
|
||||
// L G G
|
||||
// LLLLL GGG
|
||||
//==============================================================================
|
||||
|
||||
#define LG_BITS 28
|
||||
|
||||
#define LG_HDR_MARK 8000
|
||||
#define LG_HDR_SPACE 4000
|
||||
#define LG_BIT_MARK 600
|
||||
#define LG_ONE_SPACE 1600
|
||||
#define LG_ZERO_SPACE 550
|
||||
#define LG_RPT_LENGTH 60000
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_LG
|
||||
bool IRrecv::decodeLG (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 1; // Skip first space
|
||||
|
||||
// Check we have the right amount of data
|
||||
if (irparams.rawlen < (2 * LG_BITS) + 1 ) return false ;
|
||||
|
||||
// Initial mark/space
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], LG_HDR_MARK)) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], LG_HDR_SPACE)) return false ;
|
||||
|
||||
for (int i = 0; i < LG_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], LG_BIT_MARK)) return false ;
|
||||
|
||||
if (MATCH_SPACE(results->rawbuf[offset], LG_ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], LG_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Stop bit
|
||||
if (!MATCH_MARK(results->rawbuf[offset], LG_BIT_MARK)) return false ;
|
||||
|
||||
// Success
|
||||
results->bits = LG_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = LG;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_LG
|
||||
void IRsend::sendLG (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark(LG_HDR_MARK);
|
||||
space(LG_HDR_SPACE);
|
||||
mark(LG_BIT_MARK);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
space(LG_ONE_SPACE);
|
||||
mark(LG_BIT_MARK);
|
||||
} else {
|
||||
space(LG_ZERO_SPACE);
|
||||
mark(LG_BIT_MARK);
|
||||
}
|
||||
}
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// MMMMM IIIII TTTTT SSSS U U BBBB IIIII SSSS H H IIIII
|
||||
// M M M I T S U U B B I S H H I
|
||||
// M M M I T SSS U U BBBB I SSS HHHHH I
|
||||
// M M I T S U U B B I S H H I
|
||||
// M M IIIII T SSSS UUU BBBBB IIIII SSSS H H IIIII
|
||||
//==============================================================================
|
||||
|
||||
// Looks like Sony except for timings, 48 chars of data and time/space different
|
||||
|
||||
#define MITSUBISHI_BITS 16
|
||||
|
||||
// Mitsubishi RM 75501
|
||||
// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
|
||||
// #define MITSUBISHI_HDR_MARK 250 // seen range 3500
|
||||
#define MITSUBISHI_HDR_SPACE 350 // 7*50+100
|
||||
#define MITSUBISHI_ONE_MARK 1950 // 41*50-100
|
||||
#define MITSUBISHI_ZERO_MARK 750 // 17*50-100
|
||||
// #define MITSUBISHI_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround
|
||||
// #define MITSUBISHI_RPT_LENGTH 45000
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_MITSUBISHI
|
||||
bool IRrecv::decodeMitsubishi (decode_results *results)
|
||||
{
|
||||
// Serial.print("?!? decoding Mitsubishi:");Serial.print(irparams.rawlen); Serial.print(" want "); Serial.println( 2 * MITSUBISHI_BITS + 2);
|
||||
long data = 0;
|
||||
if (irparams.rawlen < 2 * MITSUBISHI_BITS + 2) return false ;
|
||||
int offset = 0; // Skip first space
|
||||
// Initial space
|
||||
|
||||
#if 0
|
||||
// Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
|
||||
Serial.print("IR Gap: ");
|
||||
Serial.println( results->rawbuf[offset]);
|
||||
Serial.println( "test against:");
|
||||
Serial.println(results->rawbuf[offset]);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
// Not seeing double keys from Mitsubishi
|
||||
if (results->rawbuf[offset] < MITSUBISHI_DOUBLE_SPACE_USECS) {
|
||||
// Serial.print("IR Gap found: ");
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = MITSUBISHI;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
offset++;
|
||||
|
||||
// Typical
|
||||
// 14200 7 41 7 42 7 42 7 17 7 17 7 18 7 41 7 18 7 17 7 17 7 18 7 41 8 17 7 17 7 18 7 17 7
|
||||
|
||||
// Initial Space
|
||||
if (!MATCH_MARK(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) return false ;
|
||||
offset++;
|
||||
|
||||
while (offset + 1 < irparams.rawlen) {
|
||||
if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ONE_MARK)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_MARK(results->rawbuf[offset], MITSUBISHI_ZERO_MARK)) data <<= 1 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
|
||||
if (!MATCH_SPACE(results->rawbuf[offset], MITSUBISHI_HDR_SPACE)) break ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = (offset - 1) / 2;
|
||||
if (results->bits < MITSUBISHI_BITS) {
|
||||
results->bits = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
results->value = data;
|
||||
results->decode_type = MITSUBISHI;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
98
ir_NEC.cpp
98
ir_NEC.cpp
@@ -1,98 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// N N EEEEE CCCC
|
||||
// NN N E C
|
||||
// N N N EEE C
|
||||
// N NN E C
|
||||
// N N EEEEE CCCC
|
||||
//==============================================================================
|
||||
|
||||
#define NEC_BITS 32
|
||||
#define NEC_HDR_MARK 9000
|
||||
#define NEC_HDR_SPACE 4500
|
||||
#define NEC_BIT_MARK 560
|
||||
#define NEC_ONE_SPACE 1690
|
||||
#define NEC_ZERO_SPACE 560
|
||||
#define NEC_RPT_SPACE 2250
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_NEC
|
||||
void IRsend::sendNEC (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark(NEC_HDR_MARK);
|
||||
space(NEC_HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ONE_SPACE);
|
||||
} else {
|
||||
mark(NEC_BIT_MARK);
|
||||
space(NEC_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(NEC_BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// NECs have a repeat only 4 items long
|
||||
//
|
||||
#if DECODE_NEC
|
||||
bool IRrecv::decodeNEC (decode_results *results)
|
||||
{
|
||||
long data = 0; // We decode in to here; Start with nothing
|
||||
int offset = 1; // Index in to results; Skip first entry!?
|
||||
|
||||
// Check header "mark"
|
||||
if (!MATCH_MARK(results->rawbuf[offset], NEC_HDR_MARK)) return false ;
|
||||
offset++;
|
||||
|
||||
// Check for repeat
|
||||
if ( (irparams.rawlen == 4)
|
||||
&& MATCH_SPACE(results->rawbuf[offset ], NEC_RPT_SPACE)
|
||||
&& MATCH_MARK (results->rawbuf[offset+1], NEC_BIT_MARK )
|
||||
) {
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = NEC;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check we have enough data
|
||||
if (irparams.rawlen < (2 * NEC_BITS) + 4) return false ;
|
||||
|
||||
// Check header "space"
|
||||
if (!MATCH_SPACE(results->rawbuf[offset], NEC_HDR_SPACE)) return false ;
|
||||
offset++;
|
||||
|
||||
// Build the data
|
||||
for (int i = 0; i < NEC_BITS; i++) {
|
||||
// Check data "mark"
|
||||
if (!MATCH_MARK(results->rawbuf[offset], NEC_BIT_MARK)) return false ;
|
||||
offset++;
|
||||
// Suppend this bit
|
||||
if (MATCH_SPACE(results->rawbuf[offset], NEC_ONE_SPACE )) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], NEC_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = NEC_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = NEC;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
@@ -1,78 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// PPPP AAA N N AAA SSSS OOO N N IIIII CCCC
|
||||
// P P A A NN N A A S O O NN N I C
|
||||
// PPPP AAAAA N N N AAAAA SSS O O N N N I C
|
||||
// P A A N NN A A S O O N NN I C
|
||||
// P A A N N A A SSSS OOO N N IIIII CCCC
|
||||
//==============================================================================
|
||||
|
||||
#define PANASONIC_BITS 48
|
||||
#define PANASONIC_HDR_MARK 3502
|
||||
#define PANASONIC_HDR_SPACE 1750
|
||||
#define PANASONIC_BIT_MARK 502
|
||||
#define PANASONIC_ONE_SPACE 1244
|
||||
#define PANASONIC_ZERO_SPACE 400
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_PANASONIC
|
||||
void IRsend::sendPanasonic (unsigned int address, unsigned long data)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(35);
|
||||
|
||||
// Header
|
||||
mark(PANASONIC_HDR_MARK);
|
||||
space(PANASONIC_HDR_SPACE);
|
||||
|
||||
// Address
|
||||
for (unsigned long mask = 1UL << (16 - 1); mask; mask >>= 1) {
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
if (address & mask) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
}
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (32 - 1); mask; mask >>= 1) {
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
if (data & mask) space(PANASONIC_ONE_SPACE) ;
|
||||
else space(PANASONIC_ZERO_SPACE) ;
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(PANASONIC_BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_PANASONIC
|
||||
bool IRrecv::decodePanasonic (decode_results *results)
|
||||
{
|
||||
unsigned long long data = 0;
|
||||
int offset = 1;
|
||||
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_HDR_MARK )) return false ;
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_HDR_SPACE)) return false ;
|
||||
|
||||
// decode address
|
||||
for (int i = 0; i < PANASONIC_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], PANASONIC_BIT_MARK)) return false ;
|
||||
|
||||
if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ONE_SPACE )) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset],PANASONIC_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
results->value = (unsigned long)data;
|
||||
results->address = (unsigned int)(data >> 32);
|
||||
results->decode_type = PANASONIC;
|
||||
results->bits = PANASONIC_BITS;
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
207
ir_RC5_RC6.cpp
207
ir_RC5_RC6.cpp
@@ -1,207 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//+=============================================================================
|
||||
// Gets one undecoded level at a time from the raw buffer.
|
||||
// The RC5/6 decoding is easier if the data is broken into time intervals.
|
||||
// E.g. if the buffer has MARK for 2 time intervals and SPACE for 1,
|
||||
// successive calls to getRClevel will return MARK, MARK, SPACE.
|
||||
// offset and used are updated to keep track of the current position.
|
||||
// t1 is the time interval for a single bit in microseconds.
|
||||
// Returns -1 for error (measured time interval is not a multiple of t1).
|
||||
//
|
||||
#if (DECODE_RC5 || DECODE_RC6)
|
||||
int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int t1)
|
||||
{
|
||||
int width;
|
||||
int val;
|
||||
int correction;
|
||||
int avail;
|
||||
|
||||
if (*offset >= results->rawlen) return SPACE ; // After end of recorded buffer, assume SPACE.
|
||||
width = results->rawbuf[*offset];
|
||||
val = ((*offset) % 2) ? MARK : SPACE;
|
||||
correction = (val == MARK) ? MARK_EXCESS : - MARK_EXCESS;
|
||||
|
||||
if (MATCH(width, ( t1) + correction)) avail = 1 ;
|
||||
else if (MATCH(width, (2*t1) + correction)) avail = 2 ;
|
||||
else if (MATCH(width, (3*t1) + correction)) avail = 3 ;
|
||||
else return -1 ;
|
||||
|
||||
(*used)++;
|
||||
if (*used >= avail) {
|
||||
*used = 0;
|
||||
(*offset)++;
|
||||
}
|
||||
|
||||
DBG_PRINTLN( (val == MARK) ? "MARK" : "SPACE" );
|
||||
|
||||
return val;
|
||||
}
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
// RRRR CCCC 55555
|
||||
// R R C 5
|
||||
// RRRR C 5555
|
||||
// R R C 5
|
||||
// R R CCCC 5555
|
||||
//
|
||||
// NB: First bit must be a one (start bit)
|
||||
//
|
||||
#define MIN_RC5_SAMPLES 11
|
||||
#define RC5_T1 889
|
||||
#define RC5_RPT_LENGTH 46000
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_RC5
|
||||
void IRsend::sendRC5 (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(36);
|
||||
|
||||
// Start
|
||||
mark(RC5_T1);
|
||||
space(RC5_T1);
|
||||
mark(RC5_T1);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
space(RC5_T1); // 1 is space, then mark
|
||||
mark(RC5_T1);
|
||||
} else {
|
||||
mark(RC5_T1);
|
||||
space(RC5_T1);
|
||||
}
|
||||
}
|
||||
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_RC5
|
||||
bool IRrecv::decodeRC5 (decode_results *results)
|
||||
{
|
||||
int nbits;
|
||||
long data = 0;
|
||||
int used = 0;
|
||||
int offset = 1; // Skip gap space
|
||||
|
||||
if (irparams.rawlen < MIN_RC5_SAMPLES + 2) return false ;
|
||||
|
||||
// Get start bits
|
||||
if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return false ;
|
||||
if (getRClevel(results, &offset, &used, RC5_T1) != SPACE) return false ;
|
||||
if (getRClevel(results, &offset, &used, RC5_T1) != MARK) return false ;
|
||||
|
||||
for (nbits = 0; offset < irparams.rawlen; nbits++) {
|
||||
int levelA = getRClevel(results, &offset, &used, RC5_T1);
|
||||
int levelB = getRClevel(results, &offset, &used, RC5_T1);
|
||||
|
||||
if ((levelA == SPACE) && (levelB == MARK )) data = (data << 1) | 1 ;
|
||||
else if ((levelA == MARK ) && (levelB == SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = nbits;
|
||||
results->value = data;
|
||||
results->decode_type = RC5;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// RRRR CCCC 6666
|
||||
// R R C 6
|
||||
// RRRR C 6666
|
||||
// R R C 6 6
|
||||
// R R CCCC 666
|
||||
//
|
||||
// NB : Caller needs to take care of flipping the toggle bit
|
||||
//
|
||||
#define MIN_RC6_SAMPLES 1
|
||||
#define RC6_HDR_MARK 2666
|
||||
#define RC6_HDR_SPACE 889
|
||||
#define RC6_T1 444
|
||||
#define RC6_RPT_LENGTH 46000
|
||||
|
||||
#if SEND_RC6
|
||||
void IRsend::sendRC6 (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(36);
|
||||
|
||||
// Header
|
||||
mark(RC6_HDR_MARK);
|
||||
space(RC6_HDR_SPACE);
|
||||
|
||||
// Start bit
|
||||
mark(RC6_T1);
|
||||
space(RC6_T1);
|
||||
|
||||
// Data
|
||||
for (unsigned long i = 1, mask = 1UL << (nbits - 1); mask; i++, mask >>= 1) {
|
||||
// The fourth bit we send is a "double width trailer bit"
|
||||
int t = (i == 4) ? (RC6_T1 * 2) : (RC6_T1) ;
|
||||
if (data & mask) {
|
||||
mark(t);
|
||||
space(t);
|
||||
} else {
|
||||
space(t);
|
||||
mark(t);
|
||||
}
|
||||
}
|
||||
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_RC6
|
||||
bool IRrecv::decodeRC6 (decode_results *results)
|
||||
{
|
||||
int nbits;
|
||||
long data = 0;
|
||||
int used = 0;
|
||||
int offset = 1; // Skip first space
|
||||
|
||||
if (results->rawlen < MIN_RC6_SAMPLES) return false ;
|
||||
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], RC6_HDR_MARK)) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], RC6_HDR_SPACE)) return false ;
|
||||
|
||||
// Get start bit (1)
|
||||
if (getRClevel(results, &offset, &used, RC6_T1) != MARK) return false ;
|
||||
if (getRClevel(results, &offset, &used, RC6_T1) != SPACE) return false ;
|
||||
|
||||
for (nbits = 0; offset < results->rawlen; nbits++) {
|
||||
int levelA, levelB; // Next two levels
|
||||
|
||||
levelA = getRClevel(results, &offset, &used, RC6_T1);
|
||||
if (nbits == 3) {
|
||||
// T bit is double wide; make sure second half matches
|
||||
if (levelA != getRClevel(results, &offset, &used, RC6_T1)) return false;
|
||||
}
|
||||
|
||||
levelB = getRClevel(results, &offset, &used, RC6_T1);
|
||||
if (nbits == 3) {
|
||||
// T bit is double wide; make sure second half matches
|
||||
if (levelB != getRClevel(results, &offset, &used, RC6_T1)) return false;
|
||||
}
|
||||
|
||||
if ((levelA == MARK ) && (levelB == SPACE)) data = (data << 1) | 1 ; // inverted compared to RC5
|
||||
else if ((levelA == SPACE) && (levelB == MARK )) data = (data << 1) | 0 ; // ...
|
||||
else return false ; // Error
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = nbits;
|
||||
results->value = data;
|
||||
results->decode_type = RC6;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
@@ -1,92 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// SSSS AAA MMM SSSS U U N N GGGG
|
||||
// S A A M M M S U U NN N G
|
||||
// SSS AAAAA M M M SSS U U N N N G GG
|
||||
// S A A M M S U U N NN G G
|
||||
// SSSS A A M M SSSS UUU N N GGG
|
||||
//==============================================================================
|
||||
|
||||
#define SAMSUNG_BITS 32
|
||||
#define SAMSUNG_HDR_MARK 5000
|
||||
#define SAMSUNG_HDR_SPACE 5000
|
||||
#define SAMSUNG_BIT_MARK 560
|
||||
#define SAMSUNG_ONE_SPACE 1600
|
||||
#define SAMSUNG_ZERO_SPACE 560
|
||||
#define SAMSUNG_RPT_SPACE 2250
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_SAMSUNG
|
||||
void IRsend::sendSAMSUNG (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark(SAMSUNG_HDR_MARK);
|
||||
space(SAMSUNG_HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
space(SAMSUNG_ONE_SPACE);
|
||||
} else {
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
space(SAMSUNG_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(SAMSUNG_BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// SAMSUNGs have a repeat only 4 items long
|
||||
//
|
||||
#if DECODE_SAMSUNG
|
||||
bool IRrecv::decodeSAMSUNG (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 1; // Skip first space
|
||||
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset], SAMSUNG_HDR_MARK)) return false ;
|
||||
offset++;
|
||||
|
||||
// Check for repeat
|
||||
if ( (irparams.rawlen == 4)
|
||||
&& MATCH_SPACE(results->rawbuf[offset], SAMSUNG_RPT_SPACE)
|
||||
&& MATCH_MARK(results->rawbuf[offset+1], SAMSUNG_BIT_MARK)
|
||||
) {
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = SAMSUNG;
|
||||
return true;
|
||||
}
|
||||
if (irparams.rawlen < (2 * SAMSUNG_BITS) + 4) return false ;
|
||||
|
||||
// Initial space
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], SAMSUNG_HDR_SPACE)) return false ;
|
||||
|
||||
for (int i = 0; i < SAMSUNG_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], SAMSUNG_BIT_MARK)) return false ;
|
||||
|
||||
if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], SAMSUNG_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = SAMSUNG_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = SAMSUNG;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
76
ir_Sanyo.cpp
76
ir_Sanyo.cpp
@@ -1,76 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// SSSS AAA N N Y Y OOO
|
||||
// S A A NN N Y Y O O
|
||||
// SSS AAAAA N N N Y O O
|
||||
// S A A N NN Y O O
|
||||
// SSSS A A N N Y OOO
|
||||
//==============================================================================
|
||||
|
||||
// I think this is a Sanyo decoder: Serial = SA 8650B
|
||||
// Looks like Sony except for timings, 48 chars of data and time/space different
|
||||
|
||||
#define SANYO_BITS 12
|
||||
#define SANYO_HDR_MARK 3500 // seen range 3500
|
||||
#define SANYO_HDR_SPACE 950 // seen 950
|
||||
#define SANYO_ONE_MARK 2400 // seen 2400
|
||||
#define SANYO_ZERO_MARK 700 // seen 700
|
||||
#define SANYO_DOUBLE_SPACE_USECS 800 // usually ssee 713 - not using ticks as get number wrapround
|
||||
#define SANYO_RPT_LENGTH 45000
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_SANYO
|
||||
bool IRrecv::decodeSanyo (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 0; // Skip first space <-- CHECK THIS!
|
||||
|
||||
if (irparams.rawlen < (2 * SANYO_BITS) + 2) return false ;
|
||||
|
||||
#if 0
|
||||
// Put this back in for debugging - note can't use #DEBUG as if Debug on we don't see the repeat cos of the delay
|
||||
Serial.print("IR Gap: ");
|
||||
Serial.println( results->rawbuf[offset]);
|
||||
Serial.println( "test against:");
|
||||
Serial.println(results->rawbuf[offset]);
|
||||
#endif
|
||||
|
||||
// Initial space
|
||||
if (results->rawbuf[offset] < SANYO_DOUBLE_SPACE_USECS) {
|
||||
//Serial.print("IR Gap found: ");
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
results->decode_type = SANYO;
|
||||
return true;
|
||||
}
|
||||
offset++;
|
||||
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], SANYO_HDR_MARK)) return false ;
|
||||
|
||||
// Skip Second Mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], SANYO_HDR_MARK)) return false ;
|
||||
|
||||
while (offset + 1 < irparams.rawlen) {
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], SANYO_HDR_SPACE)) break ;
|
||||
|
||||
if (MATCH_MARK(results->rawbuf[offset], SANYO_ONE_MARK)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_MARK(results->rawbuf[offset], SANYO_ZERO_MARK)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = (offset - 1) / 2;
|
||||
if (results->bits < 12) {
|
||||
results->bits = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
results->value = data;
|
||||
results->decode_type = SANYO;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
71
ir_Sharp.cpp
71
ir_Sharp.cpp
@@ -1,71 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// SSSS H H AAA RRRR PPPP
|
||||
// S H H A A R R P P
|
||||
// SSS HHHHH AAAAA RRRR PPPP
|
||||
// S H H A A R R P
|
||||
// SSSS H H A A R R P
|
||||
//==============================================================================
|
||||
|
||||
// Sharp and DISH support by Todd Treece: http://unionbridge.org/design/ircommand
|
||||
//
|
||||
// The send function has the necessary repeat built in because of the need to
|
||||
// invert the signal.
|
||||
//
|
||||
// Sharp protocol documentation:
|
||||
// http://www.sbprojects.com/knowledge/ir/sharp.htm
|
||||
//
|
||||
// Here is the LIRC file I found that seems to match the remote codes from the
|
||||
// oscilloscope:
|
||||
// Sharp LCD TV:
|
||||
// http://lirc.sourceforge.net/remotes/sharp/GA538WJSA
|
||||
|
||||
#define SHARP_BITS 15
|
||||
#define SHARP_BIT_MARK 245
|
||||
#define SHARP_ONE_SPACE 1805
|
||||
#define SHARP_ZERO_SPACE 795
|
||||
#define SHARP_GAP 600000
|
||||
#define SHARP_RPT_SPACE 3000
|
||||
|
||||
#define SHARP_TOGGLE_MASK 0x3FF
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_SHARP
|
||||
void IRsend::sendSharpRaw (unsigned long data, int nbits)
|
||||
{
|
||||
enableIROut(38);
|
||||
|
||||
// Sending codes in bursts of 3 (normal, inverted, normal) makes transmission
|
||||
// much more reliable. That's the exact behaviour of CD-S6470 remote control.
|
||||
for (int n = 0; n < 3; n++) {
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SHARP_BIT_MARK);
|
||||
space(SHARP_ONE_SPACE);
|
||||
} else {
|
||||
mark(SHARP_BIT_MARK);
|
||||
space(SHARP_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
mark(SHARP_BIT_MARK);
|
||||
space(SHARP_ZERO_SPACE);
|
||||
delay(40);
|
||||
|
||||
data = data ^ SHARP_TOGGLE_MASK;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
// Sharp send compatible with data obtained through decodeSharp()
|
||||
// ^^^^^^^^^^^^^ FUNCTION MISSING!
|
||||
//
|
||||
#if SEND_SHARP
|
||||
void IRsend::sendSharp (unsigned int address, unsigned int command)
|
||||
{
|
||||
sendSharpRaw((address << 10) | (command << 2) | 2, SHARP_BITS);
|
||||
}
|
||||
#endif
|
||||
95
ir_Sony.cpp
95
ir_Sony.cpp
@@ -1,95 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// SSSS OOO N N Y Y
|
||||
// S O O NN N Y Y
|
||||
// SSS O O N N N Y
|
||||
// S O O N NN Y
|
||||
// SSSS OOO N N Y
|
||||
//==============================================================================
|
||||
|
||||
#define SONY_BITS 12
|
||||
#define SONY_HDR_MARK 2400
|
||||
#define SONY_HDR_SPACE 600
|
||||
#define SONY_ONE_MARK 1200
|
||||
#define SONY_ZERO_MARK 600
|
||||
#define SONY_RPT_LENGTH 45000
|
||||
#define SONY_DOUBLE_SPACE_USECS 500 // usually ssee 713 - not using ticks as get number wrapround
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_SONY
|
||||
void IRsend::sendSony (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(40);
|
||||
|
||||
// Header
|
||||
mark(SONY_HDR_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(SONY_ONE_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
} else {
|
||||
mark(SONY_ZERO_MARK);
|
||||
space(SONY_HDR_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// We will have ended with LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_SONY
|
||||
bool IRrecv::decodeSony (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 0; // Dont skip first space, check its size
|
||||
|
||||
if (irparams.rawlen < (2 * SONY_BITS) + 2) return false ;
|
||||
|
||||
// Some Sony's deliver repeats fast after first
|
||||
// unfortunately can't spot difference from of repeat from two fast clicks
|
||||
if (results->rawbuf[offset] < SONY_DOUBLE_SPACE_USECS) {
|
||||
// Serial.print("IR Gap found: ");
|
||||
results->bits = 0;
|
||||
results->value = REPEAT;
|
||||
|
||||
# ifdef DECODE_SANYO
|
||||
results->decode_type = SANYO;
|
||||
# else
|
||||
results->decode_type = UNKNOWN;
|
||||
# endif
|
||||
|
||||
return true;
|
||||
}
|
||||
offset++;
|
||||
|
||||
// Initial mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], SONY_HDR_MARK)) return false ;
|
||||
|
||||
while (offset + 1 < irparams.rawlen) {
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], SONY_HDR_SPACE)) break ;
|
||||
|
||||
if (MATCH_MARK(results->rawbuf[offset], SONY_ONE_MARK)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_MARK(results->rawbuf[offset], SONY_ZERO_MARK)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = (offset - 1) / 2;
|
||||
if (results->bits < 12) {
|
||||
results->bits = 0;
|
||||
return false;
|
||||
}
|
||||
results->value = data;
|
||||
results->decode_type = SONY;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
179
ir_Template.cpp
179
ir_Template.cpp
@@ -1,179 +0,0 @@
|
||||
/*
|
||||
Assuming the protocol we are adding is for the (imaginary) manufacturer: Shuzu
|
||||
|
||||
Our fantasy protocol is a standard protocol, so we can use this standard
|
||||
template without too much work. Some protocols are quite unique and will require
|
||||
considerably more work in this file! It is way beyond the scope of this text to
|
||||
explain how to reverse engineer "unusual" IR protocols. But, unless you own an
|
||||
oscilloscope, the starting point is probably to use the rawDump.ino sketch and
|
||||
try to spot the pattern!
|
||||
|
||||
Before you start, make sure the IR library is working OK:
|
||||
# Open up the Arduino IDE
|
||||
# Load up the rawDump.ino example sketch
|
||||
# Run it
|
||||
|
||||
Now we can start to add our new protocol...
|
||||
|
||||
1. Copy this file to : ir_Shuzu.cpp
|
||||
|
||||
2. Replace all occurrences of "Shuzu" with the name of your protocol.
|
||||
|
||||
3. Tweak the #defines to suit your protocol.
|
||||
|
||||
4. If you're lucky, tweaking the #defines will make the default send() function
|
||||
work.
|
||||
|
||||
5. Again, if you're lucky, tweaking the #defines will have made the default
|
||||
decode() function work.
|
||||
|
||||
You have written the code to support your new protocol!
|
||||
|
||||
Now you must do a few things to add it to the IRremote system:
|
||||
|
||||
1. Open IRremote.h and make the following changes:
|
||||
REMEMEBER to change occurences of "SHUZU" with the name of your protocol
|
||||
|
||||
A. At the top, in the section "Supported Protocols", add:
|
||||
#define DECODE_SHUZU 1
|
||||
#define SEND_SHUZU 1
|
||||
|
||||
B. In the section "enumerated list of all supported formats", add:
|
||||
SHUZU,
|
||||
to the end of the list (notice there is a comma after the protocol name)
|
||||
|
||||
C. Further down in "Main class for receiving IR", add:
|
||||
//......................................................................
|
||||
#if DECODE_SHUZU
|
||||
bool decodeShuzu (decode_results *results) ;
|
||||
#endif
|
||||
|
||||
D. Further down in "Main class for sending IR", add:
|
||||
//......................................................................
|
||||
#if SEND_SHUZU
|
||||
void sendShuzu (unsigned long data, int nbits) ;
|
||||
#endif
|
||||
|
||||
E. Save your changes and close the file
|
||||
|
||||
2. Now open irRecv.cpp and make the following change:
|
||||
|
||||
A. In the function IRrecv::decode(), add:
|
||||
#ifdef DECODE_NEC
|
||||
DBG_PRINTLN("Attempting Shuzu decode");
|
||||
if (decodeShuzu(results)) return true ;
|
||||
#endif
|
||||
|
||||
B. Save your changes and close the file
|
||||
|
||||
You will probably want to add your new protocol to the example sketch
|
||||
|
||||
3. Open MyDocuments\Arduino\libraries\IRremote\examples\IRrecvDumpV2.ino
|
||||
|
||||
A. In the encoding() function, add:
|
||||
case SHUZU: Serial.print("SHUZU"); break ;
|
||||
|
||||
Now open the Arduino IDE, load up the rawDump.ino sketch, and run it.
|
||||
Hopefully it will compile and upload.
|
||||
If it doesn't, you've done something wrong. Check your work.
|
||||
If you can't get it to work - seek help from somewhere.
|
||||
|
||||
If you get this far, I will assume you have successfully added your new protocol
|
||||
There is one last thing to do.
|
||||
|
||||
1. Delete this giant instructional comment.
|
||||
|
||||
2. Send a copy of your work to us so we can include it in the library and
|
||||
others may benefit from your hard work and maybe even write a song about how
|
||||
great you are for helping them! :)
|
||||
|
||||
Regards,
|
||||
BlueChip
|
||||
*/
|
||||
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
//
|
||||
//
|
||||
// S H U Z U
|
||||
//
|
||||
//
|
||||
//==============================================================================
|
||||
|
||||
#define BITS 32 // The number of bits in the command
|
||||
|
||||
#define HDR_MARK 1000 // The length of the Header:Mark
|
||||
#define HDR_SPACE 2000 // The lenght of the Header:Space
|
||||
|
||||
#define BIT_MARK 3000 // The length of a Bit:Mark
|
||||
#define ONE_SPACE 4000 // The length of a Bit:Space for 1's
|
||||
#define ZERO_SPACE 5000 // The length of a Bit:Space for 0's
|
||||
|
||||
#define OTHER 1234 // Other things you may need to define
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
#if SEND_SHUZU
|
||||
void IRsend::sendShuzu (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Header
|
||||
mark (HDR_MARK);
|
||||
space(HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark (BIT_MARK);
|
||||
space(ONE_SPACE);
|
||||
} else {
|
||||
mark (BIT_MARK);
|
||||
space(ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(BIT_MARK);
|
||||
space(0); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
//
|
||||
#if DECODE_SHUZU
|
||||
bool IRrecv::decodeShuzu (decode_results *results)
|
||||
{
|
||||
unsigned long data = 0; // Somewhere to build our code
|
||||
int offset = 1; // Skip the Gap reading
|
||||
|
||||
// Check we have the right amount of data
|
||||
if (irparams.rawlen != 1 + 2 + (2 * BITS) + 1) return false ;
|
||||
|
||||
// Check initial Mark+Space match
|
||||
if (!MATCH_MARK (results->rawbuf[offset++], HDR_MARK )) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], HDR_SPACE)) return false ;
|
||||
|
||||
// Read the bits in
|
||||
for (int i = 0; i < SHUZU_BITS; i++) {
|
||||
// Each bit looks like: MARK + SPACE_1 -> 1
|
||||
// or : MARK + SPACE_0 -> 0
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], BIT_MARK)) return false ;
|
||||
|
||||
// IR data is big-endian, so we shuffle it in from the right:
|
||||
if (MATCH_SPACE(results->rawbuf[offset], ONE_SPACE)) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// Success
|
||||
results->bits = BITS;
|
||||
results->value = data;
|
||||
results->decode_type = SHUZU;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
@@ -1,91 +0,0 @@
|
||||
#include "IRremote.h"
|
||||
#include "IRremoteInt.h"
|
||||
|
||||
//==============================================================================
|
||||
// W W H H Y Y N N TTTTT EEEEE RRRRR
|
||||
// W W H H Y Y NN N T E R R
|
||||
// W W W HHHHH Y N N N T EEE RRRR
|
||||
// W W W H H Y N NN T E R R
|
||||
// WWW H H Y N N T EEEEE R R
|
||||
//==============================================================================
|
||||
|
||||
#define WHYNTER_BITS 32
|
||||
#define WHYNTER_HDR_MARK 2850
|
||||
#define WHYNTER_HDR_SPACE 2850
|
||||
#define WHYNTER_BIT_MARK 750
|
||||
#define WHYNTER_ONE_MARK 750
|
||||
#define WHYNTER_ONE_SPACE 2150
|
||||
#define WHYNTER_ZERO_MARK 750
|
||||
#define WHYNTER_ZERO_SPACE 750
|
||||
|
||||
//+=============================================================================
|
||||
#if SEND_WHYNTER
|
||||
void IRsend::sendWhynter (unsigned long data, int nbits)
|
||||
{
|
||||
// Set IR carrier frequency
|
||||
enableIROut(38);
|
||||
|
||||
// Start
|
||||
mark(WHYNTER_ZERO_MARK);
|
||||
space(WHYNTER_ZERO_SPACE);
|
||||
|
||||
// Header
|
||||
mark(WHYNTER_HDR_MARK);
|
||||
space(WHYNTER_HDR_SPACE);
|
||||
|
||||
// Data
|
||||
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||
if (data & mask) {
|
||||
mark(WHYNTER_ONE_MARK);
|
||||
space(WHYNTER_ONE_SPACE);
|
||||
} else {
|
||||
mark(WHYNTER_ZERO_MARK);
|
||||
space(WHYNTER_ZERO_SPACE);
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
mark(WHYNTER_ZERO_MARK);
|
||||
space(WHYNTER_ZERO_SPACE); // Always end with the LED off
|
||||
}
|
||||
#endif
|
||||
|
||||
//+=============================================================================
|
||||
#if DECODE_WHYNTER
|
||||
bool IRrecv::decodeWhynter (decode_results *results)
|
||||
{
|
||||
long data = 0;
|
||||
int offset = 1; // skip initial space
|
||||
|
||||
// Check we have the right amount of data
|
||||
if (irparams.rawlen < (2 * WHYNTER_BITS) + 6) return false ;
|
||||
|
||||
// Sequence begins with a bit mark and a zero space
|
||||
if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_BIT_MARK )) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_ZERO_SPACE)) return false ;
|
||||
|
||||
// header mark and space
|
||||
if (!MATCH_MARK (results->rawbuf[offset++], WHYNTER_HDR_MARK )) return false ;
|
||||
if (!MATCH_SPACE(results->rawbuf[offset++], WHYNTER_HDR_SPACE)) return false ;
|
||||
|
||||
// data bits
|
||||
for (int i = 0; i < WHYNTER_BITS; i++) {
|
||||
if (!MATCH_MARK(results->rawbuf[offset++], WHYNTER_BIT_MARK)) return false ;
|
||||
|
||||
if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ONE_SPACE )) data = (data << 1) | 1 ;
|
||||
else if (MATCH_SPACE(results->rawbuf[offset], WHYNTER_ZERO_SPACE)) data = (data << 1) | 0 ;
|
||||
else return false ;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// trailing mark
|
||||
if (!MATCH_MARK(results->rawbuf[offset], WHYNTER_BIT_MARK)) return false ;
|
||||
|
||||
// Success
|
||||
results->bits = WHYNTER_BITS;
|
||||
results->value = data;
|
||||
results->decode_type = WHYNTER;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -31,6 +31,7 @@ sendSharp KEYWORD2
|
||||
sendSharpRaw KEYWORD2
|
||||
sendPanasonic KEYWORD2
|
||||
sendJVC KEYWORD2
|
||||
sendLG KEYWORD2
|
||||
|
||||
#######################################
|
||||
# Constants (LITERAL1)
|
||||
|
||||
16
library.json
16
library.json
@@ -5,8 +5,20 @@
|
||||
"repository":
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/shirriff/Arduino-IRremote.git"
|
||||
"url": "https://github.com/z3t0/Arduino-IRremote.git"
|
||||
},
|
||||
"version": "2.2.1",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "atmelavr"
|
||||
"platforms": "atmelavr",
|
||||
"authors" :
|
||||
[
|
||||
{
|
||||
"name":"Rafi Khan",
|
||||
"email":"zetoslab@gmail.com"
|
||||
},
|
||||
{
|
||||
"name":"Ken Shirriff",
|
||||
"email":"ken.shirriff@gmail.com"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
name=IRremote
|
||||
version=2.0.1
|
||||
author=shirriff
|
||||
maintainer=shirriff
|
||||
version=3.0.0
|
||||
author=shirriff, z3t0 <zetoslab@gmail.com>
|
||||
maintainer=z3t0 <zetoslab@gmail.com>
|
||||
sentence=Send and receive infrared signals with multiple protocols
|
||||
paragraph=Send and receive infrared signals with multiple protocols
|
||||
category=Signal Input/Output
|
||||
url=https://github.com/shirriff/Arduino-IRremote.git
|
||||
category=Communication
|
||||
url=http://z3t0.github.io/Arduino-IRremote/
|
||||
architectures=*
|
||||
|
||||
Reference in New Issue
Block a user