Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/vlaunch/vlaunch.c

    r1c635d6 r62fbb7e  
    4141#include <str.h>
    4242#include <str_error.h>
    43 #include <loc.h>
    44 #include <fibril_synch.h>
    45 #include <io/pixel.h>
    46 #include <device/led_dev.h>
    4743
    4844#include <window.h>
     
    6460#define LOGO_HEIGHT  66
    6561
    66 #define PERIOD  1000000
    67 #define COLORS  7
    68 
    6962static char *winreg = NULL;
    70 static fibril_timer_t *timer = NULL;
    71 static list_t led_devs;
    72 
    73 static pixel_t colors[COLORS] = {
    74         PIXEL(0xff, 0xff, 0x00, 0x00),
    75         PIXEL(0xff, 0x00, 0xff, 0x00),
    76         PIXEL(0xff, 0x00, 0x00, 0xff),
    77         PIXEL(0xff, 0xff, 0xff, 0x00),
    78         PIXEL(0xff, 0xff, 0x00, 0xff),
    79         PIXEL(0xff, 0x00, 0xff, 0xff),
    80         PIXEL(0xff, 0xff, 0xff, 0xff)
    81 };
    82 
    83 static unsigned int color = 0;
    84 
    85 typedef struct {
    86         link_t link;
    87         service_id_t svc_id;
    88         async_sess_t *sess;
    89 } led_dev_t;
    9063
    9164static int app_launch(const char *app)
    9265{
     66        int rc;
    9367        printf("%s: Spawning %s %s \n", NAME, app, winreg);
    94        
     68
    9569        task_id_t id;
    96         task_wait_t wait;
    97         int rc = task_spawnl(&id, &wait, app, app, winreg, NULL);
     70        task_exit_t texit;
     71        int retval;
     72        rc = task_spawnl(&id, app, app, winreg, NULL);
    9873        if (rc != EOK) {
    9974                printf("%s: Error spawning %s %s (%s)\n", NAME, app,
     
    10176                return -1;
    10277        }
    103        
    104         task_exit_t texit;
    105         int retval;
    106         rc = task_wait(&wait, &texit, &retval);
    107         if ((rc != EOK) || (texit != TASK_EXIT_NORMAL)) {
     78        rc = task_wait(id, &texit, &retval);
     79        if (rc != EOK || texit != TASK_EXIT_NORMAL) {
    10880                printf("%s: Error retrieving retval from %s (%s)\n", NAME,
    10981                    app, str_error(rc));
    11082                return -1;
    11183        }
    112        
     84
    11385        return retval;
    11486}
     
    129101}
    130102
    131 static void timer_callback(void *data)
    132 {
    133         pixel_t next_color = colors[color];
    134        
    135         color++;
    136         if (color >= COLORS)
    137                 color = 0;
    138        
    139         list_foreach(led_devs, link, led_dev_t, dev) {
    140                 if (dev->sess)
    141                         led_dev_color_set(dev->sess, next_color);
    142         }
    143        
    144         fibril_timer_set(timer, PERIOD, timer_callback, NULL);
    145 }
    146 
    147 static void loc_callback(void)
    148 {
    149         category_id_t led_cat;
    150         int rc = loc_category_get_id("led", &led_cat, IPC_FLAG_BLOCKING);
    151         if (rc != EOK)
    152                 return;
    153        
    154         service_id_t *svcs;
    155         size_t count;
    156         rc = loc_category_get_svcs(led_cat, &svcs, &count);
    157         if (rc != EOK)
    158                 return;
    159        
    160         for (size_t i = 0; i < count; i++) {
    161                 bool known = false;
    162                
    163                 /* Determine whether we already know this device. */
    164                 list_foreach(led_devs, link, led_dev_t, dev) {
    165                         if (dev->svc_id == svcs[i]) {
    166                                 known = true;
    167                                 break;
    168                         }
    169                 }
    170                
    171                 if (!known) {
    172                         led_dev_t *dev = (led_dev_t *) calloc(1, sizeof(led_dev_t));
    173                         if (!dev)
    174                                 continue;
    175                        
    176                         link_initialize(&dev->link);
    177                         dev->svc_id = svcs[i];
    178                         dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, svcs[i], 0);
    179                        
    180                         list_append(&dev->link, &led_devs);
    181                 }
    182         }
    183        
    184         // FIXME: Handle LED device removal
    185        
    186         free(svcs);
    187 }
    188 
    189103int main(int argc, char *argv[])
    190104{
    191105        if (argc < 2) {
    192106                printf("Compositor server not specified.\n");
    193                 return 1;
    194         }
    195        
    196         list_initialize(&led_devs);
    197         int rc = loc_register_cat_change_cb(loc_callback);
    198         if (rc != EOK) {
    199                 printf("Unable to register callback for device discovery.\n");
    200                 return 1;
    201         }
    202        
    203         timer = fibril_timer_create(NULL);
    204         if (!timer) {
    205                 printf("Unable to create timer.\n");
    206107                return 1;
    207108        }
     
    262163        window_exec(main_window);
    263164       
    264         fibril_timer_set(timer, PERIOD, timer_callback, NULL);
    265        
    266165        task_retval(0);
    267166        async_manager();
Note: See TracChangeset for help on using the changeset viewer.