//****************************************************************************
//
// LED blink example
//
//****************************************************************************

#configure board        hu_arm_v4
#configure clcd_lines   2
#configure memory       rom
#configure baudrate     38400

class output_pin {
public:
   virtual void set( bool x ) = 0; 
};

class pin_lpc2: public output_pin {
private:
   unsigned int n;
public: 
   pin_lpc2( unsigned int n ): n( n ) { mkt_pin_configure( n, mkt_output ); }
   void set( bool x ) { mkt_pin_write( n, x ); }
};

class lpc2148 {
public:
   pin_lpc2 pio0_4;
   pin_lpc2 pio0_6;
   pin_lpc2 pio0_16;
   pin_lpc2 pio0_31;  
   
   lpc2148(): 
      pio0_4( 4 ), 
	  pio0_6( 6 ), 
	  pio0_16( 16 ), 
	  pio0_31( 31 ) 
   {}
};	

class tee : public output_pin {
private:

   output_pin & first, & second;
public:   

   tee( 
      output_pin & first, 
	  output_pin & second 
   ): 
      first( first ), second( second )
   {}
   
   void set( bool x ){ 
      first.set( x ); 
	  second.set( x ); 
   }
};
              
class invert : public output_pin {
private:

   output_pin & pin;
public:   

   invert( output_pin & pin ): pin( pin ){} 
   
   void set( bool x ){ pin.set( !x ); } 
   
};
              
void blink( output_pin &led, unsigned int delay = 200 * 1000 ){
    for(;;){
       led.set( 1 );
       mkt_wait_us( delay );
       led.set( 0 );
       mkt_wait_us( delay );
   }      
};

int main( void ){ 
   lpc2148 target;
   invert led_inverted( target.pio0_31 );
   blink( led_inverted );
}


