/**
* Lego Ladder - Professional Arduino Exporter
*/
export function generateArduinoCode(program) {
const pinMap = new Map();
const setupLines = [];
const loopLines = [];
program.rungs.forEach((rung, idx) => {
const expressionParts = [];
const rungOutputs = [];
rung.series.forEach((comp) => {
switch (comp.type) {
case 'contact': {
const c = comp;
const pin = parseInt(c.address.split(':')[1]) || 0; // Simple parse
const varName = `pin_${c.address.replace(/[^a-zA-Z0-9]/g, '_')}`;
pinMap.set(pin, varName);
setupLines.push(`pinMode(${varName}, INPUT_PULLUP);`);
expressionParts.push(`(digitalRead(${varName}) == ${c.contactType === 'NO' ? 'LOW' : 'HIGH'})`);
break;
}
case 'coil': {
const c = comp;
const pin = parseInt(c.address.split(':')[1]) || 0;
const varName = `pin_${c.address.replace(/[^a-zA-Z0-9]/g, '_')}`;
pinMap.set(pin, varName);
setupLines.push(`pinMode(${varName}, OUTPUT);`);
rungOutputs.push(`digitalWrite(${varName}, rung${idx}_state ? HIGH : LOW);`);
break;
}
case 'gate': {
const g = comp;
// This is a simplified mapping for demo purposes
// A real compiler would map individual pin states
expressionParts.push(`true`);
break;
}
}
});
const expr = expressionParts.join(' ') || 'false';
loopLines.push(` bool rung${idx}_state = ${expr};`);
rungOutputs.forEach(line => loopLines.push(` ${line}`));
});
return `
// Generated by Lego Technic PLC
void setup() {
${setupLines.map(l => ' ' + l).join('\n')}
}
void loop() {
${loopLines.map(l => ' ' + l).join('\n')}
delay(10);
}
`.trim();
}