/*****************************************************/   
//  FILE        ランダム関数 スロットマシーンモドキ 
//				7SegLED 3桁 
//	DATE        :Tue, Jan 10, 2025
//	DESCRIPTION : TLR313
//	CPU TYPE    : Arduino UNO 
//		                                    			by Chiyabo 
//	This file is generated by Renesas Project Generator.
/*****************************************************/   
#include "SoftwareSerial.h"
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

// 7SegLED Disp
#define SI  8	
#define SCK 9	
#define RCK 10
#define SEL1 11
#define SEL2 12
#define SEL3 13
// Start/Stop SW
#define Swin 5
#define Start 6
#define Stop 7

#define Timer_Adjust1 313  // 1000ms / 3.2ms = 312.5									                         
#define Timer_Adjust2 625 // 2sec
#define Timer_Adjust3 938 // 3sec
#define Timer_Adjust4 1250 // 4sec
#define Timer_Adjust5 1563 // 5sec
#define Timer_Adjust6 1875 // 6sec

int RandomNumber ;//「RandomNumber」をlongで変数宣言
//char RandamCont = 0 ;
unsigned int Time_Up = 0 ; 
unsigned char Led_Sel ; 
unsigned char Code1 ;   
unsigned char Code2 ;   
unsigned char Code3 ;
unsigned int Timer ;  

char StopNo0 = false ;  
char StopNo1 = false ; 
char StopNo2 = false ; 
char SpOutEnStat ;
char SpOutEn = true ;
char SpOutLevel = 0 ;
char SpOut = 3 ;
char CountStart ;
char SundStart = false ;
                                                                                                         
//const unsigned char Led_Code[ ] = {0x5f,0x50,0x6d,0x79,0x72,0x3b,0x3f,// "0"~"6" 
//                           0x51,0x7f,0x73,0x77,0x3e,0x0f,0x7c,	  // "7"~"d"
//                           0x2f,0x27								           // "e"~"f"
//                          } ;							
int Jr[ ] = { 784, 660, 588, 524, 588, 660 } ;

//int busy_PIN = 9  ;//busyピンはD9に接続
char Mp3No = 2 ;
SoftwareSerial mySoftwareSerial( 4, 3 ) ; // RX, TX
DFRobotDFPlayerMini myDFP ; //インスタンスmyDFPを生成

void setup( ){
  //Serial.begin(9600);	//シリアル通信を9600bpsで初期化
  // 7SegLED  Disp       
  pinMode( SI, OUTPUT ) ;	
  pinMode( SCK, OUTPUT ) ;   
  pinMode( RCK, OUTPUT ) ;
  pinMode( SEL1, OUTPUT ) ; 
  pinMode( SEL2, OUTPUT ) ;
  pinMode( SEL3, OUTPUT ) ;
                                                    
  digitalWrite( SEL1, HIGH ) ;   
  digitalWrite( SEL2, HIGH ) ;   
  digitalWrite( SEL3, HIGH ) ;   
  
  // Start/Stop SW
  pinMode( SpOut, OUTPUT ) ;
  pinMode( Swin, INPUT_PULLUP ) ;
  pinMode( Stop, OUTPUT ) ;		
  pinMode( Start, OUTPUT ) ;		
    
  digitalWrite( Stop, LOW ) ;    
  digitalWrite( Start, LOW ) ;    
  
  // タイマー割り込み設定 
  TCCR1A = 0; // タイマー1動作モードを初期化
  TCCR1B = ( 1 << WGM12 ) | ( 1 << CS11 ) ; // CTCモード 分周比1/8   WGM12 = CS11 = 1
  OCR1A = 1600 - 1 ; // 800μsとなるように設定 
  TIMSK1 = ( 1 << OCIE1A ) ; // タイマー1のAマッチ割り込みを許可   OCIE1A = 1 
  Timer = 0 ;                                                       
  Led_Sel = 0 ;    

 randomSeed(100);	//乱数の種となる数値を100に指定

  mySoftwareSerial.begin( 9600 ) ; //DFPlayer通信用のソフトウェアシリアルを初期化
  if ( !myDFP.begin (mySoftwareSerial ) ){
    //DFPlayerを初期化。2秒以内に初期化できなければエラーメッセージを表示
    //Serial.println( F( "Unable to begin:" ) ) ;
    while( true ) ;
  }
  myDFP.volume( 20 ) ;//ボリュームを25に設定(指定できる値は0~30)
}

void loop() {
  //long RandomNumber;//「RandomNumber」をlongで変数宣言
	  
	if( Timer == 0 ){    // 312Hx 3.2ms毎 
		//if( ++RandamCont >= 30 ){
      		RandomNumber = random( 100, 999 ) ;//乱数の最小値を100、最大値を999に指定
  	  		//Serial.println( RandomNumber ) ;//乱数を送信、改行
      		//RandamCont = 0 ; 
    	//}
    	LED( ) ; 
    	Timer = 4 ; // 800us*4=3.2ms 312Hz 
  	}                
}

// 割込みサービスルーチン                       
ISR( TIMER1_COMPA_vect ){                
  if(Timer > 0 ){                                          
    Timer-- ;                                                 
  }                                                                 
}                                                                  

  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   
  	FunctionName : Led Write Task					
  		Prototype: void LED( void )                   	
  		Function : LED DATA SET	& WRITE
  		Input    : NONE								        
  		Output   : NONE	    						
  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*
void LED( void ){                                                 
  unsigned char	Code ;					
  unsigned char	Change_Code ;     /
  char i ;

  // Disp Off                                        
  digitalWrite( SEL1, HIGH ) ;          
  digitalWrite( SEL2, HIGH ) ;          
  digitalWrite( SEL3, HIGH ) ;          
                                                            
  if( ++Led_Sel >= 3 ){				
      Led_Sel = 0 ;     
  }		
             
  if( digitalRead( Swin ) == 1 ){ // StartSW ON
    StopNo0 = false ; 
    StopNo1 = false ;
    StopNo2 = false ;
    Time_Up = 0 ;
    SpOutEnStat = false ;
    SpOutEn = true ;
    CountStart = true ;
    SundStart = true ; 
    digitalWrite( Start, LOW ) ; 
    digitalWrite( Stop, HIGH ) ;   
    
  }
  if( digitalRead( Swin ) == 0 ){ // StopSW ON
    if( SpOutEnStat == false ){
      if( SundStart == true ){
        myDFP.play( Mp3No ) ;//SDカード内のmp3ファイルを再生
        delay( 100 ) ;
        myDFP.play( Mp3No ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
        if( ++Mp3No >= 14 ){
          Mp3No = 2 ;
        }
        SundStart = false ;     
      }  
      if( StopNo2 == true ){ 
        SpOutEn = false ;
      }
      if( ++Time_Up == Timer_Adjust1 ){  // 1sec
        StopNo0 = true ;
      }
      if( Time_Up == Timer_Adjust3 ){  // 3sec
        StopNo1 = true ;
      }
      if( Time_Up >= Timer_Adjust5 ){  // 5sec
  	    StopNo2 = true ; 
        SpOutEnStat = true ; 
      }
    }
    digitalWrite( Start, HIGH ) ; 
    digitalWrite( Stop, LOW ) ;   
  }

  
  RandomNumber = HexChgDec16( RandomNumber ) ;                    HEXをDEC値に変換する   
  switch( Led_Sel ){									                              					             
    case	0 :													                              					             
      if( StopNo0 == false ){
        Change_Code = ( char )( ( RandomNumber & 0x0f00 ) >> 8 ) ;
        Code1 = ~Led_Code[ Change_Code ] ;	// Test               
      }
      ShiftCode( Code1 ) ;                                        
      digitalWrite( SEL1, LOW ) ;                               
      digitalWrite( SEL2, HIGH ) ;
      digitalWrite( SEL3, HIGH ) ;
    break ;												                                  					             
                                                                      					             
    case	1:													                              					             
      if( StopNo1 == false ){
        Change_Code =( char )( ( RandomNumber & 0x00f0 ) >> 4 ) ;                            
        Code2 = ~Led_Code[ Change_Code ] ;	// Test                     					             
      }
      ShiftCode( Code2 ) ;                                                                    
      digitalWrite( SEL1, HIGH ) ;                                                         
      digitalWrite( SEL2, LOW ) ;                                                            
      digitalWrite( SEL3, HIGH ) ;                                                         
    break ;												                                  					             
                                                                      					             
    case	2:													                              					             
      if( StopNo2 == false ){
        Change_Code =( char )( RandomNumber & 0x000f ) ;                                     
        Code3 = ~Led_Code[ Change_Code ] ;	// Test                     					             
      }
      if( ( SpOutEnStat == true ) && ( CountStart == true ) ){
        if( ( Code1 == Code2) && (  Code2 == Code3 ) ){
          for( i = 0 ; i < 3 ; ++i ){
            myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
            delay( 100 ) ;
            myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象  
            delay( 500 ) ; 
          }
        }
        else if( ( Code1 == Code2) || (  Code1 == Code3 ) || ( Code2 == Code3 ) ){
          for( i = 0 ; i < 2 ; ++i ){
            myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
            delay( 100 ) ;
            myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象  
            delay( 500 ) ; 
          }
        }
        else{
          myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生
          delay( 100 ) ;
          myDFP.play( 1 ) ;//SDカード内のmp3ファイルを再生 ? 不思議な現象
        }
        SpOutEnStat = false ; 
        CountStart = false ;
      }
      ShiftCode( Code3 ) ;                                                                    
      digitalWrite( SEL1, HIGH ) ;                                                         
      digitalWrite( SEL2, HIGH ) ;                                                           
      digitalWrite( SEL3, LOW ) ;                                                          
    break ;												                                  					             
                                                                      					             
    default:													                              					             
    	// Disp Off                                                                          
     	digitalWrite( SEL1, HIGH ) ;                                                         
     	digitalWrite( SEL2, HIGH ) ;                                                         
     	digitalWrite( SEL3, HIGH ) ;                                                          
    break ;												                                  					             
  }																                                  					             
}
                                                                     					             
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */
  	FunctionName : ShiftCode Task									                     
  		Prototype: void ShiftCode( unsigned char )                       
  		Function : LED DATA SET	& WRITE								                   
  		Input    : NONE								                                   
  		Output   : NONE										                               
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ 
void ShiftCode( unsigned char Code ){                                                        
  char  Count ;                                                                              
  unsigned char  Scode ;                                                                     
                                                                                             
  Scode = Code ;                                                                             
  for( Count = 0 ; Count <= 7 ; ++Count ){                                                   
    if( ( Scode & 0x80 ) == 0x80 ){                                                          
      digitalWrite( SI, HIGH ) ;                                                              
    }                                                                                        
    else{                                                                                    
      digitalWrite( SI, LOW ) ;                                                               
    }                                                                                          
    Scode = ( Scode << 1 ) ;                                                                   
    //delayMicroseconds( 5 ) ;                                                                
    digitalWrite( SCK, HIGH ) ;                                                               
    //delayMicroseconds( 5 ) ;                                                                
    digitalWrite( SCK, LOW ) ;                                                                
    //delayMicroseconds( 5 ) ;                                                                
  }                                                                                          
  digitalWrite( RCK, HIGH ) ;                                                                 
  //delayMicroseconds( 5 ) ;                                                                  
  digitalWrite( RCK, LOW ) ;                                                                  
}                                                                                            
 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//	FunctionName : HexChgDec								
//		Prototype: int HexChgDec(unsigned char HexByte)
//		Function : HEXをDEC値に変換する								 
//		Input    : 00h-->ffh										
//    Output   : 変換結果											 
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
int HexChgDec( unsigned char HexByte ){
	unsigned char i ;										
	int Value , Work ;									
  
	i = 0 ;
	Value = Work = 0 ;
	for( Work = 0 ; HexByte >= 0x0a ; Work++ ){
		HexByte = ( HexByte - 0x0a ) ;
	}																
	if( Work >= 0x0a ){							
		for( i = 0 ;  Work >= 0x0a ; i++ ){
			Work = ( Work - 0x0a ) ;						
		}															
	}																
	Value = ( ( i * 0x100 ) + ( Work * 0x10 ) + ( int )HexByte ) ;
	return Value;										
}