Changes in uspace/app/vlaunch/vlaunch.c [62fbb7e:1c635d6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/vlaunch/vlaunch.c
r62fbb7e r1c635d6 41 41 #include <str.h> 42 42 #include <str_error.h> 43 #include <loc.h> 44 #include <fibril_synch.h> 45 #include <io/pixel.h> 46 #include <device/led_dev.h> 43 47 44 48 #include <window.h> … … 60 64 #define LOGO_HEIGHT 66 61 65 66 #define PERIOD 1000000 67 #define COLORS 7 68 62 69 static 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; 63 90 64 91 static int app_launch(const char *app) 65 92 { 66 int rc;67 93 printf("%s: Spawning %s %s \n", NAME, app, winreg); 68 94 69 95 task_id_t id; 70 task_exit_t texit; 71 int retval; 72 rc = task_spawnl(&id, app, app, winreg, NULL); 96 task_wait_t wait; 97 int rc = task_spawnl(&id, &wait, app, app, winreg, NULL); 73 98 if (rc != EOK) { 74 99 printf("%s: Error spawning %s %s (%s)\n", NAME, app, … … 76 101 return -1; 77 102 } 78 rc = task_wait(id, &texit, &retval); 79 if (rc != EOK || texit != TASK_EXIT_NORMAL) { 103 104 task_exit_t texit; 105 int retval; 106 rc = task_wait(&wait, &texit, &retval); 107 if ((rc != EOK) || (texit != TASK_EXIT_NORMAL)) { 80 108 printf("%s: Error retrieving retval from %s (%s)\n", NAME, 81 109 app, str_error(rc)); 82 110 return -1; 83 111 } 84 112 85 113 return retval; 86 114 } … … 99 127 { 100 128 app_launch("/app/vlaunch"); 129 } 130 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); 101 187 } 102 188 … … 105 191 if (argc < 2) { 106 192 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"); 107 206 return 1; 108 207 } … … 163 262 window_exec(main_window); 164 263 264 fibril_timer_set(timer, PERIOD, timer_callback, NULL); 265 165 266 task_retval(0); 166 267 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.