| 
									
										
										
										
											2020-10-16 08:24:19 +02:00
										 |  |  | #!rsc by RouterOS | 
					
						
							|  |  |  | # RouterOS script: mode-button | 
					
						
							|  |  |  | # Copyright (c) 2018-2020 Christian Hesse <mail@eworm.de> | 
					
						
							|  |  |  | # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # act on multiple mode and reset button presses | 
					
						
							|  |  |  | # https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :global ModeButton; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :global LogPrintExit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :set ($ModeButton->"count") ($ModeButton->"count" + 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :local Scheduler [ / system scheduler find where name="ModeButtonScheduler" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :if ([ :len $Scheduler ] = 0) do={ | 
					
						
							|  |  |  |   $LogPrintExit info ("Creating scheduler ModeButtonScheduler, counting presses...") false; | 
					
						
							|  |  |  |   :global ModeButtonScheduler do={ | 
					
						
							|  |  |  |     :global ModeButton; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     :global LogPrintExit; | 
					
						
							|  |  |  |     :global ModeButtonScheduler; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 21:24:59 +02:00
										 |  |  |     :local LEDInvert do={ | 
					
						
							| 
									
										
										
										
											2020-10-23 21:33:38 +02:00
										 |  |  |       :global ModeButtonLED; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 21:24:59 +02:00
										 |  |  |       :global IfThenElse; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-23 21:33:38 +02:00
										 |  |  |       :local LED [ / system leds find where leds=$ModeButtonLED type~"^(on|off)\$" interface=[] ]; | 
					
						
							| 
									
										
										
										
											2020-10-23 21:24:59 +02:00
										 |  |  |       :if ([ :len $LED ] = 0) do={ | 
					
						
							|  |  |  |         :return false; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       / system leds set type=[ $IfThenElse ([ get $LED type ] = "on") "off" "on" ] $LED; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 08:24:19 +02:00
										 |  |  |     :local Count ($ModeButton->"count"); | 
					
						
							|  |  |  |     :local Code ($ModeButton->[ :tostr $Count ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     :set ($ModeButton->"count") 0; | 
					
						
							|  |  |  |     :set ModeButtonScheduler; | 
					
						
							|  |  |  |     / system scheduler remove ModeButtonScheduler; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     :if ([ :len $Code ] > 0) do={ | 
					
						
							|  |  |  |       $LogPrintExit info ("Acting on " . $Count . " mode-button presses: " . $Code) false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 22:18:22 +02:00
										 |  |  |       :for I from=1 to=$Count do={ | 
					
						
							| 
									
										
										
										
											2020-10-23 21:24:59 +02:00
										 |  |  |         $LEDInvert; | 
					
						
							| 
									
										
										
										
											2020-10-22 22:18:22 +02:00
										 |  |  |         :if ([ / system routerboard settings get silent-boot ] = false) do={ | 
					
						
							| 
									
										
										
										
											2020-10-16 08:24:19 +02:00
										 |  |  |           :beep length=200ms; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-10-23 16:01:21 +02:00
										 |  |  |         :delay 200ms; | 
					
						
							| 
									
										
										
										
											2020-10-23 21:24:59 +02:00
										 |  |  |         $LEDInvert; | 
					
						
							| 
									
										
										
										
											2020-10-22 22:18:22 +02:00
										 |  |  |         :delay 200ms; | 
					
						
							| 
									
										
										
										
											2020-10-16 08:24:19 +02:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       [ :parse $Code ]; | 
					
						
							|  |  |  |     } else={ | 
					
						
							|  |  |  |       $LogPrintExit info ("No action defined for " . $Count . " mode-button presses.") false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   / system scheduler add name="ModeButtonScheduler" \ | 
					
						
							|  |  |  |       on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; | 
					
						
							|  |  |  | } else={ | 
					
						
							|  |  |  |   $LogPrintExit debug ("Updating scheduler ModeButtonScheduler...") false; | 
					
						
							|  |  |  |   / system scheduler set $Scheduler start-time=[ /system clock get time ]; | 
					
						
							|  |  |  | } |