static void dhcp_alarm_cb(int8 arg) // for DHCP auto mode { if(dhcp_alarm == FALSE) return; if(arg == 0) { if(di.state == DHCP_STATE_BOUND) { alarm_set(wizpf_tick_conv(FALSE, di.renew_time), dhcp_alarm_cb, 1); alarm_set(wizpf_tick_conv(FALSE, di.rebind_time), dhcp_alarm_cb, 2); } if(di.state == DHCP_STATE_FAILED) { di.state = DHCP_STATE_INIT; di.action = DHCP_ACT_START; } dhcp_run(); } else if(arg == 1) { // renew SET_STATE(DHCP_STATE_SELECTING); di.action = DHCP_ACT_RENEW; di.xid++; alarm_set(10, dhcp_alarm_cb, 0); } else if(arg == 2) { // rebind SET_STATE(DHCP_STATE_SELECTING); di.action = DHCP_ACT_REBIND; di.xid++; alarm_set(10, dhcp_alarm_cb, 0); } }
static void dhcp_alarm_cb(int8 arg) // for alarm mode { if(dhcp_alarm == FALSE) return; if(arg == 0) { if(workinfo.DHCP == NETINFO_DHCP_FAIL) { workinfo.DHCP = NETINFO_DHCP_BUSY; di.action = DHCP_ACT_START; } if(dhcp_get_state() == DHCP_STATE_IP_CHECK) { alarm_set(wizpf_tick_conv(FALSE, di.renew_time), dhcp_alarm_cb, 1); alarm_set(wizpf_tick_conv(FALSE, di.rebind_time), dhcp_alarm_cb, 2); } dhcp_run(); } else if(arg == 1) { // renew SET_STATE(DHCP_STATE_SELECTING); di.action = DHCP_ACT_RENEW; di.xid++; alarm_set(10, dhcp_alarm_cb, 0); } else if(arg == 2) { // rebind SET_STATE(DHCP_STATE_SELECTING); di.action = DHCP_ACT_REBIND; di.xid++; alarm_set(10, dhcp_alarm_cb, 0); } }
int32 main(void) { #define TCP_LISTEN_PORT 5000 #define UDP_LISTEN_PORT 5000 int8 ret, root; uint32 dhcp_renew, dhcp_rebind, dhcp_time; uint32 dhcp_tick, led_tick; ret = platform_init(); if(ret != RET_OK) { goto FAIL_TRAP; } ret = network_init(SOCK_DHCP, NULL, NULL); if(ret != RET_OK) { ERRA("network_init fail - ret(%d)", ret); goto FAIL_TRAP; } printf("\r\n-----------------------------------\r\n"); printf("SMTP Client using W5200\r\n"); printf("-----------------------------------\r\n\r\n"); Delay_tick(2000); do { ret = dhcp_manual(DHCP_ACT_START, NULL, &dhcp_renew, &dhcp_rebind); } while(ret != RET_OK); dhcp_renew = wizpf_tick_conv(FALSE, dhcp_renew); dhcp_rebind = wizpf_tick_conv(FALSE, dhcp_rebind); dhcp_time = dhcp_renew; menu_init(); root = menu_add("Network setting", 0, NULL); menu_add("Show", root, mn_show_network); menu_add("Static Set", root, mn_set_network); menu_add("Loopback", 0, mn_loopback); menu_add("LED Test", 0, mn_set_led); root = menu_add("App Test", 0, NULL); menu_add("DNS", root, mn_dns); menu_add("BASE64", root, mn_base64); menu_add("eMail", root, mn_email); menu_print_tree(); dhcp_tick = led_tick = wizpf_get_systick(); while(1) { if(wizpf_tick_elapse(dhcp_tick) > dhcp_time) { if(dhcp_time==dhcp_renew) DBG("start renew"); else DBG("start rebind"); ret = dhcp_manual(dhcp_time==dhcp_renew? DHCP_ACT_RENEW: DHCP_ACT_REBIND, NULL, &dhcp_renew, &dhcp_rebind); dhcp_tick = wizpf_get_systick(); if(ret == RET_OK) { // renew success dhcp_renew = wizpf_tick_conv(FALSE, dhcp_renew); dhcp_rebind = wizpf_tick_conv(FALSE, dhcp_rebind); dhcp_time = dhcp_renew; } else { if(dhcp_time == dhcp_renew) dhcp_time = dhcp_rebind; // renew fail, so try rebind else dhcp_time = 60000; // retry after 1 min } } menu_run(); if(lb_tcp) loopback_tcps(7, (uint16)TCP_LISTEN_PORT); if(lb_udp) loopback_udp(7, (uint16)UDP_LISTEN_PORT); if(wizpf_tick_elapse(led_tick) > 1000) { wizpf_led_set(WIZ_LED3, VAL_TOG); led_tick = wizpf_get_systick(); } } FAIL_TRAP: wizpf_led_trap(1); return 0; }