1- import type { LynxModule , MotorLynxModule } from "./index" ;
1+ import type { ExpansionLynxModule , LynxModule , MotorLynxModule } from "./index" ;
22import { create } from "xmlbuilder2" ;
33import type { XMLBuilder } from "xmlbuilder2/lib/interfaces" ;
44
@@ -8,16 +8,28 @@ export interface CodeBuilder {
88
99class XmlBuilder implements CodeBuilder {
1010 build ( controlHub : MotorLynxModule , expansionHub : MotorLynxModule , servoHub : LynxModule ) : string {
11- const doc = create ( { version : '1.0' , standalone : true , encoding : "UTF-8" } )
12- . ele ( "Robot" , { type : "FirstInspires-FTC" } )
13- . ele ( "LynxUsbDevice" , { name : "Control Hub Portal" , serialNumber : "(embedded)" , parentModuleAddress : 173 } )
14- const controlHubBuilder = doc . ele ( "LynxModule" , { name : "Control Hub" , port : 173 } ) ;
15- XmlBuilder . buildMotorLynxModule ( controlHubBuilder , controlHub ) ;
16- const expansionHubBuilder = doc . ele ( "LynxModule" , { name : "Expansion Hub 0" , port : 0 } ) ;
17- XmlBuilder . buildMotorLynxModule ( expansionHubBuilder , expansionHub ) ;
18- const servoHubBuilder = doc . ele ( "LynxModule" , { name : "Servo Hub 1" , port : 1 } ) ;
19- XmlBuilder . buildLynxModule ( servoHubBuilder , servoHub ) ;
11+ const doc = create ( { version : '1.0' , standalone : true , encoding : "UTF-8" } ) ;
2012
13+ const robotBlock = doc . ele ( "Robot" , { type : "FirstInspires-FTC" } ) ;
14+ for ( const ethernet of controlHub . ethernet ) {
15+ robotBlock . ele ( "EthernetDevice" , { name : ethernet . name , serialNumber : "EthernetOverUsb:eth0:172.29.0.28" , port : "-1" , ipAddress : "172.29.0.1" } ) ;
16+ }
17+
18+ const portalBlock = robotBlock . ele ( "LynxUsbDevice" , { name : "Control Hub Portal" , serialNumber : "(embedded)" , parentModuleAddress : 173 } ) ;
19+
20+ const controlHubBlock = portalBlock . ele ( "LynxModule" , { name : "Control Hub" , port : 173 } ) ;
21+ XmlBuilder . buildMotorLynxModule ( controlHubBlock , controlHub ) ;
22+
23+ if ( expansionHub . analog . length !== 0 || expansionHub . digital . length !== 0 || expansionHub . i2c . length !== 0 || expansionHub . motors . length !== 0 || expansionHub . servos . length !== 0 ) {
24+ const expansionHubBuilder = portalBlock . ele ( "LynxModule" , { name : "Expansion Hub 0" , port : 0 } ) ;
25+ XmlBuilder . buildExpansionLynxModule ( expansionHubBuilder , expansionHub ) ;
26+ }
27+
28+ if ( servoHub . servos . length !== 0 ) {
29+ const servoHubBuilder = portalBlock . ele ( "LynxModule" , { name : "Servo Hub 1" , port : 1 } ) ;
30+ XmlBuilder . buildLynxModule ( servoHubBuilder , servoHub ) ;
31+ }
32+
2133 return doc . end ( { prettyPrint : true } ) ;
2234 }
2335
@@ -44,6 +56,24 @@ class XmlBuilder implements CodeBuilder {
4456 doc . ele ( analog . type . type , { name : analog . name , port : analog . port } ) ;
4557 }
4658 }
59+
60+ private static buildExpansionLynxModule ( doc : XMLBuilder , module : ExpansionLynxModule ) {
61+ for ( const motor of module . motors ) {
62+ doc . ele ( motor . type . type , { name : motor . name , port : motor . port } ) ;
63+ }
64+ for ( const servo of module . servos ) {
65+ doc . ele ( servo . type . type , { name : servo . name , port : servo . port } ) ;
66+ }
67+ for ( const i2c of module . i2c ) {
68+ doc . ele ( i2c . type . type , { name : i2c . name , port : 0 , bus : i2c . port } ) ;
69+ }
70+ for ( const digital of module . digital ) {
71+ doc . ele ( digital . type . type , { name : digital . name , port : digital . port } ) ;
72+ }
73+ for ( const analog of module . analog ) {
74+ doc . ele ( analog . type . type , { name : analog . name , port : analog . port } ) ;
75+ }
76+ }
4777}
4878
4979export default new XmlBuilder ( ) ;
0 commit comments