Пример #1
0
int main() {
     char filename[] = "cardioid.png";
     struct image *i;
     int x,y;
     double a, r;

     i = draw_create_image(300,300);

     draw_full(i, white);

     draw_color(i, black);
     for(x=-4;x<=4;x++) draw_textf(i, 150+x*30+3,150+3, 1, "%d", x);
     for(y=-4;y<=4;y++) draw_textf(i, 150+3,150-y*30+4, 1, "%d", y);

     draw_color(i,blue);
     for(x=0;x<300;x+=30) draw_line(i, x,0, x,i->height-1);
     for(y=0;y<300;y+=30) draw_line(i, 0,y, i->width-1,y);
     draw_box(i, 0,0, i->width-1,i->height-1);
     
     draw_color(i, black);

     for(x=-1;x<=1;x++)     
       draw_line(i, 150+x,0, 150+x,i->height-1);
     for(y=-1;y<=1;y++)     
       draw_line(i, 0,150+y, i->width-1,150+y);
     
     draw_color(i, green);
     
     /* Cardioid */
     for(a = 0.0; a < 360.0; a += 0.5) {
       r = 0.0 - sin(0.5*a/180*M_PI)*120.0;
       draw_pixel(i, 150+sin(a/180*M_PI)*r, 150+cos(a/180*M_PI)*r, red);
     }

     draw_color(i, black);
     draw_textf(i, 5,i->height-16-2, 2, "Cardioid");

     draw_write_png(i, filename);

     draw_free_image(i);

     return 0;
}
Пример #2
0
void fill_vbat_arr(char *arr, long vbat)
{
  long relax_vbat;

  substract_charge(vbat);
  switch (g_state)
    {
    case STATE_CHARGED:
      {
	draw_full(arr);
	if (vbat < 1000 * VBATOCVDOWN)
	  {
	    g_average = vbat;
	    g_relax_counter = 0;
	    g_state = STATE_INUSE;
	    g_relax_in_Vbat = vbat; // Prev vbat in fact
	  }
      }
      break;
    case STATE_INUSE:
      {
	draw_charge(arr, g_charge);
	g_average = (49 * g_average + vbat) / 50; // 10 seconds average
#ifdef USE_RELAX
	relax_vbat = get_relax_t(g_charge);
	
	if (myabs(g_average - vbat) <= RELAX_THRESHOLD ||
	    vbat > relax_vbat) // 0.15V
	  g_relax_counter++;
	else
	  g_relax_counter = 0;
	if (g_relax_counter > RELAX_EVENTS)
	  {
	    g_relax_in_Vbat = vbat;
	    g_state = STATE_RELAX;
	  }
#endif
	if (vbat < 1000 * VBATLOW ||
	    g_charge < 1000 * BATLIMIT)
	  {
	    g_state = STATE_TOO_LOW;
	  }
	if (vbat > 1000 * VBATOCVUP)
	  {
	    g_state = STATE_CHARGING;
	  }
      }
      break;
    case STATE_RELAX:
      {
	draw_charge(arr, g_charge);
	g_average = (49 * g_average + vbat) / 50; // 10 seconds average
	relax_vbat = get_relax_t(g_charge);
	if (g_average - vbat >= RELAX_THRESHOLD ||
	     myabs(g_relax_in_Vbat - vbat) >= RELAX_THRESHOLD ||
	    (relax_vbat - vbat) > 400)
	  {
	    g_relax_counter = 0;
	    g_state = STATE_INUSE;
	  }
	if (vbat > 1000 * VBATOCVUP)
	  {
	    g_state = STATE_CHARGING;
	  }
	if (vbat < 1000 * VBATLOW ||
	    g_charge < 1000 * BATLIMIT)
	  {
	    g_state = STATE_TOO_LOW;
	  }
      }
      break;
    case STATE_TOO_LOW:
      {
	draw_alarm(arr);
	if (vbat > 1000 * VBATOCVUP)
	  {
	    g_state = STATE_CHARGING;
	  }
	g_average = 0;
      }
      break;
    case STATE_CHARGING:
      {
	draw_charging(arr);
	if (vbat > 1000 * VBATENDCHARGE)
	  {
	    g_state = STATE_CHARGED;
	    g_charge = 1000 * BATCAP;
	  }
	draw_charging(arr);
	if (vbat < 1000 * VBATRELAXHI)
	  {
	    g_state = STATE_INUSE;
	  }
      }
      break;
    }
}