This library implements RC6 (protocol used by some philips remotes). It has a receiver class and a transmitter class. Currently, only mode 0 is supported. It is tested with my DVD/HDD recorder.

Rc6.h

Committer:
hilgo
Date:
2011-02-27
Revision:
0:f8e2ed766064

File content as of revision 0:f8e2ed766064:

/* mbed RC6 (Philips remote control protocol) library
 * Copyright (c) 2011 Jeroen Hilgers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 
 #ifndef __RC6_H__
 #define __RC6_H__
 
 #include "mbed.h"

/** RC6 (Philips remote control) receiver / transmitter library.
  *
  * Example: Code receiver for 'play/pause' on remote for Philips HDD&DVD recorder.
  * 
  * Leader  |S3|S2|S1|S0|Togl|A7|A6|A5|A4|A3|A2|A1|A0|D7|D6|D5|D4|D3|D2|D1|D0|
  *         |1 |0 |0 |0 |1   |0 |0 |1 |1 |0 |0 |1 |0 |0 |0 |1 |0 |1 |1 |0 |0 |
  *         |  |  |  |  |    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
  * ------  |- | -| -| -|--  | -| -|- |- | -| -|- | -| -| -|- | -|- |- | -| -|
  *       --| -|- |- |- |  --|- |- | -| -|- |- | -|- |- |- | -|- | -| -|- |- |
  *         |  |  |  |  |    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
  *
  * The toggle bit is in bit 16, A7-A0 in bits 15-8, D7-D0 in bits 7-0.
  * Thus for the example, 0x1322C is returned. S3..S0 are not implemented
  * and received / transmitted as shown in the example.
  */
  
 class Rc6Transmitter
 {
    public:
        /** Create a Rc6Transmitter and initizalize it.
         *
         * @param pin irPin pin connected IR Led (led on on high level).
         */
        Rc6Transmitter(PinName irPin);

        /** Send a code once. 
         * The function will return synchronously and send the code once. 
         *
         * @param code Code to send.
         */
        void Send(uint32_t code);
        
        /** Check if the transmitter is idle.
         * 
         * @return True if transmitter still busy.
         */
        bool IsBusy();
    
    private:
        void Tick();
    
        bool mBusy;
        uint16_t mPattern[50];  // 1 leader, 4 startbits, 1 toggle bit, 16 data bits ==>
                                // at most 24 mark / pause durations + 0,0 terminator = 50 entries. 
        Ticker mTicker;
        uint16_t mMark;          // Tick: Remaining half-cycles of mark.
        uint16_t mPause;         // Tick: Remaining half-cycles of pause.        
        uint16_t *mPatPtr;       // Transitter pointer.
        DigitalOut mOut;     // Pin connected to IR.
};
 
 class Rc6Receiver
 {
    public:
        /** Create a Rc6Receiver and initizalize it.
         *
         * @param pin irPin pin connected to IR sensor (low level when IR is received, e.g. TSOP1736).
         */
        Rc6Receiver(PinName irPin);

        /** Check if anything was received since last poll. Returns 0xFFFFFFFF if not.
         *
         * @return Last code received or 0xFFFFFFFF if nothing was received since last poll.
         */
        uint32_t Receive();
        
    private:
        InterruptIn irq;
        void OnRise();
        void OnFall();
        void OnTimeout();
        Timeout mTimeout;
        Timer mTimer;
        bool mBusy;
        uint32_t mCode;  
        uint32_t mLastCode;
 };
  
 #endif // __RC6_H__