/****************************************************/
//  FILE       TOSIBA TVリモコン (メカ接点方式)
//  DATE        :Tue, Jan 10, 2025                                
//  DESCRIPTION : IrDa TLN105B       
//  CPU TYPE    : Arduino UNO  
//                                    by chiyabo
//  This file is generated by Renesas Project Generator.
/****************************************************/
#include < IRremote.hpp > // include the library 
 
#define BAUDRATE 9600 
#define SEND_IrDa_PIN 4
#define MaxKey 8 // Maxキーの数 
#define sRepeats 0 // Repeet Num 
#define KeyShift A2

char ChgKey = false ;
char Trg = false ;

uint8_t OutCommand ;
unsigned int OutAddress = 0xBF40 ; 

const int threshold[ ] = { 128, 281, 376, 522, 684, 820, 909, 1011 } ; // AD変換値の閾値
// analogRead( A0 )
const unsigned char KeySelCode_A01[ ] = { 0x12, 0x7A, 0x00, 0x1B, 0x3E, 0x1A, 0x3D, 0x5B } ; //ChgKey = false 
const unsigned char KeySelCode_A02[ ] = { 0x12, 0x7C, 0x00, 0x1F, 0x3F, 0x1E, 0x27, 0x5F } ; //ChgKey = true 
// analogRead( A1 )
const unsigned char KeySelCode_A11[ ] = { 0x28, 0x3B, 0x73, 0x74, 0x2E, 0x2D, 0x57, 0x00 } ; //ChgKey = false
const unsigned char KeySelCode_A12[ ] = { 0x6E, 0x3C, 0x75, 0x76, 0x2C, 0x50, 0x10, 0x00 } ; //ChgKey = true 

void setup( ){
    Serial.begin( BAUDRATE ) ;
     
    pinMode( KeyShift, OUTPUT ) ;
    digitalWrite( KeyShift, HIGH ) ;
    IrSender.begin( SEND_IrDa_PIN ) ; 
}                                     
                                      
void loop( ){                         
    int LastResult_A0 = -2 ; // 前回のキーデコード結果
    int Result_A0 ;          // 今回のキーデコード結果   
        
    int LastResult_A1 = -2 ; // 前回のキーデコード結果
    int Result_A1 ;          // 今回のキーデコード結果   
            
    // キーを読み取る。 チャタリングの除去などのため、A/D変換の値が落ち着くまで待つ
    // 10ms間隔でキーを読み取り、同じキーが押されていたら、落ち着いたと判断する           
    Result_A0 = KeyDecode( analogRead( A0 ) ) ;
    if( Result_A0 != -1 ){
        LastResult_A0 = Result_A0 ;
        delay( 10 ) ; 
        Result_A0 = KeyDecode( analogRead( A0 ) ) ;
        if( Result_A0 == LastResult_A0 ){ 
            // Key確定
            if( ( Result_A0 == 1 ) || ( Result_A0 == 2 ) ){
                if( ( Result_A0 == 1 ) && ( Trg == true ) ){
                    Trg = false ;     
                    OutCommand = KeySelCode_A02[ Result_A0 ] ;  
                }
                else if( ( Result_A0 == 1 ) && ( Trg == false ) ){
                    Trg = true ;   
                    OutCommand = KeySelCode_A01[ Result_A0 ] ;
                }
                if( ( Result_A0 == 2 ) && ( ChgKey == true ) ){
                    ChgKey = false ;     
                    digitalWrite( KeyShift, HIGH ) ;   
                }
                else if( ( Result_A0 == 2 ) && ( ChgKey == false ) ){
                    ChgKey = true ;   
                    digitalWrite( KeyShift, LOW ) ;
                }
                delay( 100 ) ;   
            }
            else if( ChgKey == false ){
                OutCommand = KeySelCode_A01[ Result_A0 ] ;  
            }
            else{
                OutCommand = KeySelCode_A02[ Result_A0 ] ;     
            }        
            if( Result_A0 != 2 ){
                IrSender.sendNEC( OutAddress, OutCommand, sRepeats ) ;
            }
        }                   
    }                                

    Result_A1 = KeyDecode( analogRead( A1 ) ) ;
    if( Result_A1 != -1 ){
        LastResult_A1 = Result_A1 ;
        delay( 10 ) ; 
        Result_A1 = KeyDecode( analogRead( A1 ) ) ;
        if( Result_A1 == LastResult_A1 ){ 
            // Key確定
            if( ChgKey == false ){
                OutCommand = KeySelCode_A11[ Result_A1 ] ;  
                if( ( Result_A1 == 0 ) || ( Result_A1 >= 4 ) ){
                    OutAddress = 0xBE40 ;      
                }
            }
            else{
                OutCommand = KeySelCode_A12[ Result_A1 ] ;     
                if( Result_A1 == 4 ){
                    OutAddress = 0xBE40 ;      
                }    
            }        
            IrSender.sendNEC( OutAddress, OutCommand, sRepeats ) ;
            OutAddress = 0xBF40 ;
        }                   
    }                                
    delay( 200 ) ;   
}                  

// キーデコード関数
// 引数をA/D変換結果(0~1023)にして呼ぶと、押したキーの番号(0~KeyNum-1)を返す。
// 何もキーを押していない時は、-1を返す。
int KeyDecode( int n ){
    int i = 0 ;
    
    while( ( i < MaxKey ) && ( n > threshold[ i ] ) ) i++ ;
    if( i >= MaxKey ) return -1 ;
    return i ; 
}