17.12.2010
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)); } } }