// リフロートースター
// ATtiny85 with ArduinoIDE
// FUSE H=0xDF L=0xE2 E=0xFF
// InternalOSC=8MHz

#define SW_ON  LOW
#define SW_OFF HIGH

// ピンアサイン
#define SP_B2  0
#define SP_B1  1
#define LOCKIN 2
#define START1 3
#define START2 4

// 設定温度(メモ)
#define SP1_TEMP 25 
#define SP2_TEMP 150
#define SP3_TEMP 210
#define SP4_TEMP 110

// 保持時間
#define SP1_HOLD 0
#define SP2_HOLD 90
#define SP3_HOLD 60
#define SP4_HOLD 60

void setup( void )
{
  pinMode( SP_B1 , OUTPUT ); digitalWrite( SP_B1 , LOW  );
  pinMode( SP_B2 , OUTPUT ); digitalWrite( SP_B2 , LOW  );
  pinMode( LOCKIN, INPUT  ); digitalWrite( LOCKIN, HIGH );
  pinMode( START1, INPUT  ); digitalWrite( START1, HIGH );
  pinMode( START2, INPUT  ); digitalWrite( START2, HIGH );

  delay(4000);  
  temp_set( 1 ); delay(2000);    // SP1 常温
  temp_set( 2 ); delay(2000);    // SP2 余熱
  temp_set( 3 ); delay(2000);    // SP3 はんだ付け
  temp_set( 4 ); delay(2000);    // SP4 乾燥
}

void temp_set( int mode )
{
  switch( mode ){
    default:
    case 1: // SP1
      digitalWrite(SP_B1, LOW ); digitalWrite(SP_B2, LOW ); break;
    case 2: // SP2
      digitalWrite(SP_B1, HIGH); digitalWrite(SP_B2, LOW ); break;
    case 3: // SP3
      digitalWrite(SP_B1, LOW ); digitalWrite(SP_B2, HIGH); break;
    case 4: // SP4
      digitalWrite(SP_B1, HIGH); digitalWrite(SP_B2, HIGH); break;
  }
}

int Sw1_val, Sw1_cnt, Sw2_val, Sw2_cnt;

void loop( void )
{
  Sw1_val = Sw1_cnt = Sw2_val = Sw2_cnt = 0;
  temp_set( 1 );  // SP1

  while(1){
    Sw1_val = digitalRead( START1 );
    if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0; 
    if( Sw1_cnt == 500 ){ Sw1_cnt = 0; program_line1(); temp_set(1); delay(2000); }

    Sw2_val = digitalRead( START2 );
    if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0; 
    if( Sw2_cnt == 500 ){ Sw2_cnt = 0; program_line2(); temp_set(1); delay(2000); }

    delay(1);
  }
}

void program_line1( void )
{
  unsigned long end_time;
  
  Sw1_val = Sw1_cnt = 0;
  
  // SP2 余熱温度をセット
  temp_set( 2 ); delay( 2000 );
    
  // 目標温度まで待機    
  while( digitalRead(LOCKIN) != SW_ON ){
    Sw1_val = digitalRead( START1 );  // ボタンが押されたら中止
    if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;     
    if( Sw1_cnt == 200 ) return;
    delay(1);
  }
  
  // ホールド
  end_time = millis() + (unsigned long)1000*SP2_HOLD;
  while( end_time > millis() ){
    Sw1_val = digitalRead( START1 );
    if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;     
    if( Sw1_cnt == 200 ) return;
    delay(1);
  }
  
  // SP3 はんだ付け温度をセット
  temp_set( 3 ); delay(2000);
  
  // 目標温度になるまで待機    
  while( digitalRead(LOCKIN) != SW_ON ){
    Sw1_val = digitalRead( START1 );
    if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;     
    if( Sw1_cnt == 200 ) return; 
    delay(1);
  }

  // ホールド
  end_time = millis() + (unsigned long)1000*SP3_HOLD;
  while( end_time > millis() ){
    Sw1_val = digitalRead( START1 );
    if( Sw1_val == LOW ) Sw1_cnt++; else Sw1_cnt = 0;     
    if( Sw1_cnt == 200 ) return;
    delay(1);
  }
}

void program_line2( void )
{
  unsigned long end_time;
  
  Sw2_val = Sw2_cnt = 0;
  
  // SP2 乾燥温度をセット
  temp_set( 4 ); delay( 2000 );
  
  // ボタンを離すのを待つ
  while( digitalRead(START2) == SW_ON ) delay(100);
  
  // 目標温度まで待機    
  while( digitalRead(LOCKIN) != SW_ON ){
    Sw2_val = digitalRead( START2 );
    if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0;     
    if( Sw2_cnt == 200 ) return; // ボタンで中断
    delay(1);
  }
  
  // ホールド時間
  end_time = millis() + (unsigned long)1000*SP4_HOLD;
  while( end_time > millis() ){
    Sw2_val = digitalRead( START2 );
    if( Sw2_val == LOW ) Sw2_cnt++; else Sw2_cnt = 0;     
    if( Sw2_cnt == 200 )return; // ボタンで中断
    delay(1);
  }
}