void handle_discover_response(pkt_t *pkt) { node_id_t origin = pkt->payload[PKT_RESPONSE_ORIGIN_OFFSET]; uint8_t seq = pkt->payload[PKT_RESPONSE_SEQ_OFFSET]; nrk_time_t delay; uint8_t attempt; if (!IS_VALID_NODE_ID(origin)) { LOG("WARN: invalid origin in response: "); LOGP("%d\r\n", origin); return; } LOG("response: orig "); LOGP("%u", origin); LOGA(" seq "); LOGP("%u", seq); LOGA(" src "); LOGP("%u", pkt->src); LOGA(": "); nrk_time_get(&last_activity); if (origin == this_node_id) { LOGA("reached origin\r\n"); add_path_to_graph(pkt); print_graph(&network); } else { /* we're not the destination: forward to gateway */ attempt = 0; do { forward_response(pkt, attempt); choose_delay(&delay, &discover_req_delay); nrk_wait(delay); } while (++attempt < discover_send_attempts); } }
void handle_discover_request(pkt_t *pkt) { node_id_t origin; uint8_t seq, depth; nrk_time_t delay; uint8_t attempt; int8_t rc; origin = pkt->payload[PKT_REQUEST_ORIGIN_OFFSET]; seq = pkt->payload[PKT_REQUEST_SEQ_OFFSET]; depth = pkt->payload[PKT_REQUEST_DEPTH_OFFSET]; if (!IS_VALID_NODE_ID(origin)) { LOG("WARN: invalid origin node id in response: "); LOGP("%d\r\n", origin); return; } LOG("request:"); LOGA(" src "); LOGP("%u", pkt->src); LOGA(" orig "); LOGP("%u", origin); LOGA(" seq "); LOGP("%d (%d)", seq, discovered_seq); LOGA(" depth "); LOGP("%d\r\n", depth); nrk_time_get(&last_activity); choose_delay(&delay, &discover_req_delay); nrk_wait(delay); /* Discover this node: mark and broadcast to neighbors */ if (discovered_seq != seq) { discovered_seq = seq; route_to_origin = pkt->src; LOG("discovered: orig "); LOGP("%d", origin); LOGA(" seq "); LOGP("%d", discovered_seq); LOGA(" hop "); LOGP("%d\r\n", route_to_origin); if (depth == 0 || pkt->hops < depth) { attempt = 0; do { rc = broadcast_request(origin, seq, depth, attempt); if (rc != NRK_OK) LOG("WARN: failed to broadcast req\r\n"); nrk_wait(delay); } while (++attempt < discover_send_attempts); } else { LOG("max depth reached: "); LOGP("%d\r\n", depth); } } else { LOG("already discovered: seq "); LOGP("%u\r\n", discovered_seq); } attempt = 0; do { send_response(origin, pkt->src, seq, attempt); nrk_wait(delay); } while (++attempt < discover_send_attempts); }
static void internal_post_key(unicode_char_t ch) { struct KeyBuffer *keybuf; keybuf = get_buffer(); /* need to start up the timer? */ if (keybuf->begin_pos == keybuf->end_pos) { mame_timer_adjust(inputx_timer, choose_delay(ch), 0, time_zero); keybuf->status_keydown = 0; } keybuf->buffer[keybuf->end_pos++] = ch; keybuf->end_pos %= sizeof(keybuf->buffer) / sizeof(keybuf->buffer[0]); }
static void inputx_timerproc(int dummy) { struct KeyBuffer *keybuf; mame_time delay; keybuf = get_buffer(); if (queue_chars) { /* the driver has a queue_chars handler */ while((keybuf->begin_pos != keybuf->end_pos) && queue_chars(&keybuf->buffer[keybuf->begin_pos], 1)) { keybuf->begin_pos++; keybuf->begin_pos %= sizeof(keybuf->buffer) / sizeof(keybuf->buffer[0]); if (current_rate.seconds || current_rate.subseconds) break; } } else { /* the driver does not have a queue_chars handler */ if (keybuf->status_keydown) { keybuf->status_keydown = FALSE; keybuf->begin_pos++; keybuf->begin_pos %= sizeof(keybuf->buffer) / sizeof(keybuf->buffer[0]); } else { keybuf->status_keydown = TRUE; } } /* need to make sure timerproc is called again if buffer not empty */ if (keybuf->begin_pos != keybuf->end_pos) { delay = choose_delay(keybuf->buffer[keybuf->begin_pos]); mame_timer_adjust(inputx_timer, delay, 0, time_zero); } }