internal GpioPort DeviceGet(Cpu.Pin pin, bool writeTraceOnError) { // If pin as index is out of range of the _ports array, then we return GpioPortNull for that index // In particular it happens for GPOI_PORT_NONE ( -1 ) if ((int)pin < 0 || (int)pin >= _ports.Length) { return(new GpioPortNull(pin, GpioPortMode.None)); } GpioPort port = _ports[(int)pin]; if (port == null) { port = new GpioPortNull(pin); _ports[(int)pin] = port; } if (writeTraceOnError && port is GpioPortNull) { GpioPortNull nullPort = (GpioPortNull)port; if (nullPort.DisplayWarning || Emulator.Verbose) { Trace.WriteLine("Warning: System attempts to access a GPIO port at pin " + pin + " that was not configured."); nullPort.TurnOffWarning(); } } return(port); }
internal override void UnregisterInternal(EmulatorComponent ec) { GpioPort gpioPort = ec as GpioPort; if (gpioPort != null) { Debug.Assert(_ports[(int)gpioPort.Pin] == gpioPort); _ports[(int)gpioPort.Pin] = null; _validPorts.Remove(gpioPort); base.UnregisterInternal(ec); } }
internal override void RegisterInternal(EmulatorComponent ec) { GpioPort port = ec as GpioPort; if (port == null) { throw new Exception("Attempt to register a non GpioPort with GpioPortCollection."); } Cpu.Pin pin = port.Pin; Debug.Assert(!(port is GpioPortNull)); if (Exists(pin)) { throw new Exception("GPIO port " + pin + " is already set."); } _ports[(int)pin] = port; _validPorts.Add(port); base.RegisterInternal(ec); }
internal bool Exists(Cpu.Pin pin) { GpioPort port = _ports[(int)pin]; return((port != null) && ((port is GpioPortNull) == false)); }