LinkedIn YouTube Facebook
Szukaj

Wstecz
IoT

ISIX-RTOS – trzy wątki, przykłady w języku C: termometr z wyświetlaczem LED-RGB

List. 3. Funkcja tempsensor_get()

static int tempsensor_get(float *t)
{
  static const unsigned char temp_reg = MCP9800_TEMP_REG;
  static char temp[2];
  int ecode;
  //Read the temperature
  ecode = i2cm_transfer_7bit(TEMPSENSOR_I2CADDR,&temp_reg,sizeof(temp_reg),
                             temp,sizeof(temp));
  //Convert to integer
  if(ecode>=0)  
  {
    *t = (float)temp[0] + (temp[1]>>4)/16.0f;
  }
  return ecode;
}

Tak wyliczona wartość jest przekazywana do struktury msg i przesyłana do kolejki FIFO. Za wizualizację temperatury odpowiedzialny jest wątek display_srv_task , który odbiera informację o aktualnej temperaturze z kolejki FIFO i wizualizuje ją na diodzie RGB (list. 4).

List. 4. Wątek odpowiadający za odbiór danych o aktualnej temperaturze z kolejki FIFO i jej wizualizację na diodzie RGB

#define COLD_VALUE 24.0f        /* Cold value */
#define HOT_VALUE 30.0f         /* Hot Value */
#define PWM_MAX 255             /* Maximum pwm value */
#define PWM_MAX_F 255.5
#define A_VALUE -0.1f           /* A value of quadratic equation */
#define FAIL_AMBER_VAL 200      /* Fail amber 4 PWM ratio */

/** Display server task */
static ISIX_TASK_FUNC(display_srv_task, entry_params)
{
  fifo_t *temp_fifo = (fifo_t*)entry_params;      
  struct msg msg;                 //Message structure
                                  //If init rgb fail terminate task
  if(rgb_init()<0)
  {
    isix_task_delete(NULL);
  }
  unsigned pcolor = 0;
  for(;;)
  {
    //Read data from fifo
    if(isix_fifo_read( temp_fifo, &msg,ISIX_TIME_INFINITE )==ISIX_EOK)
    {
      //Display temp or error
      if(msg.errno>=0)
      {
        //Calculate saturation  
        int b = PWM_MAX_F * (HOT_VALUE - msg.t) / (HOT_VALUE-COLD_VALUE);
        int g = PWM_MAX_F * (A_VALUE * (msg.t-COLD_VALUE) * (msg.t-HOT_VALUE));
        int r = PWM_MAX_F * (msg.t-COLD_VALUE) / (HOT_VALUE-COLD_VALUE);
        if(b<0) b=0; else if(b>PWM_MAX) b=PWM_MAX;                                
        if(r<0) r=0; else if(r>PWM_MAX) r=PWM_MAX;
        if(g<0) g=0; else if(g>PWM_MAX) g=PWM_MAX;                 
        //Calculate color                                
        unsigned color = RGB(r,g,b);
        //Update britness only if color changed value
        if(color!=pcolor)
        rgb_set_color(color);
        pcolor = color;
      }
      else    // If fail enable only amber             
        rgb_set_color( RGBA( 0, 0, 0, FAIL_AMBER_VAL));
    }
  }
}