AVCoders.Display 2026.11.1

Prefix Reserved
dotnet add package AVCoders.Display --version 2026.11.1
                    
NuGet\Install-Package AVCoders.Display -Version 2026.11.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AVCoders.Display" Version="2026.11.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AVCoders.Display" Version="2026.11.1" />
                    
Directory.Packages.props
<PackageReference Include="AVCoders.Display" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AVCoders.Display --version 2026.11.1
                    
#r "nuget: AVCoders.Display, 2026.11.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AVCoders.Display@2026.11.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AVCoders.Display&version=2026.11.1
                    
Install as a Cake Addin
#tool nuget:?package=AVCoders.Display&version=2026.11.1
                    
Install as a Cake Tool

AVCoders.Display

Display, projector and LED-wall drivers for the AV Coders device library. Built on AVCoders.Core. Targets .NET 8.0 and .NET 10.0.

Install

dotnet add package AVCoders.Display

Published to nuget.org. See the repository README for details.

Drivers

  • PjLink
  • SamsungMdc
  • SonySerialControl, SonySimpleIpControl, SonyRest
  • NecUhdExternalControl
  • PhilipsSICP
  • LGCommercial
  • CecDisplay
  • NovaStarH5
  • ColorlightDeviceControlProtocolClassB

Usage

Wire a driver to a transport (from AVCoders.CommunicationClients) and subscribe to its state-change events:

var comms   = new AvCodersTcpClient("192.168.1.50", 4352, "Projector", CommandStringFormat.Ascii);
var display = new PjLink(comms, "Projector", defaultInput);

display.OnPowerStateChanged += state => Console.WriteLine($"Power: {state}");
display.PowerOn();

PjLink discovers the projector's inputs from INST/INNM on class-2 projectors and rebuilds SupportedInputs (raising OnSupportedInputsChanged) once the first complete name pass lands. Until then the constructor map applies (default 31→Hdmi1, 32→Hdmi2, ...), so pass an explicit inputMap when the projector's HDMI codes differ (e.g. Epson uses 32/33/36) and the input must be right from the very first command.

CecDisplay follows each power poll with Give Physical Address, Give OSD Name, Give Device Vendor ID and Get CEC Version, for whichever the TV hasn't answered yet, and shows the answers as Details. Each request waits 500 ms after the power poll or the request before it, then goes out only when no command is waiting. The wait doesn't hold up commands, so power, input and key commands always go out first. A connection change drops any requests still waiting. A Feature Abort for unrecognised opcode (0x00), cannot provide source (0x02) or invalid operand (0x03) shows Not supported: <frame> and stops that request. Any other reason counts as no answer, including not in correct mode to respond (0x01) and refused (0x04), which HDMI 1.3a uses for a passing state (CEC 13.8.2, page CEC-35; CEC 12.3, page CEC-21, suggests retrying). The reason codes are in HDMI 1.3a, CEC Table 26 (page CEC-79), where 0x05 and above are reserved. After 3 polls with no real answer to Give Physical Address or Give Device Vendor ID, it raises a Minor read issue and asks again every 10th poll. The driver asks from the unregistered address 15, which a TV may ignore unless the reply is broadcast (CEC 12.2, page CEC-20). Set OSD Name and CEC Version are directed replies, so after 3 polls with no answer to those it raises no issue, shows No answer (the TV may ignore requests from address 15): <last reply> as the Detail, and keeps asking every 10th poll.

SamsungMdc and LGCommercial read their identity and health Details while the display is Off, in the same poll as the power poll. Samsung sends them straight after the power poll, judging power from the previous poll's reply as it always has; while On it polls input, volume and mute as before and reads nothing. LG polls power, input, volume and mute every poll whatever the power state, and sends the reads after the mute poll while Off. Which reads need the display On is fixed in code from the protocol manuals, and a read the manual says nothing about is read while Off. Until a read has run, its Detail shows Not read yet: read while the display is off. Identity reads go out on each Off poll until answered, health reads on the first Off poll and every 5th after. A NAK (Samsung) or NG (LG) shows Not supported: <raw reply> and stops that read until the display reconnects; 3 missed or unreadable replies in a row raise a Minor read issue, and the first good reply resolves it.

Both drivers track their reads with SentCommandTracker and match each reply to the read it answers: Samsung by command byte, LG by reply character. A read reply, NAK or NG that no read of ours is waiting for, such as another controller's, is logged at Debug and counts neither for nor against a read. Power, input, volume and mute replies still update the state whoever asked. When LG reconnects it restarts the poll worker, so the first poll goes out straight away and never runs alongside another.

Every SamsungMdc read is read while Off: none of their entries in the Samsung MDC Protocol v15.1c (MultipleDisplayControl(MDC)+Protocol_v15.1c.pdf) gives a power-state condition.

Read Query PDF page
Serial number 0x0B 36
Software version 0x0E 38
Model name 0x8A 169
Display status: lamp, temperature, brightness sensor, signal, fan 0x0D 37
Panel on time 0x83 162

The MD32C–MD55C user manual (BN46-00098S-Eng(1).pdf, PDF p.55) says MDC over RJ45 isn't available at all while that model is powered off. That covers every command, the power poll included, not a particular read, so it puts no read in the On list.

Every LGCommercial read is read while Off: serial number fy, software version fz, temperature dn and signal check sv 02. Neither LG manual lists these commands (LG TV External Control (RS232 and IP).pdf, command reference list p.5; MFL71807902_03_Q_240507+MFL71807803_04_S_240507.pdf, 50/55/65UR640S command reference list p.36), so nothing specifies On for them.

NecUhdExternalControl and PhilipsSICP read their identity and health Details the same way, while the display is Off and in the same poll as the power poll. NEC judges power from this poll's reply after its 1.5 s wait, as it always has, and sends the reads 1.5 s apart. Philips judges power from the previous poll's reply, as it always has, and sends the reads 3 s apart. While On, NEC polls input and volume and Philips polls input, volume and mute, as before, and neither reads anything. Until a read has run, its Detail shows Not read yet: read while the display is off. Identity reads go out on each Off poll until answered. NEC's self-diagnosis goes out on the first Off poll and every 4th after, Philips's temperature on the first and every 5th.

Both drivers track every command they send (polls, reads and control commands) in send order with SentCommandTracker, and match each reply to the command it answers: NEC by message type and op code, Philips by command code. A NEC NULL message, or a Philips NACK or NAV, goes to the oldest command still waiting. A rejected power, input, volume or mute command is reported as before: a NEC NULL is logged at Debug, a NEC error result is logged as a Warning with an Error event, and a Philips NACK or NAV raises a momentary rejected-command issue naming the command and the raw reply. A Philips NACK or NAV with no command waiting is logged as a Warning. Only a read's own rejection counts against that read. A Philips NAV, a NEC firmware error result, or 3 NEC NULL messages in a row show Not supported: <raw reply> and stop that read until the display reconnects. A Philips NACK, or a missed or unreadable reply, counts towards the Minor read issue raised on the 3rd in a row. A reply that answers none of our commands, such as another controller polling the same display, still updates power, input and volume as before but counts neither for nor against a read. A Details reply with no read of ours waiting is logged at Debug and dropped. A Philips command addressed to a group (group ID 1–254) gets no ACK or report (The SICP Commands Document V2.10, p.9), so it isn't tracked.

NecUhdExternalControl starts polling 1.5 s after its connection comes up, or 1.5 s after construction when the client is already connected (a serial port). Starts requested within that 1.5 s give one poll. PhilipsSICP starts the same way, 1 s after its connection comes up or after construction.

Every NecUhdExternalControl read is read while Off. The only standby condition in the NEC External Control manual (uhd-external_control.pdf) is that Proof of Play can't be read while the display is Off (p.124), and the driver doesn't read Proof of Play.

Read Command PDF page
Model name C217 77
Serial number C216 75
Firmware version CA02 type 00 87
MAC address C220 00 120
Self-diagnosis: faults and no signal B1 73

The manual's MAC address read on p.120 is C22A 02, with the reply C32A. The driver sends C220 00.

Every PhilipsSICP read is read while Off: none of their entries in The SICP Commands Document V2.10 (The SICP Commands Document V2.10.pdf) gives a power-state condition.

Read Get PDF page
Model number A1 00 10
Firmware version A1 01 10
Build date A1 02 10
Serial number 15 12
Temperature 2F 11

A model information report (A1) doesn't say which field it answers (p.11), so a late reply can't be matched to its read. After an A1 read goes unanswered, the other A1 reads wait for the next poll. A value that is blank, or only NULs or spaces, shows the raw reply.

See the repository README for logging, tracing and the full architecture overview.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on AVCoders.Display:

Package Downloads
AVCoders.SignalR.Display

SignalR hub and bridge for AV Coders displays: power, input, volume and mute broadcast to connected UIs.

AVCoders.Crestron.TouchPanel

Touch panel menu and UI helpers for Crestron panels: display, motor, AVoIP, sync, level, PDU and Q-SYS source menus, PIN entry, confirmation and status pages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2026.11.1 0 11/12/2026
2026.10.5 129 10/21/2026
2026.10.4 108 10/21/2026
2026.10.3 159 10/14/2026
2026.10.2 115 10/13/2026
2026.10.1 128 10/6/2026
2026.9.8 136 9/29/2026
2026.9.7 132 9/24/2026
2026.9.6 206 9/18/2026
2026.9.5 123 9/17/2026
2026.9.4 166 9/14/2026
2026.9.2 155 9/2/2026
2026.9.1 146 9/2/2026
2026.8.5 137 8/27/2026
2026.8.4 150 8/26/2026
2026.8.3 145 8/26/2026
2026.8.2 155 8/24/2026
2026.8.1 190 8/11/2026
2026.7.3 159 7/22/2026
2026.7.2 173 7/21/2026
Loading failed