void IceCrystalsMode::init(){
  for (int a=0;a<ICE_COUNT;a++){
    initializeIce(a);
    if(random(0,100)>60){
      ice[a].state = ICE_SLEEPING; 
      ice[a].wakeupTime = millis()+random(1000,2000);
    }
  }
}
예제 #2
0
RosImageServer::RosImageServer(int argc, char **argv, std::string nodeName)
{
    initializeROS(argc,argv,nodeName);
    runROSSpinner();

    initializeIce(argc,argv);

    addRosImagePublisher("test",1000);
    addRosImageSubscriber<RosImageServer>("test",1000,&RosImageServer::rosCallback,this);

    addIceProxy("SimpleImage:default -p 10000");


}
void IceCrystalsMode::loop(struct rgb *leds){
  struct rgb color;

  color.r = random(0,255);
  color.g = random(0,255);
  color.b = random(0,255);
  for(int whiteLed = 0; whiteLed < count; whiteLed = whiteLed + 1) {
    leds[whiteLed].g = constrain(9.8*leds[whiteLed].g/10.0-1, 0, 255);
    leds[whiteLed].r = constrain(9.8*leds[whiteLed].r/10.0-1, 0, 255);
    leds[whiteLed].b = constrain(9.8*leds[whiteLed].b/10.0-1, 0, 255);
  }
  for (int a=0;a<ICE_COUNT;a++){
    struct rgb *led = &leds[(int)round(ice[a].position*count)];
    struct rgb *ledr;
    struct rgb *ledl;
    int r, l;
    double npr, npl;
    int flicker = random(10,50);
    switch(ice[a].state){
      case ICE_GROWING:
        led->g = ((millis()-ice[a].start)*50)/(ice[a].growingSpeed-ice[a].start+1);
        led->r = ((millis()-ice[a].start)*70)/(ice[a].growingSpeed-ice[a].start+1);
        led->b = ((millis()-ice[a].start)*200)/(ice[a].growingSpeed-ice[a].start+1);
        if (millis()>ice[a].growingSpeed){
          ice[a].state = ICE_FLICKERING;
        }
        break;
      case ICE_FLICKERING: 
        led->g = flicker+50;
        led->r = flicker+70;
        led->b = flicker+200;
        if (millis()>ice[a].flickeringDuration){
          ice[a].state = ICE_EXPLODING;
        }
        break;
      case ICE_EXPLODING: 
        
        //led->b = 100-((millis()-ice[a].flickeringDuration)*100)/(ice[a].explodingDuration/10-ice[a].flickeringDuration);
        //led->r = 100-((millis()-ice[a].flickeringDuration)*100)/(ice[a].explodingDuration/10-ice[a].flickeringDuration);
        //led->g = 100-((millis()-ice[a].flickeringDuration)*100)/(ice[a].explodingDuration/10-ice[a].flickeringDuration);
        npr = ice[a].position+(ice[a].explodingSpeed*(millis()-ice[a].flickeringDuration));
        npl = ice[a].position-(ice[a].explodingSpeed*(millis()-ice[a].flickeringDuration));
        r = round(npr*count);
        l = round(npl*count);
        if(r>=0 && r<count){
          ledr = &leds[r];
          ledr->g = 0;
          ledr->r = 0;
          ledr->b = 10;
        }
        if(l>=0 && l<count){
          ledl = &leds[l];
          ledl->g = 0;
          ledl->r = 0;
          ledl->b = 10;
        }
        if (millis()>ice[a].explodingDuration){
          ice[a].state = ICE_SLEEPING;
        }
        break;
      case ICE_SLEEPING: 
        if (millis()>ice[a].wakeupTime){
          initializeIce(a);
        }
        break;
    }
  }
}