public static void Main() { // Instantiate a new web server on port 80. WebServer server = new WebServer(80); // Add a handler for commands that are received by the server. server.CommandReceived += new WebServer.CommandReceivedHandler(server_CommandReceived); // Add a command that the server will parse. // Any command name is allowed; you will decide what the command does // in the CommandReceived handler. The server will only fire CommandReceived // for commands that are defined here and that are called with the proper // number of arguments. // In this example, I define a command 'setLed', which needs one argument (on/off). // With this statement, I defined that we can call our server on (for example) // http://[server-ip]/setled/on // http://[server-ip]/setled/off server.AllowedCommands.Add(new WebCommand("setled", 1)); // Start the server. server.Start(); // Make sure Netduino keeps running. while (true) { Debug.Print("Netduino still running..."); Thread.Sleep(10000); } }
public static void Main() { // Onboard LED onboardLed = new OutputPort(Pins.ONBOARD_LED, false); // Watchdog watchdog = new OutputPort(Pins.GPIO_PIN_D8, false); // Get network time DateTimeSetter.SetTimeFromNTPWhenPossible(); // Event log eventLogger = new EventLogger(@"events.txt", @"debug.txt"); // Settings settingsDb = new SettingsDb(@"Settings.txt"); // RFID reader rfidReader = new RFIDReader(); // RFID Tag Database rfidTagDb = new RfidTagDb(@"TagIds.txt"); // Door strikes mainDoorStrike = new DoorStrike(Pins.GPIO_PIN_D1, Pins.GPIO_PIN_D4); innerDoorStrike = new DoorStrike(Pins.GPIO_PIN_D0, Pins.GPIO_NONE); // Tap decoder tapDecoder = new TapDecoder(NUM_DIGITS_IN_CODE, Pins.GPIO_PIN_D5); // Instantiate a new web server on port 80. WebServer server = new WebServer(80); // Add a handler for commands that are received by the server. server.CommandReceived += new WebServer.CommandReceivedHandler(server_CommandReceived); // Command to receive the index page server.AllowedCommands.Add(new WebCommand("", 0)); server.AllowedCommands.Add(new WebCommand("setup", 0)); server.AllowedCommands.Add(new WebCommand("setup.html", 0)); server.AllowedCommands.Add(new WebCommand("status", 0)); server.AllowedCommands.Add(new WebCommand("addtag", 1)); server.AllowedCommands.Add(new WebCommand("testtag", 1)); server.AllowedCommands.Add(new WebCommand("main-unlock", 0)); server.AllowedCommands.Add(new WebCommand("main-lock", 0)); server.AllowedCommands.Add(new WebCommand("inner-unlock", 0)); server.AllowedCommands.Add(new WebCommand("inner-lock", 0)); server.AllowedCommands.Add(new WebCommand("submit-settings", 1)); server.AllowedCommands.Add(new WebCommand("get-settings", 0)); server.AllowedCommands.Add(new WebCommand("get-tags", 0)); server.AllowedCommands.Add(new WebCommand("get-events", 0)); server.AllowedCommands.Add(new WebCommand("get-debug", 0)); // Start the server. server.Start(); // loop forever... while (true) { // Toggle LED onboardLedCount++; if (onboardLedCount > onboardLedRate) { onboardLedCount = 0; onboardLed.Write(!onboardLed.Read()); } // Pulse watchdog to keep alive - but only if a web command received recently // otherwise allow the watchdog to reset the device if (DateTime.Now < timeOfLastWebCommandRx + timeoutOnWebCommandRx) { watchdog.Write(true); Thread.Sleep(1); watchdog.Write(false); } // Service the rfid reader - this allows it to get characters and interpret them rfidReader.Service(); // Service the door strikes - allowing them to time-out, etc mainDoorStrike.Service(); innerDoorStrike.Service(); // Check if there is a tag present bool tagPresentStatus = false; if (DateTime.Now > rfidCheckLoopTimer + timeoutOnRfidCheckLoop) { String tagId = rfidReader.GetRFIDTagId(); // Test code to inject a tag if (tagId.Length == 0) { if (testTagId.Length > 0) { tagId = testTagId; if (DateTime.Now > testTimer + timeoutOnTest) { testTagId = ""; } } } // Door strike action if (tagId.Length > 0) { tagPresentStatus = true; string holderName = ""; bool isEnabled = false; if (rfidTagDb.IsTagKnown(tagId, out holderName, out isEnabled)) { if (isEnabled) { // Unlock main door - and log event if it was previously locked if (mainDoorStrike.Unlock(settingsDb.mainAutoTimeout)) eventLogger.LogEntryEvent(tagId, holderName); // Unlock inner too innerDoorStrike.Unlock(settingsDb.innerAutoTimeout); } } //Debug.Print(tagID); } rfidCheckLoopTimer = DateTime.Now; } // Check for state changes and broadcast status message if so bool stateChange = tagPresentStatus || tapDecoder.IsTapperPressed(); stateChange |= (mainDoorLastLockState != mainDoorStrike.IsLocked()); stateChange |= (innerDoorLastLockState != mainDoorStrike.IsLocked()); stateChange |= (mainDoorLastOpenState != mainDoorStrike.IsOpen()); if (stateChange) { // Check we don't broadcast constantly if ((DateTime.Now > lastStatusBroadcastTime + STATUS_BROADCAST_TIMEOUT)) { BroadcastStatus.Send(GetStatusString()); lastStatusBroadcastTime = DateTime.Now; mainDoorLastLockState = mainDoorStrike.IsLocked(); innerDoorLastLockState = mainDoorStrike.IsLocked(); mainDoorLastOpenState = mainDoorStrike.IsOpen(); } } // The following code attempts to emulate the "tap-lock" that I previously // implemented // Check for tapper if (tapDecoder.IsCodeReady()) { int theCode = tapDecoder.GetCode(); Debug.Print("Code is " + theCode.ToString()); // Currently the code is fixed here - but the digit 0 isn't valid so this // needs to be changed to a 4 digit code using digits 1..9 if (theCode == 0000) { // Unlock main door - and log event if it was previously locked if (mainDoorStrike.Unlock(settingsDb.mainAutoTimeout)) eventLogger.LogEntryEvent("Tapper", "Unknown"); // Unlock inner too innerDoorStrike.Unlock(settingsDb.innerAutoTimeout); } eventLogger.LogDebug("Code Entry " + theCode, tapDecoder.GetTapTimingsStr()); tapDecoder.Reset(); } } }