/*Copy colors to dmx storage*/ for(uint16_t i=0;i<DMX_EFFECT_RAINBOW_CHANNELS+(DMX_EFFECT_RAINBOW_MARGIN*DMX_EFFECT_RAINBOW_CHANNELS);i++) { #if (DMX_EFFECT_RAINBOW_MARGIN > 0) for(uint8_t j=0;j<DMX_EFFECT_RAINBOW_MARGIN;j++) { set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE, DMX_EFFECT_RAINBOW_OFFSET+i,DMX_EFFECT_RAINBOW_MARGIN_FILL); i++; } #endif int pos = i + (i - 1 ) / 15; if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == DMX_EFFECT_RAINBOW_MARGIN) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+pos,color_r); if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == 2*DMX_EFFECT_RAINBOW_MARGIN+1) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+pos,color_g); if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == 3*DMX_EFFECT_RAINBOW_MARGIN+2) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+pos,color_b); } } #endif /*Rainbow end*/ #ifdef DMX_EFFECT_RANDOM uint8_t random_enabled = DMX_EFFECT_DISABLED; uint8_t random_channels[DMX_EFFECT_RANDOM_CHANNELS] = {0}; void dmx_effect_random_colors_gen(void) { uint8_t red,green,blue; #ifndef DMX_EFFECT_RANDOM_ALL red=rand()%256; green=rand()%256; blue=rand()%256; #endif for(uint8_t i=0;i<DMX_EFFECT_RANDOM_CHANNELS;i++) { #ifdef DMX_EFFECT_RANDOM_ALL if(i%3 == 0) { red=rand()%256; green=rand()%256; blue=rand()%256; } #endif if(i%3 == 0) random_channels[i]=red; if(i%3 == 1) random_channels[i]=green; if(i%3 == 2) random_channels[i]=blue; } } void dmx_effect_random_colors_show() { for(uint8_t i=0;i<DMX_EFFECT_RANDOM_CHANNELS+DMX_EFFECT_RANDOM_CHANNELS*DMX_EFFECT_RANDOM_MARGIN;i++) { #if (DMX_EFFECT_RAINBOW_MARGIN > 0) for(uint8_t j=0;j<DMX_EFFECT_RANDOM_MARGIN;j++) { set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE, DMX_EFFECT_RANDOM_OFFSET+i,DMX_EFFECT_RANDOM_MARGIN_FILL); i++; } #endif uint8_t tmp_value=get_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i); uint8_t target_value=random_channels[(i+1)/(DMX_EFFECT_RANDOM_MARGIN+1)-1]; if(tmp_value > target_value) set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i,tmp_value-1); else if (tmp_value < target_value) set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i,tmp_value+1); //else == : we do nothing, everything's set } } #endif /*Random end*/ void dmx_effect_init() { #ifdef DMX_EFFECT_RAINBOW color_r = 255; color_g = 128; color_b = 0; set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+3, color_r); set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+4, color_g); set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+5, color_b); #endif }
void dmx_effect_rainbow_colors(void) { static uint8_t rainbow_step = 0; static uint16_t rainbow_delay = 0; if (rainbow_delay++ <= (RAINBOW_DELAY / DMX_STORAGE_CHANNELS)) return; rainbow_delay = 0; switch(rainbow_step) { case 0: if (color_g > 1) { color_g--; color_b++; } else { rainbow_step++; } break; case 1: if (color_r > 1) { color_r--; color_g++; } else { rainbow_step++; } break; case 2: if (color_b > 1) { color_b--; color_r++; } else { rainbow_step = 0; } break; } /*Copy colors to dmx storage*/ for(uint16_t i=0;i<DMX_EFFECT_RAINBOW_CHANNELS+(DMX_EFFECT_RAINBOW_MARGIN*DMX_EFFECT_RAINBOW_CHANNELS);i++) { #if (DMX_EFFECT_RAINBOW_MARGIN > 0) for(uint8_t j=0;j<DMX_EFFECT_RAINBOW_MARGIN;j++) { set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE, DMX_EFFECT_RAINBOW_OFFSET+i,DMX_EFFECT_RAINBOW_MARGIN_FILL); i++; } #endif if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == DMX_EFFECT_RAINBOW_MARGIN) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+i,color_r); if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == 2*DMX_EFFECT_RAINBOW_MARGIN+1) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+i,color_g); if(i%(DMX_EFFECT_RAINBOW_MARGIN*3+3) == 3*DMX_EFFECT_RAINBOW_MARGIN+2) set_dmx_channel(DMX_EFFECT_RAINBOW_UNIVERSE,DMX_EFFECT_RAINBOW_OFFSET+i,color_b); } }
int16_t parse_cmd_dmx_set_channels(char *cmd, char *output, uint16_t len) { uint16_t startchannel=0, universe=0, value=0, channelcounter=0,i=0,blankcounter=0; if (cmd[0]!=0) { sscanf_P(cmd, PSTR("%u %u"), &universe,&startchannel); if (startchannel >= DMX_STORAGE_CHANNELS) return ECMD_ERR_PARSE_ERROR; if (universe >= DMX_STORAGE_UNIVERSES) return ECMD_ERR_PARSE_ERROR; while(blankcounter<3) { if(cmd[i] == ' ') blankcounter++; i++; } while (cmd[i]!='\0'){ //read and write all values sscanf_P(cmd+i, PSTR(" %u"),&value); if(set_dmx_channel(universe,startchannel+channelcounter,value)) return ECMD_ERR_WRITE_ERROR; channelcounter++; do{ //search for next space i++; if(cmd[i]=='\0') break; }while(cmd[i]!=' '); } return ECMD_FINAL_OK; } else return ECMD_ERR_PARSE_ERROR; }
void dmx_effect_random_colors_show() { for(uint8_t i=0;i<DMX_EFFECT_RANDOM_CHANNELS+DMX_EFFECT_RANDOM_CHANNELS*DMX_EFFECT_RANDOM_MARGIN;i++) { #if (DMX_EFFECT_RAINBOW_MARGIN > 0) for(uint8_t j=0;j<DMX_EFFECT_RANDOM_MARGIN;j++) { set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE, DMX_EFFECT_RANDOM_OFFSET+i,DMX_EFFECT_RANDOM_MARGIN_FILL); i++; } #endif uint8_t tmp_value=get_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i); uint8_t target_value=random_channels[(i+1)/(DMX_EFFECT_RANDOM_MARGIN+1)-1]; if(tmp_value > target_value) set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i,tmp_value-1); else if (tmp_value < target_value) set_dmx_channel(DMX_EFFECT_RANDOM_UNIVERSE,DMX_EFFECT_RANDOM_OFFSET+i,tmp_value+1); //else == : we do nothing, everything's set } }
int16_t parse_cmd_dmx_set_channel(char *cmd, char *output, uint16_t len) { uint16_t channel=0, ret=0,value=0, universe=0; if (cmd[0]!=0) ret = sscanf_P(cmd, PSTR("%u %u %u"), &universe,&channel,&value); if (ret == 3) { if (channel >= DMX_STORAGE_CHANNELS) return ECMD_ERR_PARSE_ERROR; if (universe >= DMX_STORAGE_UNIVERSES) return ECMD_ERR_PARSE_ERROR; if(set_dmx_channel(universe,channel,value)) return ECMD_ERR_WRITE_ERROR; else return ECMD_FINAL_OK; } else return ECMD_ERR_PARSE_ERROR; }