Initial commit V2C Trydan
This commit is contained in:
parent
368fc174bf
commit
8f017dbb91
135
v2c/AGENTS.md
Normal file
135
v2c/AGENTS.md
Normal file
@ -0,0 +1,135 @@
|
||||
|
||||
# Brief agent — plugin V2C Trydan
|
||||
|
||||
> Repo : `etm-powersync-plugins-modbus` · Dossier : `v2c/` · Branche : `feature/v2c-trydan`
|
||||
> Borne : V2C Trydan / Trydan Pro (monophasée·triphasée, ES). Comm locale : **Modbus TCP (port 502)** + **HTTP REST**.
|
||||
> Statut cible : **Partiel** (comme Keba) — PAS dans la matrice beta validée. Ne pas promettre tant que non testé sur borne réelle.
|
||||
|
||||
---
|
||||
|
||||
## RÔLE
|
||||
|
||||
Créer le plugin nymea `v2c` dans `etm-powersync-plugins-modbus`, sur le modèle des plugins
|
||||
existants du repo (abbterra pour la structure evcharger Modbus TCP, eastron pour le pattern
|
||||
registres). ThingClass `trydan` implémentant l'interface **`evcharger`** — c'est elle que le
|
||||
moteur energy-etm consomme (states `chargingEnabled`, `maxChargingCurrent`, `pluggedIn`,
|
||||
`charging`, `currentPower` ; actions `setChargingEnabled`, `setMaxChargingCurrent`).
|
||||
|
||||
## TRANSPORT — décision d'architecture
|
||||
|
||||
**Modbus TCP = transport principal** (port 502, unit id 1). C'est le bus du repo, l'outillage
|
||||
(`nymea-modbus-cli`, libnymea-modbus) existe, et le polling périodique colle au cycle du moteur.
|
||||
|
||||
**HTTP = complément, deux usages** :
|
||||
1. **Découverte** : la Trydan est en WiFi/LAN, pas de discovery Modbus. `GET /RealTimeData`
|
||||
(JSON) sert de probe d'identification pendant le setup (NetworkDeviceDiscovery + test HTTP).
|
||||
2. **Fallback diagnostic** : si un champ manque en Modbus, le compléter par HTTP est permis,
|
||||
mais le chemin de contrôle (pause, intensité) reste Modbus.
|
||||
|
||||
Ne PAS implémenter deux ThingClasses (une Modbus, une HTTP) — une seule, transport hybride interne.
|
||||
|
||||
## CARTE REGISTRES (source : lib officielle V2Charge/Trydan_Modbus_TCP)
|
||||
|
||||
Lecture : holding registers, **2 registres par valeur, décodage float 32 bits big-endian
|
||||
(byte ET word order Big)**. Écriture : write_register simple (uint16).
|
||||
|
||||
### Lecture (0x0BC2…)
|
||||
| Reg | Nom | Note |
|
||||
|---|---|---|
|
||||
| 0x0BC2 | ChargeState | 0=déconnecté, 1=connecté sans charge, 2=en charge (à confirmer sur borne) |
|
||||
| 0x0BC3 | ChargePower | W |
|
||||
| 0x0BC4 | ChargeEnergy | kWh session |
|
||||
| 0x0BC5 | SlaveError | code erreur |
|
||||
| 0x0BC6 | ChargeTime | s |
|
||||
| 0x0BC7 | ValuePWM | duty CP |
|
||||
| 0x0BC8 | HousePower | W — pince CT maison (si installée) |
|
||||
| 0x0BC9 | PowerFV | W — production PV vue par la borne (si configurée) |
|
||||
| 0x0BCA | PauseState | |
|
||||
| 0x0BCB | Lock | |
|
||||
| 0x0BCC | Program(Promgram) | |
|
||||
| 0x0BCD | Intensity | A courante |
|
||||
| 0x0BCE | Dynamic | mode dynamique V2C on/off |
|
||||
| 0x0BCF | Payment | |
|
||||
| 0x0BD0 | OCPP | |
|
||||
| 0x0BD1 | MinIntensity | A |
|
||||
| 0x0BD2 | MaxIntensity | A |
|
||||
| 0x0BD3 | PauseDynamic | |
|
||||
| 0x0BD4 | DynamicPowerMode | |
|
||||
| 0x0BD5 | ContractedPower | W |
|
||||
|
||||
### Écriture (0x177A…)
|
||||
| Reg | Nom | Usage HEMS |
|
||||
|---|---|---|
|
||||
| 0x177A | PauseState | **setChargingEnabled** (pause=1 → désactivé) |
|
||||
| 0x177B | Lock | verrouillage |
|
||||
| 0x177C | Program | timer interne — ne pas utiliser (conflit moteur) |
|
||||
| 0x177D | Intensity | **setMaxChargingCurrent** (A) |
|
||||
| 0x177E | Dynamic | voir CONFLIT ci-dessous |
|
||||
| 0x177F | Payment | hors scope |
|
||||
| 0x1780 | OCPP | hors scope |
|
||||
| 0x1781 | MinIntensity | borne basse (6 A) |
|
||||
| 0x1782 | MaxIntensity | borne haute (bug historique V2C corrigé upstream — vérifier firmware) |
|
||||
| 0x1783 | PauseDynamic | voir CONFLIT |
|
||||
| 0x1784 | DynamicPowerMode | voir CONFLIT |
|
||||
| 0x1785 | ContractedPower | protection abonnement interne borne |
|
||||
|
||||
Vérifier la carte contre la feuille officielle V2C (lien dans le README du repo
|
||||
V2Charge/Trydan_Modbus_TCP, gid=0) avant d'écrire les paramRegisters JSON.
|
||||
|
||||
## ⚠️ CONFLIT D'OPTIMISEURS — le piège central de cette borne
|
||||
|
||||
La Trydan embarque SON PROPRE pilotage solaire (« Dynamic », pince CT + lecture onduleur,
|
||||
PID interne). Deux cerveaux ne doivent pas piloter la même borne :
|
||||
|
||||
- **Dynamic V2C ACTIF (0x0BCE=1)** → la borne s'autopilote au surplus ; toute écriture
|
||||
Intensity du moteur sera combattue par le PID interne. Oscillations garanties.
|
||||
- **Mode HEMS (le nôtre)** → exiger Dynamic=0 ; le moteur energy-etm décide, la borne obéit.
|
||||
|
||||
Comportement du plugin :
|
||||
1. À l'init, LIRE 0x0BCE. Si Dynamic=1, exposer un state `conflictDetected` (ou équivalent)
|
||||
et logger un avertissement explicite — ne PAS désactiver silencieusement le mode du client.
|
||||
2. Setting de Thing `disableInternalOptimizer` (défaut: demander) : si l'utilisateur accepte,
|
||||
écrire Dynamic=0 + PauseDynamic/DynamicPowerMode cohérents.
|
||||
3. `decisionReason` côté moteur doit pouvoir refléter « borne en autopilotage V2C — pilotage
|
||||
HEMS suspendu » si Dynamic revient à 1 (l'app V2C du client peut le réactiver à tout moment
|
||||
→ re-lire à chaque poll, pas seulement à l'init).
|
||||
|
||||
C'est le même problème que la PV-Edition Keba : une borne « intelligente » à neutraliser
|
||||
proprement pour que l'arbitrage central reste l'unique décideur.
|
||||
|
||||
## SÉCURITÉ / ROBUSTESSE
|
||||
|
||||
- Anti-flapping : respecter les verrous du moteur (chargingEnabledLockDuration etc.) — le
|
||||
plugin n'introduit PAS sa propre cadence d'écriture ; il applique ce que le moteur envoie.
|
||||
- Connexion Modbus perdue → states `connected=false`, pas de retry agressif (backoff).
|
||||
- Écritures idempotentes : ne réécrire Intensity que si la valeur cible change réellement
|
||||
(la borne journalise chaque write ; éviter l'usure flash et le spam).
|
||||
- Min 6 A (IEC 61851). Clamper toute consigne < 6 A à pause plutôt qu'à une valeur illégale.
|
||||
- Float decode : 2 registres, Big/Big. NE PAS supposer du uint16 sur les lectures.
|
||||
|
||||
## INTERDIT
|
||||
|
||||
- Toucher aux plugins publiés du repo (eastron, abbb2x, abbterra, waveshare-relay-d8).
|
||||
- Promettre la borne dans la doc/matrice beta (statut Partiel, non testé matériel).
|
||||
- Dépendance à un service privé ETM — plugin 100% GPL, parle à la borne en direct.
|
||||
- Implémenter OCPP/Payment/RFID — hors scope HEMS.
|
||||
|
||||
## DEFINITION OF DONE
|
||||
|
||||
1. Plugin compile (amd64 + cross arm64) et s'intègre au .pro du repo.
|
||||
2. ThingClass `trydan` expose l'interface `evcharger` complète + states diag
|
||||
(HousePower, PowerFV, SlaveError, Dynamic/conflit).
|
||||
3. Discovery réseau + setup par IP manuelle fonctionnels.
|
||||
4. Gestion du conflit Dynamic implémentée (lecture à chaque poll, state, setting).
|
||||
5. Testé contre simulateur Modbus (registres mockés) — le test sur borne réelle est
|
||||
un jalon séparé, AVANT tout passage en « Supporté ».
|
||||
6. Entrée PORTING_STATUS_modbus.md : statut Partiel, source de la carte registres notée.
|
||||
|
||||
## RÉFÉRENCES
|
||||
|
||||
- Lib officielle : github.com/V2Charge/Trydan_Modbus_TCP (carte registres + décodage float)
|
||||
- API HTTP : feuille V2C (gid=1147522182) + github.com/V2Charge/API-doc-v2c — à vérifier,
|
||||
endpoints probables /RealTimeData (lecture JSON) et /write/<param>=<val>
|
||||
- Dans le repo : abbterra (structure evcharger Modbus TCP), PORTING_STATUS_modbus.md
|
||||
- Firmware : les updates V2C mentionnent des fixes Modbus (Max/MinIntensity) — documenter
|
||||
la version firmware minimale constatée lors du test réel.
|
||||
75
v2c/V2C - Datamanager Modbus TCP & RTU - Google Drive.html
Normal file
75
v2c/V2C - Datamanager Modbus TCP & RTU - Google Drive.html
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,29 @@
|
||||
(function(){var k=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function aa(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ba=aa(this);
|
||||
function l(a,b){if(b)a:{var c=ba;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&b!=null&&k(c,a,{configurable:!0,writable:!0,value:b})}}
|
||||
l("Symbol",function(a){function b(f){if(this instanceof b)throw new TypeError("Symbol is not a constructor");return new c(d+(f||"")+"_"+e++,f)}function c(f,g){this.g=f;k(this,"description",{configurable:!0,writable:!0,value:g})}if(a)return a;c.prototype.toString=function(){return this.g};var d="jscomp_symbol_"+(Math.random()*1E9>>>0)+"_",e=0;return b});l("Symbol.dispose",function(a){return a?a:Symbol("Symbol.dispose")});/*
|
||||
|
||||
Copyright The Closure Library Authors.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
var m=this||self;function ca(a){var b=typeof a;b=b!="object"?b:a?Array.isArray(a)?"array":b:"null";return b=="array"||b=="object"&&typeof a.length=="number"}function n(a){var b=typeof a;return b=="object"&&a!=null||b=="function"}function da(a,b,c){return a.call.apply(a.bind,arguments)}
|
||||
function ea(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function p(a,b,c){p=Function.prototype.bind&&Function.prototype.bind.toString().indexOf("native code")!=-1?da:ea;return p.apply(null,arguments)}
|
||||
function q(a,b){function c(){}c.prototype=b.prototype;a.B=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.O=function(d,e,f){for(var g=Array(arguments.length-2),h=2;h<arguments.length;h++)g[h-2]=arguments[h];return b.prototype[e].apply(d,g)}};var r;var fa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if(typeof a==="string")return typeof b!=="string"||b.length!=1?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},ha=Array.prototype.forEach?function(a,b){Array.prototype.forEach.call(a,b,void 0)}:function(a,b){for(var c=a.length,d=typeof a==="string"?a.split(""):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)};
|
||||
function ia(a){var b=a.length;if(b>0){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]};function t(a,b,c){for(var d in a)b.call(c,a[d],d,a)}var u="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" ");function ja(a,b){for(var c,d,e=1;e<arguments.length;e++){d=arguments[e];for(c in d)a[c]=d[c];for(var f=0;f<u.length;f++)c=u[f],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};function ka(a,b){t(b,function(c,d){d=="style"?a.style.cssText=c:d=="class"?a.className=c:d=="for"?a.htmlFor=c:la.hasOwnProperty(d)?a.setAttribute(la[d],c):d.lastIndexOf("aria-",0)==0||d.lastIndexOf("data-",0)==0?a.setAttribute(d,c):a[d]=c})}var la={cellpadding:"cellPadding",cellspacing:"cellSpacing",colspan:"colSpan",frameborder:"frameBorder",height:"height",maxlength:"maxLength",nonce:"nonce",role:"role",rowspan:"rowSpan",type:"type",usemap:"useMap",valign:"vAlign",width:"width"};
|
||||
function ma(a,b,c){function d(h){h&&b.appendChild(typeof h==="string"?a.createTextNode(h):h)}for(var e=2;e<c.length;e++){var f=c[e];if(!ca(f)||n(f)&&f.nodeType>0)d(f);else{a:{if(f&&typeof f.length=="number"){if(n(f)){var g=typeof f.item=="function"||typeof f.item=="string";break a}if(typeof f==="function"){g=typeof f.item=="function";break a}}g=!1}ha(g?ia(f):f,d)}}}function v(a){for(var b;b=a.firstChild;)a.removeChild(b)}function w(a){return a.contentDocument||a.contentWindow.document}
|
||||
function x(a){this.h=a||m.document||document}x.prototype.g=function(a,b,c){var d=this.h,e=arguments,f=e[1];var g=String(e[0]);g=String(g);d.contentType==="application/xhtml+xml"&&(g=g.toLowerCase());g=d.createElement(g);f&&(typeof f==="string"?g.className=f:Array.isArray(f)?g.className=f.join(" "):ka(g,f));e.length>2&&ma(d,g,e);return g};function y(){this.j=this.j;this.l=this.l}y.prototype.j=!1;y.prototype.dispose=function(){this.j||(this.j=!0,this.h())};y.prototype[Symbol.dispose]=function(){this.dispose()};y.prototype.h=function(){if(this.l)for(;this.l.length;)this.l.shift()()};function z(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}z.prototype.h=function(){this.defaultPrevented=!0};var na=function(){if(!m.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{var c=function(){};m.addEventListener("test",c,b);m.removeEventListener("test",c,b)}catch(d){}return a}();function A(a,b){z.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.keyCode=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.I=null;a&&this.init(a,b)}q(A,z);
|
||||
A.prototype.init=function(a,b){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;b=a.relatedTarget;b||(c=="mouseover"?b=a.fromElement:c=="mouseout"&&(b=a.toElement));this.relatedTarget=b;d?(this.clientX=d.clientX!==void 0?d.clientX:d.pageX,this.clientY=d.clientY!==void 0?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=a.clientX!==void 0?a.clientX:a.pageX,this.clientY=a.clientY!==
|
||||
void 0?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType=a.pointerType;this.state=a.state;this.I=a;a.defaultPrevented&&A.B.h.call(this)};A.prototype.h=function(){A.B.h.call(this);var a=this.I;a.preventDefault?a.preventDefault():a.returnValue=!1};var B="closure_listenable_"+(Math.random()*1E6|0);var oa=0;function pa(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.H=e;this.key=++oa;this.A=this.G=!1}function D(a){a.A=!0;a.listener=null;a.proxy=null;a.src=null;a.H=null};function E(a){this.src=a;this.g={};this.h=0}E.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g=F(a,b,d,e);g>-1?(b=a[g],c||(b.G=!1)):(b=new pa(b,this.src,f,!!d,e),b.G=c,a.push(b));return b};function G(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=fa(d,b),f;(f=e>=0)&&Array.prototype.splice.call(d,e,1);f&&(D(b),a.g[c].length==0&&(delete a.g[c],a.h--))}}
|
||||
function F(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e];if(!f.A&&f.listener==b&&f.capture==!!c&&f.H==d)return e}return-1};var H="closure_lm_"+(Math.random()*1E6|0),I={},qa=0;function J(a,b,c,d,e){if(d&&d.once)return K(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)J(a,b[f],c,d,e);return null}c=L(c);return a&&a[B]?a.g.add(String(b),c,!1,n(d)?!!d.capture:!!d,e):ra(a,b,c,!1,d,e)}
|
||||
function ra(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=n(e)?!!e.capture:!!e,h=M(a);h||(a[H]=h=new E(a));c=h.add(b,c,d,g,f);if(c.proxy)return c;d=sa();c.proxy=d;d.src=a;d.listener=c;if(a.addEventListener)na||(e=g),e===void 0&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(ta(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");qa++;return c}
|
||||
function sa(){function a(c){return b.call(a.src,a.listener,c)}var b=ua;return a}function K(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)K(a,b[f],c,d,e);return null}c=L(c);return a&&a[B]?a.g.add(String(b),c,!0,n(d)?!!d.capture:!!d,e):ra(a,b,c,!0,d,e)}
|
||||
function va(a,b,c,d,e){if(Array.isArray(b))for(var f=0;f<b.length;f++)va(a,b[f],c,d,e);else(d=n(d)?!!d.capture:!!d,c=L(c),a&&a[B])?(a=a.g,b=String(b).toString(),b in a.g&&(f=a.g[b],c=F(f,c,d,e),c>-1&&(D(f[c]),Array.prototype.splice.call(f,c,1),f.length==0&&(delete a.g[b],a.h--)))):a&&(a=M(a))&&(b=a.g[b.toString()],a=-1,b&&(a=F(b,c,d,e)),(c=a>-1?b[a]:null)&&N(c))}
|
||||
function N(a){if(typeof a!=="number"&&a&&!a.A){var b=a.src;if(b&&b[B])G(b.g,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(ta(c),d):b.addListener&&b.removeListener&&b.removeListener(d);qa--;(c=M(b))?(G(c,a),c.h==0&&(c.src=null,b[H]=null)):D(a)}}}function ta(a){return a in I?I[a]:I[a]="on"+a}function ua(a,b){if(a.A)a=!0;else{b=new A(b,this);var c=a.listener,d=a.H||a.src;a.G&&N(a);a=c.call(d,b)}return a}
|
||||
function M(a){a=a[H];return a instanceof E?a:null}var O="__closure_events_fn_"+(Math.random()*1E9>>>0);function L(a){if(typeof a==="function")return a;a[O]||(a[O]=function(b){return a.handleEvent(b)});return a[O]};function P(a){y.call(this);this.i=a;this.g={}}q(P,y);var wa=[];function Q(a,b,c,d){Array.isArray(c)||(c&&(wa[0]=c.toString()),c=wa);for(var e=0;e<c.length;e++){var f=J(b,c[e],d||a.handleEvent,!1,a.i||a);if(!f)break;a.g[f.key]=f}return a}function xa(a){t(a.g,function(b,c){this.g.hasOwnProperty(c)&&N(b)},a);a.g={}}P.prototype.h=function(){P.B.h.call(this);xa(this)};P.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function R(a,b,c){this.C=c;this.v=this.j=null;this.g=1;this.u=a?new x(a.nodeType==9?a:a.ownerDocument||a.document):r||(r=new x);this.D=new P(this);a=this.u;c=a.g("DIV","switcherOuter");b.appendChild(c);this.o=a.g("DIV","switcherContent",a.g("TABLE","switcherTable",a.g("TBODY",null,this.J=a.g("TR"))));c.appendChild(this.o);b=a.g("DIV","switcherArrows");c.appendChild(b);this.l=a.g("DIV","switcherArrow",a.g("B",null,">"));b.appendChild(this.l);this.i=a.g("DIV","switcherArrow",a.g("B",null,"<"));b.appendChild(this.i);
|
||||
Q(Q(Q(Q(Q(Q(this.D,this.i,"mouseover",this.M),this.l,"mouseover",this.N),this.i,"mouseout",this.K),this.l,"mouseout",this.L),this.i,"mousedown",this.F),this.l,"mousedown",this.F);this.h=0;this.m=null}function ya(a,b){var c=a.J.cells.length,d=a.J;d.insertCell(c);var e=d.cells[c];v(e);e.appendChild(a.u.h.createTextNode(String(b.name)));e.item=b;e=d.cells[c];e.className="switcherItem";b.initialSheet&&S(a,b,e,!1);Q(a.D,e,"click",function(){return void S(a,b,e,!0)});return e}
|
||||
function S(a,b,c,d){b!=a.j&&(a.j!=null&&(a.v.className="switcherItem"),a.j=b,a.v=c,c.className="switcherItemActive",a=a.C,a!=null&&a(b,d))}function za(a){a.o.scrollLeft+=1*a.g*a.h}R.prototype.M=function(){var a=this;this.g=1;this.h=-1;this.m=window.setInterval(function(){return void za(a)},10)};R.prototype.N=function(){var a=this;this.h=this.g=1;this.m=window.setInterval(function(){return void za(a)},10)};R.prototype.K=function(){window.clearInterval(this.m);this.h=0};
|
||||
R.prototype.L=function(){window.clearInterval(this.m);this.h=0};R.prototype.F=function(){this.g<4?this.g++:this.g=1};R.prototype.cleanup=function(){this.C=null};function T(){y.call(this);this.g=new E(this);this.D=this;this.u=null}q(T,y);T.prototype[B]=!0;T.prototype.removeEventListener=function(a,b,c,d){va(this,a,b,c,d)};T.prototype.h=function(){T.B.h.call(this);if(this.g){var a=this.g,b=0,c;for(c in a.g){for(var d=a.g[c],e=0;e<d.length;e++)++b,D(d[e]);delete a.g[c];a.h--}}this.u=null};
|
||||
function U(a,b,c,d){b=a.g.g[String(b)];if(!b)return!0;b=b.concat();for(var e=!0,f=0;f<b.length;++f){var g=b[f];if(g&&!g.A&&g.capture==c){var h=g.listener,C=g.H||g.src;g.G&&G(a.g,g);e=h.call(C,d)!==!1&&e}}return e&&!d.defaultPrevented};function V(a,b){T.call(this);this.i=a;this.F=!!b;this.v=Aa(this);this.v||(this.m=J(this.i,"load",this.C,!1,this),this.o=window.setInterval(p(this.C,this),100))}q(V,T);V.prototype.m=null;function Ba(a){a.o&&(window.clearInterval(a.o),a.o=null)}V.prototype.h=function(){delete this.i;Ba(this);N(this.m);V.B.h.call(this)};function Aa(a){var b=!1;try{var c=w(a.i).body;b=a.F?!!c&&!!c.firstChild:!!c}catch(d){}return b}
|
||||
V.prototype.C=function(){if(Aa(this)){Ba(this);N(this.m);this.m=null;this.v=!0;var a=this.u;if(a){var b=[];for(var c=1;a;a=a.u)b.push(a),++c}a=this.D;c="ifload";var d=c.type||c;if(typeof c==="string")c=new z(c,a);else if(c instanceof z)c.target=c.target||a;else{var e=c;c=new z(d,a);ja(c,e)}e=!0;var f;if(b)for(f=b.length-1;f>=0;f--){var g=c.g=b[f];e=U(g,d,!0,c)&&e}g=c.g=a;e=U(g,d,!0,c)&&e;e=U(g,d,!1,c)&&e;if(b)for(f=0;f<b.length;f++)g=c.g=b[f],e=U(g,d,!1,c)&&e}};function Ca(a){if(typeof a!=="function")if(a&&typeof a.handleEvent=="function")a=p(a.handleEvent,a);else throw Error("Invalid listener argument");Number(20)>2147483647||m.setTimeout(a,20)};function Da(a,b,c){var d=this;this.h=a?new x(a.nodeType==9?a:a.ownerDocument||a.document):r||(r=new x);this.g=this.j=null;var e=this.h,f=e.g("DIV","widget-sheet-container");e=e.g("DIV",{style:"height:26px;background-color:#eee"});b.appendChild(f);b.appendChild(e);this.i=f;this.l=a=new R(a,e,function(g,h){return Ea(d,g,h)});if(c.length){b=null;for(f=0;f<c.length;f++)e=ya(a,c[f]),f==0&&(b=e);a.j==null&&S(a,c[0],b,!1)}J(this.h.h.defaultView,"message",function(g){g=g.I;var h=g.origin,C=h.length-11;C>=
|
||||
0&&h.indexOf(".google.com",C)==C&&g.data=="SendKeyboardEvents"&&(d.j=g.origin,W(d,d.h.h),d.g&&W(d,w(d.g)))})}function Ea(a,b,c){Ca(function(){return void Fa(a,b,c)})}
|
||||
function Fa(a,b,c){var d=b.pageUrl,e=a.i;v(e);a.g=null;d=a.h.g("IFRAME",{id:"pageswitcher-content",style:"display: block; width: 100%; height:100%;",frameBorder:"0",marginHeight:"0",marginWidth:"0",src:d});var f=new V(d,!0);K(f,"ifload",function(){a.g=f.i;f.dispose();a.j&&a.g&&W(a,w(a.g))});e.appendChild(d);c&&b.gid!==void 0&&(window.location.hash="#gid="+b.gid)}
|
||||
function W(a,b){J(b,["keydown","keyup","keypress"],function(c){if(a.j){var d=a.h.h.defaultView.parent;d&&d.postMessage&&d.postMessage(JSON.stringify({type:c.type,ctrlKey:c.ctrlKey,altKey:c.altKey,shiftKey:c.shiftKey,metaKey:c.metaKey,keyCode:c.keyCode}),a.j)}})}Da.prototype.cleanup=function(){this.l.cleanup();this.l=null;v(this.i);this.i=null};function Ga(a,b,c,d,e,f,g,h){return new Da(b,c,h)}for(var X=["_getWGTPageSwitcher"],Y=m,Z;X.length&&(Z=X.shift());)X.length||Ga===void 0?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=Ga;}).call(this);
|
||||
File diff suppressed because one or more lines are too long
@ -0,0 +1,2 @@
|
||||
.widget-sheet-container{flex:1}.switcherOuter{display:flex;overflow:hidden;font-size:10pt;border-style:none;border-width:0}.switcherArrows{display:flex;flex-direction:column}.switcherArrow{overflow:hidden;height:13px;width:13px;font-size:6pt;border-style:none;text-align:center;cursor:pointer}.switcherContent{flex:1;overflow:hidden;font-size:8pt;border-style:none}.switcherTable{border-style:none;border-spacing:0;padding-left:6px;left:0;font-size:8pt;vertical-align:middle;height:100%}.switcherItem{color:#04409f;font-size:11px;padding:2px 7px;white-space:nowrap;text-decoration:underline;cursor:pointer}.switcherItemActive{padding:2px 7px;white-space:nowrap;background-color:var(--gm3-sys-color-surface,#fff);font-weight:500;font-size:11px;border-left:1px solid #ababab;border-bottom:1px solid #ababab;border-right:1px solid #ababab;text-decoration:none}.switcherPageFrame{border-style:none}
|
||||
/*# sourceMappingURL=trix_widget_ltr.css.map */
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
Loading…
x
Reference in New Issue
Block a user