feat: update AMS section UI and functionality for slot editing
This commit is contained in:
@@ -2054,6 +2054,7 @@ nav.bottom-nav{display:none;position:fixed;bottom:0;left:0;right:0;
|
||||
oninput="highlightMatBtn(this.value)"
|
||||
style="margin-top:8px;width:100%;padding:6px 10px;background:var(--raised);border:1px solid var(--border);border-radius:6px;color:var(--txt);font-size:13px;box-sizing:border-box">
|
||||
</div>
|
||||
<button class="btn" id="btn-slot-edit-feed" style="width:100%;margin-bottom:8px" onclick="slotEditFeed()"></button>
|
||||
<button class="modal-save" id="btn-slot-edit-save" onclick="saveSlotEdit()"></button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2252,23 +2253,10 @@ nav.bottom-nav{display:none;position:fixed;bottom:0;left:0;right:0;
|
||||
|
||||
<!-- AMS -->
|
||||
<div class="card" style="grid-column:1/-1" id="d-ams-card">
|
||||
<div class="card-title"><span>◫</span> <span id="d-card-ams">AMS / Filamentbox</span></div>
|
||||
<div class="card-title"><span>◫</span> <span id="d-card-ams">Filament</span></div>
|
||||
<div class="ams-slots" id="ams-slots">
|
||||
<div style="grid-column:1/-1;text-align:center;color:var(--txt2);padding:20px" id="ams-no-data">Keine AMS-Daten empfangen</div>
|
||||
</div>
|
||||
<div id="ams-controls" style="margin-top:16px;display:flex;flex-direction:column;gap:10px">
|
||||
<div style="font-size:12px;color:var(--txt2);margin-bottom:2px" id="ams-slot-lbl">Slot auswählen</div>
|
||||
<div style="display:flex;align-items:center;gap:10px">
|
||||
<input type="range" id="ams-slot-sel" min="0" max="3" step="1" value="0"
|
||||
class="slider" style="flex:1"
|
||||
oninput="(function(v){var s=(window._amsSlots||[])[parseInt(v)]||{};var g=s.global_index!=null?s.global_index:parseInt(v);document.getElementById('ams-slot-label').textContent='Slot '+(g+1);})(this.value)">
|
||||
<span id="ams-slot-label" style="min-width:48px;font-size:13px;font-weight:600">Slot 1</span>
|
||||
</div>
|
||||
<div style="display:flex;gap:10px">
|
||||
<button class="btn" style="flex:1" onclick="amsFeed(1)">⬇ <span class="lbl-feed">Einziehen</span></button>
|
||||
<button id="btn-unload" class="btn" style="flex:1" onclick="amsFeed(2)">⬆ <span class="lbl-unload">Ausziehen</span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -2393,7 +2381,7 @@ var LANG_DE={
|
||||
label_set:'Setzen',label_off:'Aus',
|
||||
panel_temps_nozzle:'Nozzle',panel_temps_bed:'Heizbett',panel_temps_chart:'Verlauf (letzte 60 Messungen)',label_target_c:'Ziel:',
|
||||
panel_motion_xy:'XY-Achsen',panel_motion_z:'Z-Achse',label_step:'Schrittweite:',btn_home_z:'Home Z',btn_home_xy:'Home XY',btn_home_all:'Home All',btn_disable_motors:'Motoren aus',
|
||||
panel_ams_title:'AMS / Filamentbox',ams_no_data:'Keine AMS-Daten empfangen',label_slot:'Slot',ams_empty:'Leer',
|
||||
panel_ams_title:'Filament',card_ams:'Filament',ams_no_data:'Keine AMS-Daten empfangen',label_slot:'Slot',ams_empty:'Leer',
|
||||
panel_extras_light:'Licht',panel_extras_fan:'Lüfter',panel_extras_camera:'Kamera',btn_cam_start2:'▶ Start',btn_cam_stop2:'◼ Stop',
|
||||
panel_console_title:'Ereignis-Log',
|
||||
log_light_on:'Licht an',log_light_off:'Licht aus',log_fan:'Lüfter →',log_nozzle:'Nozzle →',log_bed:'Bett →',log_axis:'Achse',log_home:'Home',log_home_all:'Home All',log_cam_start:'Kamera gestartet:',log_cam_stop:'Kamera gestoppt',log_poll_error:'Poll-Fehler:',log_error:'Fehler:',
|
||||
@@ -2407,6 +2395,7 @@ var LANG_DE={
|
||||
btn_connect:'⚡ Verbinden',btn_disconnect:'✕ Trennen',
|
||||
lbl_conn_error:'Verbindungsfehler:',
|
||||
slot_edit_title:'Slot bearbeiten',slot_edit_color:'Farbe',slot_edit_material:'Material',
|
||||
slot_edit_load:'⬇ Einziehen',slot_edit_unload:'⬆ Ausziehen',
|
||||
slot_edit_save:'💾 Speichern',slot_edit_custom:'z.B. PLA, PETG, ABS…',
|
||||
slot_edit_ok:'AMS Slot',
|
||||
log_dir_all:'Alle',
|
||||
@@ -2454,7 +2443,7 @@ var LANG_EN={
|
||||
label_set:'Set',label_off:'Off',
|
||||
panel_temps_nozzle:'Nozzle',panel_temps_bed:'Heated Bed',panel_temps_chart:'History (last 60 readings)',label_target_c:'Target:',
|
||||
panel_motion_xy:'XY Axes',panel_motion_z:'Z Axis',label_step:'Step size:',btn_home_z:'Home Z',btn_home_xy:'Home XY',btn_home_all:'Home All',btn_disable_motors:'Motors Off',
|
||||
panel_ams_title:'AMS / Filament Box',ams_no_data:'No AMS data received',label_slot:'Slot',ams_empty:'Empty',
|
||||
panel_ams_title:'Filament',card_ams:'Filament',ams_no_data:'No AMS data received',label_slot:'Slot',ams_empty:'Empty',
|
||||
panel_extras_light:'Light',panel_extras_fan:'Fan',panel_extras_camera:'Camera',btn_cam_start2:'▶ Start',btn_cam_stop2:'◼ Stop',
|
||||
panel_console_title:'Event Log',
|
||||
log_light_on:'Light on',log_light_off:'Light off',log_fan:'Fan →',log_nozzle:'Nozzle →',log_bed:'Bed →',log_axis:'Axis',log_home:'Home',log_home_all:'Home All',log_cam_start:'Camera started:',log_cam_stop:'Camera stopped',log_poll_error:'Poll error:',log_error:'Error:',
|
||||
@@ -2468,6 +2457,7 @@ var LANG_EN={
|
||||
btn_connect:'⚡ Connect',btn_disconnect:'✕ Disconnect',
|
||||
lbl_conn_error:'Connection error:',
|
||||
slot_edit_title:'Edit Slot',slot_edit_color:'Color',slot_edit_material:'Material',
|
||||
slot_edit_load:'⬇ Load',slot_edit_unload:'⬆ Unload',
|
||||
slot_edit_save:'💾 Save',slot_edit_custom:'e.g. PLA, PETG, ABS…',
|
||||
slot_edit_ok:'AMS Slot',
|
||||
log_dir_all:'All',
|
||||
@@ -2663,6 +2653,7 @@ function applyLang(){
|
||||
setText('lbl-slot-color',T.slot_edit_color);
|
||||
setText('lbl-slot-material',T.slot_edit_material);
|
||||
setText('btn-slot-edit-save',T.slot_edit_save);
|
||||
updateSlotEditFeedButton();
|
||||
var mi=document.getElementById('slot-edit-mat');if(mi)mi.setAttribute('placeholder',T.slot_edit_custom);
|
||||
setText('logdir-all',T.log_dir_all);
|
||||
setText('file-ready-btn',T.file_ready_btn);
|
||||
@@ -2888,10 +2879,10 @@ function applyState(){
|
||||
|
||||
var amsTitle=document.getElementById('d-card-ams');
|
||||
if(amsTitle){
|
||||
var baseTitle=T.card_ams||'AMS / Filamentbox';
|
||||
var baseTitle=T.card_ams||'Filament';
|
||||
var modeMap={toolhead:'Toolhead',ace_direct:'ACE Direct',ace_hub:'ACE Hub'};
|
||||
var modeTxt=modeMap[s.filament_mode]||'';
|
||||
amsTitle.textContent=modeTxt?(baseTitle+' · '+modeTxt):baseTitle;
|
||||
amsTitle.textContent=modeTxt?(baseTitle+' - '+modeTxt):baseTitle;
|
||||
}
|
||||
|
||||
// AMS
|
||||
@@ -2946,17 +2937,6 @@ function applyState(){
|
||||
html+='</div></div>';
|
||||
});
|
||||
document.getElementById('ams-slots').innerHTML=html;
|
||||
// Update feed/unload slot slider range
|
||||
var sel=document.getElementById('ams-slot-sel');
|
||||
if(sel){
|
||||
var maxSlot=s.ams_slots.length-1;
|
||||
sel.max=maxSlot;
|
||||
if(parseInt(sel.value)>maxSlot){
|
||||
sel.value=0;
|
||||
var lbl=document.getElementById('ams-slot-label');
|
||||
if(lbl)lbl.textContent='Slot 1';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// camera overlay
|
||||
@@ -3060,11 +3040,23 @@ function closeSettings(){
|
||||
|
||||
// ── AMS Slot Edit ──
|
||||
var _slotEditIndex=-1;
|
||||
var _slotEditLoaded=false;
|
||||
var _MAT_PRESETS=['PLA','PETG','ABS','ASA','TPU','PA','PC','HIPS'];
|
||||
function updateSlotEditFeedButton(){
|
||||
var btn=document.getElementById('btn-slot-edit-feed');
|
||||
if(!btn)return;
|
||||
if(_slotEditIndex<0){
|
||||
btn.style.display='none';
|
||||
return;
|
||||
}
|
||||
btn.style.display='';
|
||||
btn.textContent=_slotEditLoaded?(T.slot_edit_unload||'⬆ Unload'):(T.slot_edit_load||'⬇ Load');
|
||||
}
|
||||
function openSlotEdit(i){
|
||||
var slot=(window._amsSlots||[])[i]||{};
|
||||
var globalIdx=slot.global_index!=null?slot.global_index:(slot.index!=null?slot.index:i);
|
||||
_slotEditIndex=globalIdx;
|
||||
_slotEditLoaded=(S.ams_loaded_slot!=null&&S.ams_loaded_slot===globalIdx);
|
||||
document.getElementById('slot-edit-title').textContent=T.slot_edit_title+' '+(globalIdx+1);
|
||||
var rgb=Array.isArray(slot.color)?slot.color:[128,128,128];
|
||||
var hex='#'+rgb.map(function(v){return('0'+Math.min(255,v).toString(16)).slice(-2)}).join('');
|
||||
@@ -3079,11 +3071,24 @@ function openSlotEdit(i){
|
||||
+'style="padding:4px 10px;border-radius:6px;border:1px solid var(--border);cursor:pointer;font-size:12px;'
|
||||
+(m===mat?'background:var(--accent);color:#fff':'background:var(--raised);color:var(--txt2)')+'">'+m+'</button>';
|
||||
}).join('');
|
||||
updateSlotEditFeedButton();
|
||||
document.getElementById('slot-edit-modal').classList.add('open');
|
||||
}
|
||||
function closeSlotEdit(){
|
||||
_slotEditIndex=-1;
|
||||
document.getElementById('slot-edit-modal').classList.remove('open');
|
||||
}
|
||||
function slotEditFeed(){
|
||||
if(_slotEditIndex<0)return;
|
||||
var type=_slotEditLoaded?2:1;
|
||||
amsFeed(type,_slotEditIndex)
|
||||
.then(function(){
|
||||
_slotEditLoaded=!_slotEditLoaded;
|
||||
updateSlotEditFeedButton();
|
||||
poll();
|
||||
})
|
||||
.catch(function(){});
|
||||
}
|
||||
function startReadyFile(){
|
||||
var btn=document.getElementById('file-ready-btn');
|
||||
if(btn){btn.disabled=true;btn.textContent='…';}
|
||||
@@ -3318,13 +3323,18 @@ function quickFan(v){
|
||||
}
|
||||
|
||||
// ── AMS ──
|
||||
function amsFeed(type){
|
||||
var i=parseInt(document.getElementById('ams-slot-sel').value);
|
||||
var slot=(window._amsSlots||[])[i]||{};
|
||||
var globalIdx=slot.global_index!=null?slot.global_index:i;
|
||||
post('/api/ams/feed',{slot_index:globalIdx,type:type})
|
||||
function amsFeed(type,slotIndex){
|
||||
var globalIdx;
|
||||
if(typeof slotIndex==='number'&&slotIndex>=0){
|
||||
globalIdx=slotIndex;
|
||||
}else{
|
||||
var i=parseInt(document.getElementById('ams-slot-sel').value);
|
||||
var slot=(window._amsSlots||[])[i]||{};
|
||||
globalIdx=slot.global_index!=null?slot.global_index:i;
|
||||
}
|
||||
return post('/api/ams/feed',{slot_index:globalIdx,type:type})
|
||||
.then(function(){clog((type===1?T.lbl_feed:T.lbl_unload)+' Slot '+(globalIdx+1),'msg-ok')})
|
||||
.catch(function(e){clog('AMS-Fehler: '+e,'msg-err')});
|
||||
.catch(function(e){clog('AMS-Fehler: '+e,'msg-err');throw e;});
|
||||
}
|
||||
|
||||
// ── Camera ──
|
||||
|
||||
Reference in New Issue
Block a user