#ifndef __KYLOBLADE_H__ #define __KYLOBLADE_H__ #include #include #define KYLO_BLADE_OFF 0 #define KYLO_BLADE_ON 2 #define KYLO_MAX_SPARKLES 10 typedef struct _sparkle { bool free; uint32_t pos; uint32_t lenght; float brightness; float decay; COLOR color; } SPARKLE; class KyloBlade : public LedStripDriver { public: KyloBlade(); bool begin(uint32_t blade_count, uint32_t quillion_count, LedStripeType type = WS2812B); void setColors(const COLOR& blade, const COLOR& sparks); void setSpeed(uint8_t speed); void ignition(uint32_t quillon_delay); void retraction(uint32_t duration); void blaster(COLOR color, uint32_t duration, uint32_t length); void clash(COLOR color, uint32_t duration); void lockup(COLOR color, uint32_t freq); void stopLockup(); void poll(); void end(); inline bool isOn() { return state == KYLO_BLADE_ON; } private: void off(); void clearBuffer(); void updateAll(); void shimmerFillBlade(uint32_t shift); void shimmerFillQuillion(uint32_t shift); void doSpark(); void drawSparkles(uint8_t shift); void drawBlasters(); void drawClash(); void drawLockup(); void doRetraction(); COLOR blade_color; COLOR blade_shade; COLOR spark_color; bool do_clash; COLOR clash_color; uint32_t clash_ticks; float clash_brightness; float clash_decay; bool do_lockup; COLOR lockup_color; uint32_t lockup_freq; uint32_t lockup_ticks; uint32_t lockup_count; bool lockup_toggle; bool quillon_on; uint32_t ignition_time; uint32_t ignition_delay; bool do_retraction; uint32_t retraction_ticks; float retraction_leds_per_tick_blade; float retraction_leds_per_tick_quillion; uint32_t retraction_quillion_starts; float retraction_blade_count; float retraction_quillion_count; COLOR* buffer; uint32_t blade_length; uint32_t quillion_length; uint32_t total_length; uint32_t update_freq_ms; uint32_t state; uint32_t shift; uint8_t* heat_blade; uint8_t* heat_quillion; bool initialized; SPARKLE sparkles[KYLO_MAX_SPARKLES]; SPARKLE blasters[KYLO_MAX_SPARKLES]; }; #endif /* __KYLOBLADE_H__ */