From what I see in your latest code, I see no reason why it should not work. I guess it will. Try it.
If I made this node, I would put everything in a single node with nine inputs. Arguably, it would make the node more self-contained and easier to understand:
{{#global}}
// Escape to the global scope because ISR’s should be there
volatile unsigned int channel[9] = {
// these are initial valued=s
2000, 2400, 2600, 2800, 3000, 3200, 3600, 4000, 21400
};
volatile unsigned int ch = 0;
ISR(TIMER1_OVF_vect) {
OCR1A = channel[ch] ;
ch = ( ch++ > 8) ? 0 : ch;
}
{{/global}}
struct State {};
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
if (isSettingUp) {
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TIFR1 |= (1 << OCF1A); // clear any pending interrupts;
TCCR1A |= (1 << COM1B1); // Toggle on B compare
TCCR1A |= (1 << WGM10) | (1 << WGM11); // Fast PWM mode, TOP = OCR1A
TCCR1B |= (1 << WGM12) | (1 << WGM13); // Fast PWM mode, TOP = OCR1A
TCCR1B |= (1 << CS11); // 8 prescaler gives 500us tick size, i.e. 2 ticks per ms.
TIMSK1 |= (1 << TOIE1); // enable overflow vector
DDRB |= (1 << DDB2); // for Nano - turn on output pin 10 = OC1B (PB2).
//DDRB |= (1 << DDB6); // for Mega - turn on output pin 13 = OC1B (PB6)
OCR1B = 600; // for separator pulse of 300us - double for 8 prescaler
interrupts(); // enable all interrupts
}
// setting up or update on an input pin
// we refer the global array `channel`, so the ISR will have access to it
channel[0] = getValue<input_CH1>(ctx) * 2 + 1000;
channel[1] = getValue<input_CH2>(ctx) * 2 + 1000;
// ...
channel[8] = getValue<input_CH9>(ctx) * 2 + 1000;
}