Changeset b5674b2 in mainline
- Timestamp:
- 2014-05-16T23:35:02Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 527f1ca
- Parents:
- 1e94e09
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/vlaunch/vlaunch.c
r1e94e09 rb5674b2 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 int rc = task_spawnl(&id, app, app, winreg, NULL); 73 97 if (rc != EOK) { 74 98 printf("%s: Error spawning %s %s (%s)\n", NAME, app, … … 76 100 return -1; 77 101 } 102 103 task_exit_t texit; 104 int retval; 78 105 rc = task_wait(id, &texit, &retval); 79 if ( rc != EOK || texit != TASK_EXIT_NORMAL) {106 if ((rc != EOK) || (texit != TASK_EXIT_NORMAL)) { 80 107 printf("%s: Error retrieving retval from %s (%s)\n", NAME, 81 108 app, str_error(rc)); 82 109 return -1; 83 110 } 84 111 85 112 return retval; 86 113 } … … 99 126 { 100 127 app_launch("/app/vlaunch"); 128 } 129 130 static void timer_callback(void *data) 131 { 132 pixel_t next_color = colors[color]; 133 134 color++; 135 if (color >= COLORS) 136 color = 0; 137 138 list_foreach(led_devs, link, led_dev_t, dev) { 139 if (dev->sess) 140 led_dev_color_set(dev->sess, next_color); 141 } 142 143 fibril_timer_set(timer, PERIOD, timer_callback, NULL); 144 } 145 146 static void loc_callback(void) 147 { 148 category_id_t led_cat; 149 int rc = loc_category_get_id("led", &led_cat, IPC_FLAG_BLOCKING); 150 if (rc != EOK) 151 return; 152 153 service_id_t *svcs; 154 size_t count; 155 rc = loc_category_get_svcs(led_cat, &svcs, &count); 156 if (rc != EOK) 157 return; 158 159 for (size_t i = 0; i < count; i++) { 160 bool known = false; 161 162 /* Determine whether we already know this device. */ 163 list_foreach(led_devs, link, led_dev_t, dev) { 164 if (dev->svc_id == svcs[i]) { 165 known = true; 166 break; 167 } 168 } 169 170 if (!known) { 171 led_dev_t *dev = (led_dev_t *) calloc(1, sizeof(led_dev_t)); 172 if (!dev) 173 continue; 174 175 link_initialize(&dev->link); 176 dev->svc_id = svcs[i]; 177 dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, svcs[i], 0); 178 179 list_append(&dev->link, &led_devs); 180 } 181 } 182 183 // FIXME: Handle LED device removal 184 185 free(svcs); 101 186 } 102 187 … … 105 190 if (argc < 2) { 106 191 printf("Compositor server not specified.\n"); 192 return 1; 193 } 194 195 list_initialize(&led_devs); 196 int rc = loc_register_cat_change_cb(loc_callback); 197 if (rc != EOK) { 198 printf("Unable to register callback for device discovery.\n"); 199 return 1; 200 } 201 202 timer = fibril_timer_create(); 203 if (!timer) { 204 printf("Unable to create timer.\n"); 107 205 return 1; 108 206 } … … 163 261 window_exec(main_window); 164 262 263 fibril_timer_set(timer, PERIOD, timer_callback, NULL); 264 165 265 task_retval(0); 166 266 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.