/* Event/Message loop for gcoap _pid thread. */ static void *_event_loop(void *arg) { msg_t msg_rcvd, msg_queue[GCOAP_MSG_QUEUE_SIZE]; (void)arg; msg_init_queue(msg_queue, GCOAP_MSG_QUEUE_SIZE); sock_udp_ep_t local; memset(&local, 0, sizeof(sock_udp_ep_t)); local.family = AF_INET6; local.netif = SOCK_ADDR_ANY_NETIF; local.port = GCOAP_PORT; int res = sock_udp_create(&_sock, &local, NULL, 0); if (res < 0) { DEBUG("gcoap: cannot create sock: %d\n", res); return 0; } while(1) { res = msg_try_receive(&msg_rcvd); if (res > 0) { switch (msg_rcvd.type) { case GCOAP_MSG_TYPE_TIMEOUT: _expire_request((gcoap_request_memo_t *)msg_rcvd.content.ptr); break; case GCOAP_MSG_TYPE_INTR: /* next _listen() timeout will account for open requests */ break; default: break; } } _listen(&_sock); } return 0; }
void led_thread(void) { msg_t msg; int ret; color_hsv_t hsv_0; color_hsv_t hsv_1; color_rgb_t rgb; float step_h = 1.0f; float step_s = 0.02f; float step_v = 0.02f; int step = 0; int state = 1; int limit = 1; color_rgb_t *sequ = cd_sequ; rgbled_t led; /* initialize RGB-LED */ rgbled_init(&led, PWM_0, 0, 1, 2); while (1) { /* see if something has come up */ if (state == limit) { notify_done(); ++state; } if (state >= limit) { ret = msg_receive(&msg); } else { ret = msg_try_receive(&msg); } /* if message was receive, act on it */ if (ret == 1) { printf("led: got message %i\n", msg.type); if (msg.type != last_cmd) { switch (msg.type) { case MSG_GAME_START: puts("led: starting game"); sequ = cd_sequ; state = 1; limit = GAME_LED_COUNTDOWN_LEN; last_cmd = msg.type; break; case MSG_GAME_SCORE: printf("led: displaying score: %i\n", (unsigned int)msg.content.value); if (PLAYER == msg.content.value) { puts("led: WIN sequence"); sequ = win_sequ; limit = GAME_LED_WIN_LEN; } else if (msg.content.value == GAME_STATE_DRAW) { puts("led: DRAW sequence"); sequ = draw_sequ; limit = GAME_LED_DRAW_LEN; } else { puts("led: LOSE sequence"); sequ = lose_sequ; limit = GAME_LED_LOSE_LEN; } state = 1; last_cmd = msg.type; break; } } } if (state < limit) { /* update color */ if (step == 0) { printf("led: setting color fr 0x%02x 0x%02x 0x%02x\n", sequ[state - 1].r, sequ[state - 1].g, sequ[state - 1].b); printf("led: setting color to 0x%02x 0x%02x 0x%02x\n", sequ[state].r, sequ[state].g, sequ[state].b); color_rgb2hsv(&sequ[state - 1], &hsv_0); color_rgb2hsv(&sequ[state ], &hsv_1); step_h = (hsv_0.h - hsv_1.h) / STEPS; step_s = (hsv_0.s - hsv_1.s) / STEPS; step_v = (hsv_0.v - hsv_1.v) / STEPS; printf("led: steps are h+= %i s+= %i v+= %i\n", (int)(step_h * 100),(int)(step_s * 100), (int)(step_v * 100)); } /* set color */ color_hsv2rgb(&hsv_0, &rgb); rgbled_set(&led, &rgb); ++step; hsv_0.h += step_h; hsv_0.s += step_s; hsv_0.v += step_v; /* check if transition is finished */ if (step == STEPS) { step = 0; ++state; } } /* wait for next step */ vtimer_usleep(PAUSE); } }
/* Event/Message loop for gcoap _pid thread. */ static void *_event_loop(void *arg) { msg_t msg_rcvd; (void)arg; msg_init_queue(_msg_queue, GCOAP_MSG_QUEUE_SIZE); sock_udp_ep_t local; memset(&local, 0, sizeof(sock_udp_ep_t)); local.family = AF_INET6; local.netif = SOCK_ADDR_ANY_NETIF; local.port = GCOAP_PORT; int res = sock_udp_create(&_sock, &local, NULL, 0); if (res < 0) { DEBUG("gcoap: cannot create sock: %d\n", res); return 0; } while(1) { res = msg_try_receive(&msg_rcvd); if (res > 0) { switch (msg_rcvd.type) { case GCOAP_MSG_TYPE_TIMEOUT: { gcoap_request_memo_t *memo = (gcoap_request_memo_t *)msg_rcvd.content.ptr; /* no retries remaining */ if ((memo->send_limit == GCOAP_SEND_LIMIT_NON) || (memo->send_limit == 0)) { _expire_request(memo); } /* reduce retries remaining, double timeout and resend */ else { memo->send_limit--; unsigned i = COAP_MAX_RETRANSMIT - memo->send_limit; uint32_t timeout = ((uint32_t)COAP_ACK_TIMEOUT << i) * US_PER_SEC; uint32_t variance = ((uint32_t)COAP_ACK_VARIANCE << i) * US_PER_SEC; timeout = random_uint32_range(timeout, timeout + variance); ssize_t bytes = sock_udp_send(&_sock, memo->msg.data.pdu_buf, memo->msg.data.pdu_len, &memo->remote_ep); if (bytes > 0) { xtimer_set_msg(&memo->response_timer, timeout, &memo->timeout_msg, _pid); } else { DEBUG("gcoap: sock resend failed: %d\n", (int)bytes); _expire_request(memo); } } break; } default: break; } } _listen(&_sock); } return 0; }