/// <summary> /// Create the port /// </summary> /// <param name="layer">the brick layer</param> /// <param name="port">the port name</param> internal OutputPort(ChainLayer layer, OutputPortName port) { Layer = layer; Name = port; Status = PortStatus.Empty; Number = port.AbsolutePortNumber(layer); }
/// <summary> /// This function enables specifying the output device type /// </summary> /// <param name="socket">socket for executing command to brick</param> /// <param name="layer">Specify chain layer number [0 - 3]</param> /// <param name="port">Port number [0 - 3]</param> /// <param name="type">Output device type, (0x07: Large motor, Medium motor = 0x08)</param> /// <param name="requireReply">indicate if the brick should respond OK on method call</param> /// <remarks> /// Instruction opOutput_Set_Type (LAYER, NO, TYPE) /// Opcode 0xA1 /// Arguments (Data8) LAYER – Specify chain layer number [0 - 3] /// (Data8) NO – Port number [0 - 3] /// (Data8) TYPE – Output device type, (0x07: Large motor, Medium motor = 0x08) /// Dispatch status Unchanged /// Description This function enables specifying the output device type /// </remarks> public static async Task SetType(ISocket socket, ChainLayer layer, OutputPortName port, DeviceType type, bool requireReply = true) { Command cmd = null; using (CommandBuilder cb = new CommandBuilder(requireReply ? CommandType.DIRECT_COMMAND_REPLY : CommandType.DIRECT_COMMAND_NO_REPLY)) { cb.OpCode(OP.opOUTPUT_SET_TYPE); cb.SHORT((int)layer); cb.SHORT((int)port); cb.PAR8((byte)type); cmd = cb.ToCommand(); } await socket.Execute(cmd); }
/// <summary> /// This function enables the program to read the tacho count as sensor input. /// </summary> /// <param name="socket">socket for executing command to brick</param> /// <param name="layer">Specify chain layer number [0 - 3]</param> /// <param name="ports">Output bit field [0x00 – 0x0F]</param> /// <remarks> /// Instruction opOutput_Get_Count (LAYER, NOS, *TACHO) /// Opcode 0xB3 /// Arguments (Data8) LAYER – Specify chain layer number [0 - 3] /// (Data8) NOS – Output bit field [0x00 – 0x0F] /// (Data32) *TACHO – Tacho count as sensor value /// Dispatch status Unchanged /// Description This function enables the program to read the tacho count as sensor input. /// </remarks> public static async Task <int> GetTachoCount(ISocket socket, ChainLayer layer, OutputPortName port) { Command cmd = null; using (CommandBuilder cb = new CommandBuilder(CommandType.DIRECT_COMMAND_REPLY, 4, 0)) { cb.OpCode(OP.opOUTPUT_GET_COUNT); cb.PAR8((byte)layer); cb.PAR8((byte)port); cb.VARIABLE_PAR32(0, PARAMETER_VARIABLE_SCOPE.GLOBAL); cmd = cb.ToCommand(); } Response response = await socket.Execute(cmd); return(BitConverter.ToInt32(response.PayLoad, 0)); }
/// <summary> /// Read information about external device /// </summary> /// <param name="port"></param> /// <param name="layer"></param> /// <returns></returns> public async Task <Format> GetFormat(OutputPortName port, ChainLayer layer = ChainLayer.One) { int portNumber = port.AbsolutePortNumber(layer); return(await InputMethods.GetFormat(Brick.Socket, layer, portNumber)); }
public static int AbsolutePortNumber(this OutputPortName port, ChainLayer layer) { return((((int)layer * 4) + 16) + (int)port); }
public static OutputPortFlag ToFlag(this OutputPortName port) { return((OutputPortFlag)(1 << (int)port)); //convert to bitfield e.g. 0010 equals port 2 }
public async Task Initialize() { Entries = new List <ConfigEntry>(); IEnumerable <PortInfo> ports = await Manager.Brick.Console.PortScan(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { sb.AppendLine($"Brick {(ChainLayer)i}"); int start = i * 4; int end = start + 4; IEnumerable <PortInfo> inputPorts = ports.Where(p => p.Number >= start && p.Number < end); foreach (PortInfo portInfo in inputPorts) { InputPortName name = (InputPortName)portInfo.Number - start; if (portInfo.Status == PortStatus.OK) { ConfigEntry entry = new ConfigEntry { Layer = i, PortName = name.ToString(), Type = portInfo.Device.Value, }; Entries.Add(entry); sb.AppendLine($"\tPort {name} - {portInfo.Status} - {portInfo.Device}"); } else { sb.AppendLine($"\tPort {name} - {portInfo.Status}"); } } start += 16; end = start + 4; IEnumerable <PortInfo> outputPorts = ports.Where(p => p.Number >= start && p.Number < end); foreach (PortInfo portInfo in outputPorts) { OutputPortName name = (OutputPortName)portInfo.Number - start; if (portInfo.Status == PortStatus.OK) { ConfigEntry entry = new ConfigEntry { Layer = i, PortName = name.ToString(), Type = portInfo.Device.Value, }; Entries.Add(entry); sb.AppendLine($"\tPort {name} - {portInfo.Status} - {portInfo.Device}"); } else { sb.AppendLine($"\tPort {name} - {portInfo.Status}"); } } } textBoxDeviceList.Text = sb.ToString(); }
public static void Connect(IOPort brickPorts, List <DeviceOptions> devices) { foreach (DeviceOptions device in devices) { ChainLayer layer = device.Layer; switch (device.Type) { case DeviceType.MediumMotor: { OutputPortName port = (OutputPortName)Enum.Parse(typeof(OutputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadMediumMotor(device.Id).Connect(brickPorts.Output.Ports[portNumber]); break; } case DeviceType.LargeMotor: { OutputPortName port = (OutputPortName)Enum.Parse(typeof(OutputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadLargeMotor(device.Id).Connect(brickPorts.Output.Ports[portNumber]); break; } case DeviceType.TouchSensor: { InputPortName port = (InputPortName)Enum.Parse(typeof(InputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadTouchSensor(device.Id).Connect(brickPorts.Input.Ports[portNumber]); break; } case DeviceType.ColorSensor: { InputPortName port = (InputPortName)Enum.Parse(typeof(InputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadColorSensor(device.Id).Connect(brickPorts.Input.Ports[portNumber]); break; } case DeviceType.GyroscopeSensor: { InputPortName port = (InputPortName)Enum.Parse(typeof(InputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadGyroscopeSensor(device.Id).Connect(brickPorts.Input.Ports[portNumber]); break; } case DeviceType.InfraredSensor: { InputPortName port = (InputPortName)Enum.Parse(typeof(InputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadInfraredSensor(device.Id).Connect(brickPorts.Input.Ports[portNumber]); break; } case DeviceType.UltrasonicSensor: { InputPortName port = (InputPortName)Enum.Parse(typeof(InputPortName), device.Port, true); int portNumber = port.AbsolutePortNumber(layer); LoadUltrasonicSensor(device.Id).Connect(brickPorts.Input.Ports[portNumber]); break; } } } }
/// <summary> /// /// </summary> /// <param name="id"></param> /// <param name="outputPort"></param> /// <param name="polarity"></param> /// <param name="layer"></param> public void AddMediumMotor(string id, OutputPortName outputPort, Polarity?polarity = null, ChainLayer layer = ChainLayer.One) { AddDevice(id, DeviceType.MediumMotor, outputPort.ToString(), polarity?.ToString(), layer); }