| 
				
			 | 
			
			
				
				@@ -4,6 +4,11 @@ 
			 | 
		
		
	
		
			
			| 
				4
			 | 
			
				4
			 | 
			
			
				
				 #include <sysexits.h> 
			 | 
		
		
	
		
			
			| 
				5
			 | 
			
				5
			 | 
			
			
				
				 #include <climits> 
			 | 
		
		
	
		
			
			| 
				6
			 | 
			
				6
			 | 
			
			
				
				 #include <getopt.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				7
			 | 
			
			
				
				+#include <unistd.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				8
			 | 
			
			
				
				+#include <pifacedigital.h> 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				9
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				10
			 | 
			
			
				
				+int MainClass::current_device_ = -1; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				11
			 | 
			
			
				
				+uint8_t MainClass::pins_ = 0; 
			 | 
		
		
	
		
			
			| 
				7
			 | 
			
				12
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				8
			 | 
			
				13
			 | 
			
			
				
				 MainClass::MainClass(int argc, char* argv[]) 
			 | 
		
		
	
		
			
			| 
				9
			 | 
			
				14
			 | 
			
			
				
				   : argc_(argc) 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -71,23 +76,40 @@ bool MainClass::build_actions_() 
			 | 
		
		
	
		
			
			| 
				71
			 | 
			
				76
			 | 
			
			
				
				         return bad_value_(); 
			 | 
		
		
	
		
			
			| 
				72
			 | 
			
				77
			 | 
			
			
				
				       actions_.push_back([arg]() -> bool 
			 | 
		
		
	
		
			
			| 
				73
			 | 
			
				78
			 | 
			
			
				
				           { 
			 | 
		
		
	
		
			
			| 
				74
			 | 
			
				
			 | 
			
			
				
				-          return true; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				
				+          if (get_current_device() != -1) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				
				+            pifacedigital_close(get_current_device()); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				
				+          return pifacedigital_open(set_current_device(arg)) != -1; 
			 | 
		
		
	
		
			
			| 
				75
			 | 
			
				82
			 | 
			
			
				
				           }); 
			 | 
		
		
	
		
			
			| 
				76
			 | 
			
				83
			 | 
			
			
				
				     } 
			 | 
		
		
	
		
			
			| 
				77
			 | 
			
				84
			 | 
			
			
				
				     else if (opt == 'u') 
			 | 
		
		
	
		
			
			| 
				78
			 | 
			
				85
			 | 
			
			
				
				     { 
			 | 
		
		
	
		
			
			| 
				79
			 | 
			
				86
			 | 
			
			
				
				       if (arg > 7) 
			 | 
		
		
	
		
			
			| 
				80
			 | 
			
				87
			 | 
			
			
				
				         return bad_value_(); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				
				+      actions_.push_back([arg]() -> bool 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				
				+          { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				90
			 | 
			
			
				
				+          pifacedigital_write_reg(up_pin(arg), OUTPUT, get_current_device()); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				91
			 | 
			
			
				
				+          return true; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				
				+          }); 
			 | 
		
		
	
		
			
			| 
				81
			 | 
			
				93
			 | 
			
			
				
				     } 
			 | 
		
		
	
		
			
			| 
				82
			 | 
			
				94
			 | 
			
			
				
				     else if (opt == 'd') 
			 | 
		
		
	
		
			
			| 
				83
			 | 
			
				95
			 | 
			
			
				
				     { 
			 | 
		
		
	
		
			
			| 
				84
			 | 
			
				96
			 | 
			
			
				
				       if (arg > 7) 
			 | 
		
		
	
		
			
			| 
				85
			 | 
			
				97
			 | 
			
			
				
				         return bad_value_(); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				98
			 | 
			
			
				
				+      actions_.push_back([arg]() -> bool 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				99
			 | 
			
			
				
				+          { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				
				+          pifacedigital_write_reg(down_pin(arg), OUTPUT, get_current_device()); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				101
			 | 
			
			
				
				+          return true; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				102
			 | 
			
			
				
				+          }); 
			 | 
		
		
	
		
			
			| 
				86
			 | 
			
				103
			 | 
			
			
				
				     } 
			 | 
		
		
	
		
			
			| 
				87
			 | 
			
				104
			 | 
			
			
				
				     else if (opt == 's') 
			 | 
		
		
	
		
			
			| 
				88
			 | 
			
				105
			 | 
			
			
				
				     { 
			 | 
		
		
	
		
			
			| 
				89
			 | 
			
				106
			 | 
			
			
				
				       if (arg > UINT_MAX) 
			 | 
		
		
	
		
			
			| 
				90
			 | 
			
				107
			 | 
			
			
				
				         return bad_value_(); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				108
			 | 
			
			
				
				+      actions_.push_back([arg]() -> bool 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				109
			 | 
			
			
				
				+          { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				110
			 | 
			
			
				
				+          usleep(arg * 1000); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				111
			 | 
			
			
				
				+          return true; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				112
			 | 
			
			
				
				+          }); 
			 | 
		
		
	
		
			
			| 
				91
			 | 
			
				113
			 | 
			
			
				
				     } 
			 | 
		
		
	
		
			
			| 
				92
			 | 
			
				114
			 | 
			
			
				
				     else 
			 | 
		
		
	
		
			
			| 
				93
			 | 
			
				115
			 | 
			
			
				
				       return false; 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -104,3 +126,28 @@ int MainClass::execute() 
			 | 
		
		
	
		
			
			| 
				104
			 | 
			
				126
			 | 
			
			
				
				       return 1; 
			 | 
		
		
	
		
			
			| 
				105
			 | 
			
				127
			 | 
			
			
				
				   return 0; 
			 | 
		
		
	
		
			
			| 
				106
			 | 
			
				128
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				129
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				130
			 | 
			
			
				
				+int MainClass::get_current_device() 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				131
			 | 
			
			
				
				+{ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				132
			 | 
			
			
				
				+  return current_device_; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				133
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				134
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				135
			 | 
			
			
				
				+int MainClass::set_current_device(int c) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				136
			 | 
			
			
				
				+{ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				137
			 | 
			
			
				
				+  return (current_device_ = c); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				138
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				139
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				140
			 | 
			
			
				
				+uint8_t MainClass::get_pins() 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				141
			 | 
			
			
				
				+{ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				142
			 | 
			
			
				
				+  return pins_; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				143
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				144
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				145
			 | 
			
			
				
				+uint8_t MainClass::up_pin(uint8_t pin) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				146
			 | 
			
			
				
				+{ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				147
			 | 
			
			
				
				+  return (pins_ |= (1 << pin)); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				148
			 | 
			
			
				
				+} 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				149
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				150
			 | 
			
			
				
				+uint8_t MainClass::down_pin(uint8_t pin) 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				151
			 | 
			
			
				
				+{ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				152
			 | 
			
			
				
				+  return (pins_ &= ~(1 << pin)); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				153
			 | 
			
			
				
				+} 
			 |