<feed xmlns='http://www.w3.org/2005/Atom'>
<title>QtXpl2/src/Xpl2Client.cpp, branch master</title>
<subtitle>High-level C++/QML library for Alchemie's Jetting Controller Protocol</subtitle>
<id>http://git.tvcloud.fr/cgit.cgi/QtXpl2/atom?h=master</id>
<link rel='self' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/atom?h=master'/>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/'/>
<updated>2026-03-24T16:29:52Z</updated>
<entry>
<title>Add JettingProxy relay, convert Xpl2Client to active connection model</title>
<updated>2026-03-24T16:29:52Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-24T16:25:03Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=e9d8a8b052150f42ea00da2c07e3f78a9b7d2061'/>
<id>urn:sha1:e9d8a8b052150f42ea00da2c07e3f78a9b7d2061</id>
<content type='text'>
Insert a transparent TCP proxy between the controller and N clients:
- JettingProxy listens on 9110-9112 (controller) and 9210-9212 (clients)
- Broadcasts controller frames to all clients, forwards client→controller
- Independent KA_PING handling on both sides

Convert Xpl2Client from passive QTcpServer listener to active QTcpSocket
outbound connections with auto-retry. New QML API: host/commandPort
properties, connectToProxy()/disconnectFromProxy() replacing
startListening()/stopListening().
</content>
</entry>
<entry>
<title>Invert TCP connection model: client listens, server connects</title>
<updated>2026-03-23T15:39:33Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-23T15:39:33Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=61debe99a269bf7e87f6ba2f8d2a376e619fcf12'/>
<id>urn:sha1:61debe99a269bf7e87f6ba2f8d2a376e619fcf12</id>
<content type='text'>
The XPL2 protocol specifies that the JI2 controller initiates connections
to the client, not the other way around. Xpl2Client now listens on 3 ports
via QTcpServer and accepts inbound connections; MockServer connects out
with auto-retry on the 1s KA_PING tick.

QML API: startListening/stopListening, listening+connected properties,
host property removed. Mock server gains --host CLI arg.
</content>
</entry>
<entry>
<title>Imaging (m/n) commands: start/stop, masks, image count, n reply</title>
<updated>2026-03-16T15:48:34Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T15:48:34Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=f2251311a8523b6c24839ccd1e6834ef065c679f'/>
<id>urn:sha1:f2251311a8523b6c24839ccd1e6834ef065c679f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>EV_ events with Q_GADGET status types, mock periodic emission, tabbed demo UI</title>
<updated>2026-03-16T15:19:49Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T15:19:49Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=fa095de6cc8ec5a5b5c14091f2b3179ad7071876'/>
<id>urn:sha1:fa095de6cc8ec5a5b5c14091f2b3179ad7071876</id>
<content type='text'>
</content>
</entry>
<entry>
<title>CF_ configuration commands with JettingParamsResult and SetterResult enums</title>
<updated>2026-03-16T14:40:22Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T14:40:22Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=7830f0ae98d742467b948ed93c85e122be38fb83'/>
<id>urn:sha1:7830f0ae98d742467b948ed93c85e122be38fb83</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Refactor CN_ response handlers into data-driven dispatch table</title>
<updated>2026-03-16T14:25:02Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T14:25:02Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=df2be9eb678f12b6107d582d8ebd2ca2b4b7e92b'/>
<id>urn:sha1:df2be9eb678f12b6107d582d8ebd2ca2b4b7e92b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>CN_ control commands: typed API, dispatch, mock responses, demo UI</title>
<updated>2026-03-16T14:14:13Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T14:14:13Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=50034b142dc851da7118032f7218cb1d25ea98e4'/>
<id>urn:sha1:50034b142dc851da7118032f7218cb1d25ea98e4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>GS_PH_VERSION command, per-printhead demo UI with --printheads CLI arg</title>
<updated>2026-03-16T10:04:21Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-16T10:04:21Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=9ac64169720fb2b9852589b74f7300bcfebcaf62'/>
<id>urn:sha1:9ac64169720fb2b9852589b74f7300bcfebcaf62</id>
<content type='text'>
Add getPhVersion(printheadId) to Xpl2Client with phVersionReceived signal
carrying all 8 response fields. Mock server echoes canned version data for
any requested printhead ID.

Demo app accepts --printheads N (default 10) to simulate N printheads.
The UI shows a scrollable per-PH list with individual and bulk version
query buttons, updating each row's version info on response.
</content>
</entry>
<entry>
<title>Unified socket slots, --wire-debug CLI flag, fix mock TX and disconnect logging</title>
<updated>2026-03-13T17:20:35Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-13T17:20:35Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=87169e10cb7ebe732ef388552bb0c057c09767ef'/>
<id>urn:sha1:87169e10cb7ebe732ef388552bb0c057c09767ef</id>
<content type='text'>
Collapse 12 per-socket slots into 4 sender()-based slots. Replace runtime
wireDebug QML property with static --wire-debug CLI flag on both demo and
mock server. Route MockServer::sendKaPing through sendReply so KA_PING TX
shows wire bytes. Simplify sendReply to deduce command token from wire data.
Fix Xpl2Client disconnect logging (logTag takes pointer, null-sender fallback).
</content>
</entry>
<entry>
<title>XPL2 protocol foundation: wire framing, typed API, KA_PING, GS_JC_VERSION</title>
<updated>2026-03-13T10:47:00Z</updated>
<author>
<name>Thomas Vanbesien</name>
<email>tvanbesi@proton.me</email>
</author>
<published>2026-03-13T10:47:00Z</published>
<link rel='alternate' type='text/html' href='http://git.tvcloud.fr/cgit.cgi/QtXpl2/commit/?id=a2b1ccf17845e55caef7f69a5e68f49a55b6a166'/>
<id>urn:sha1:a2b1ccf17845e55caef7f69a5e68f49a55b6a166</id>
<content type='text'>
Add Xpl2Protocol namespace with buildMessage/parseMessage for wire
serialization. Replace raw send/receive API on Xpl2Client with typed
protocol methods and internal dispatch. Auto-reply to KA_PING on all
sockets (qDebug only). Add GS_JC_VERSION as first typed command with
controllerId, firmwareVersion, hardwareVersion, printheadCount properties.

Upgrade mock server from echo to line-based command dispatch with 1s
KA_PING timer and canned GS_JC_VERSION response. Unknown commands
produce qWarning instead of echo.

Overhaul demo: remove raw send UI and port config, add wireDebug
toggle and Get JC Version button.
</content>
</entry>
</feed>
