// use led state buffer and dirty flags static void monome_ring_enc_loopback(void* op, u32 edata) { u8 n; s8 val; monome_ring_enc_parse_event_data(edata, &n, &val); if(val > 0) { monomeLedBuffer[val + (n<<6)] = 15; monomeFrameDirty |= (1<<n); } }
// handler for arc encoders event, gets called whenever an encoder is turned static void handler_MonomeRingEnc(s32 data) { u8 n; s8 delta; monome_ring_enc_parse_event_data(data, &n, &delta); // n will be the encoder # 0..3 // delta is a signed value which indicates how much the encoder was turned // clockwise movement will generate positive delta, CCW - negative // i find that for simple tasks you might want to "desensitize" the input a bit // the following block achieves that by accumulating delta and only reacting to it when it passes the threshold // you might want to adjust or change this for your specific needs encoderDelta[n] += abs(delta); if (encoderDelta[n] < ENCODER_DELTA_SENSITIVITY) return; encoderDelta[n] = 0; // example on processing encoder events - here we update values array accordingly and refresh the arc // don't do anything too long here - for long operations consider using timers switch(n) { case 0: // first encoder turned if (delta > 0) // turned clockwise { if (values[0] < 64) values[0]++; } else // turned counter clockwise { if (values[0] > 0) values[0]--; } break; case 1: // second encoder turned if (delta > 0) // turned clockwise { if (values[1] < 64) values[1]++; } else // turned counter clockwise { if (values[1] > 0) values[1]--; } break; case 2: // third encoder turned if (delta > 0) // turned clockwise { if (values[2] < 64) values[2]++; } else // turned counter clockwise { if (values[2] > 0) values[2]--; } break; case 3: // fourth encoder turned if (delta > 0) // turned clockwise { if (values[3] < 64) values[3]++; } else // turned counter clockwise { if (values[3] > 0) values[3]--; } break; } updateArc(); updateCvOuts(); }