diff --git a/webinstall/build.yaml b/webinstall/build.yaml
index 8c66ff8..fb61984 100644
--- a/webinstall/build.yaml
+++ b/webinstall/build.yaml
@@ -9,14 +9,17 @@ types:
value: M5_CAN_KIT
description: "M5 Stack CAN Kit"
url: "http://docs.m5stack.com/en/atom/atom_can"
+ resource: can
- value: M5_SERIAL_KIT_232
description: "M5 Stack RS232 Base"
label: "Atomic RS232 Base"
url: "http://docs.m5stack.com/en/atom/Atomic%20RS232%20Base"
+ resource: serial
- value: M5_SERIAL_KIT_485
description: "M5 Stack RS485 Base"
label: "Atomic RS485 Base"
url: "http://docs.m5stack.com/en/atom/Atomic%20RS485%20Base"
+ resource: serial
- &m5groovei2c
type: multi
key: m5groovei2c
@@ -31,7 +34,8 @@ types:
- label: "CAN Unit"
url: "http://docs.m5stack.com/en/unit/can"
description: "M5 Can unit"
- value: M5_CANUNIT
+ value: M5_CANUNIT
+ resource: can
- &m5grooveserial
type: select
label: "M5 Groove Serial Unit"
@@ -43,11 +47,13 @@ types:
value: SERIAL_GROOVE_485
description: "M5 RS485 unit"
url: "http://docs.m5stack.com/en/unit/rs485"
+ resource: serial
- label: "Tail485"
value: SERIAL_GROOVE_485
key: tail485
description: "M5 Tail 485"
url: "http://docs.m5stack.com/en/atom/tail485"
+ resource: serial
- &m5groove
type: select
@@ -63,7 +69,11 @@ types:
- label: 'Serial'
children:
- *m5grooveserial
-
+resources:
+ default: &esp32default
+ serial: 2
+ can: 1
+ i2c: 1
config:
children:
@@ -76,6 +86,7 @@ config:
label: m5stack-atom
description: "M5 Stack Atom light"
url: "http://docs.m5stack.com/en/core/atom_lite"
+ resource: *esp32default
children:
- *m5base
- *m5groove
@@ -83,6 +94,7 @@ config:
label: m5stack-atoms3
description: "M5 Stack AtomS3 light"
url: "http://docs.m5stack.com/en/core/AtomS3%20Lite"
+ resource: *esp32default
children:
- *m5base
- *m5groove
\ No newline at end of file
diff --git a/webinstall/cibuild.css b/webinstall/cibuild.css
index 938946b..fcf5312 100644
--- a/webinstall/cibuild.css
+++ b/webinstall/cibuild.css
@@ -91,6 +91,9 @@
display: none;
color: red;
}
+.configui .error .value{
+ color: red;
+}
.configui #warn.warn{
display: block;
}
@@ -130,4 +133,8 @@
}
.configui .label {
width: 10em;
+}
+.configui .row input{
+ flex-grow: 1;
+ width: initial;
}
\ No newline at end of file
diff --git a/webinstall/cibuild.html b/webinstall/cibuild.html
index 98530d6..112a8a6 100644
--- a/webinstall/cibuild.html
+++ b/webinstall/cibuild.html
@@ -33,6 +33,10 @@
Build Flags
+
+ Error
+
+
diff --git a/webinstall/cibuild.js b/webinstall/cibuild.js
index 35d07b2..c62b852 100644
--- a/webinstall/cibuild.js
+++ b/webinstall/cibuild.js
@@ -56,6 +56,11 @@ import fileDownload from "https://cdn.skypack.dev/js-file-download@0.4.12"
enableEl('start',false);
return;
}
+ let e=document.getElementById('configError');
+ if (e.textContent) {
+ enableEl('start',false);
+ return;
+ }
if (displayMode != 'existing'){
if (currentPipeline !== undefined){
//check pipeline state
@@ -261,7 +266,7 @@ import fileDownload from "https://cdn.skypack.dev/js-file-download@0.4.12"
if (val === undefined) val=key;
re.setAttribute('type', 'radio');
re.setAttribute('name', name);
- re.addEventListener('change', (ev) => callback(v.children,key,val,false));
+ re.addEventListener('change', (ev) => callback(v.children,key,val,v.resource,false));
if (v.description && v.url) {
let lnk = addEl('a', 'radioDescription', ef, v.description);
lnk.setAttribute('href', v.url);
@@ -269,7 +274,7 @@ import fileDownload from "https://cdn.skypack.dev/js-file-download@0.4.12"
}
if (key == current) {
re.setAttribute('checked','checked');
- callback(v.children,key,val,true);
+ callback(v.children,key,val,v.resource,true);
}
});
}
@@ -307,9 +312,9 @@ import fileDownload from "https://cdn.skypack.dev/js-file-download@0.4.12"
configList.forEach((cfg)=>{
let name=prefix?(prefix+SEPARATOR+cfg.key):cfg.key;
let current=config[name];
- buildSelector(frame,cfg,name,current,(children,key,value,initial)=>{
+ buildSelector(frame,cfg,name,current,(children,key,value,resource,initial)=>{
buildSelectors(name,children,initial);
- configStruct[name]={cfg:cfg, key: key, value:value};
+ configStruct[name]={cfg:cfg, key: key, value:value,resource:resource};
buildValues(initial);
})
})
@@ -321,27 +326,65 @@ import fileDownload from "https://cdn.skypack.dev/js-file-download@0.4.12"
if (! initial){
config={};
}
- for (let k in configStruct){
- let struct=configStruct[k];
- if (! struct || ! struct.cfg || struct.value === undefined) continue;
- config[k]=struct.key;
- if (struct.cfg.target !== undefined) {
- if (struct.cfg.target === 'environment') {
- environment = struct.value;
- }
- if (struct.cfg.target === 'define') {
- flags += " -D" + struct.value;
- }
- const DEFPRFX = "define:";
- if (struct.cfg.target.indexOf(DEFPRFX) == 0) {
- let def = struct.cfg.target.substring(DEFPRFX.length);
- flags += " -D" + def + "=" + struct.value;
+ let allowedResources={};
+ let currentResources={};
+ let errors="";
+ for (let round = 0; round <= 1; round++) {
+ //round1: find allowed resources
+ //round2: really collect values
+ for (let k in configStruct) {
+ let struct = configStruct[k];
+ if (!struct || !struct.cfg || struct.value === undefined) continue;
+ if (round > 0) config[k] = struct.key;
+ if (struct.cfg.target !== undefined) {
+ if (struct.cfg.target === 'environment') {
+ if (round > 0) environment = struct.value;
+ else allowedResources=struct.resource;
+ continue;
+ }
+ if (round < 1) continue;
+ if (struct.resource){
+ let resList=currentResources[struct.resource];
+ if (! resList){
+ resList=[];
+ currentResources[struct.resource]=resList;
+ }
+ resList.push(struct);
+ }
+ if (struct.cfg.target === 'define') {
+ flags += " -D" + struct.value;
+ continue;
+ }
+ const DEFPRFX = "define:";
+ if (struct.cfg.target.indexOf(DEFPRFX) == 0) {
+ let def = struct.cfg.target.substring(DEFPRFX.length);
+ flags += " -D" + def + "=" + struct.value;
+ continue;
+ }
}
}
}
document.getElementById('environment').value=environment;
document.getElementById('buildflags').value=flags;
+ //check resources
+ for (let k in currentResources){
+ let resList=currentResources[k];
+ if (allowedResources[k] !== undefined){
+ if (resList.length > allowedResources[k]){
+ errors+=" more than "+allowedResources[k]+" "+k+" device(s) used";
+ }
+ }
+ }
+ if (errors){
+ setValue('configError',errors);
+ setVisible('configError',true,true);
+ }
+ else{
+ setValue('configError','');
+ setVisible('configError',false,true);
+ }
if (! initial) findPipeline();
+ updateStart();
}
let findIdx=0;
const findPipeline=()=>{