/********************** Function implementations *************************/ void menu_task(void *pvParameters) { menu_t *menu; INT8U i; //setup menus init_menus(); menu = menu_handler(SYSTEM_START_MENU); red_led( FALSE ); yellow_led( FALSE ); green_led( FALSE ); //setup initial system parameters parameter(PUSH,PAN_SETPOINT_P,0); parameter(PUSH,TILT_SETPOINT_P,0); parameter(PUSH,PAN_PWM_P,0); parameter(PUSH,TILT_PWM_P,0); parameter(PUSH,NEXT_POS_P,0); parameter(PUSH,SAVE_POS_P,0); // position(NEW,0); parameter(PUSH,PAN_CURRENT_P,-150); parameter(PUSH,TILT_CURRENT_P,860); position(SAVE,1); parameter(PUSH,PAN_CURRENT_P,150); parameter(PUSH,TILT_CURRENT_P,-2600); position(SAVE,2); exit_freemode(); deactivate_regulator(); deactivate_automode(); while(TRUE) { //handle inputs menu = parse_dreh_event(menu); if(menu->type.is_input) { for(i = 0 ; i < NUMBER_OF_FIELDS ; i++) { if(menu->field[i].dreh_input) parameter(ADD, menu->field[i].parameter, DREH_TO_DEG(counter(RESET,DREH_C)) ); if(menu->field[i].adc_input) parameter(PUSH, menu->field[i].parameter, ADC_TO_DEG(get_adc()) ); if(menu->field[i].numpad_input) if(event(PEEK,NUMPAD_E)) parameter(PUSH, menu->field[i].parameter, CHAR_TO_NUMBER(event(POP,NUMPAD_E) )); } } //update display buffer display_buffer_write_string(0,0,menu->text.topline); display_buffer_write_string(0,1,menu->text.bottomline); for(i=0 ; i < NUMBER_OF_FIELDS ; i++) { if(menu->field[i].show) display_buffer_write_decimal( menu->field[i].begin.x, menu->field[i].begin.y, menu->field[i].size, NUMBER_OF_DECIMALS, parameter(POP,menu->field[i].parameter)); } //handle task states if(state(POP,AUTO_WAIT_S)) { //check if wait time has lapsed if(counter(POP,TIME_C) > TIME_TO_WAIT_ON_HIT) { //change to next position and resume regulation if(parameter(ADD,NEXT_POS_P,1) > NUMBER_OF_POSITIONS) parameter(PUSH,NEXT_POS_P,1); position(GOTO,parameter(POP,NEXT_POS_P)); state(PUSH,AUTO_WAIT_S,FALSE); red_led( FALSE ); activate_automode(); activate_regulator(); } else red_led( TRUE ); } YIELD(YIELD_TIME_MENU_T) } }
int add_ipv4_to_acl(char *ipv4) { int state = 0; int octet = 0; int index = 0; /* position in data array */ int data[5]; /* array to store ip octets and mask */ int len = strlen(ipv4); int i, c; unsigned long ip, mask; struct ip_acl *ip_acl_curr; /* Check for min and max IPv4 valid length */ if (len < 7 || len > 18) return 0; /* default mask for ipv4 */ data[4] = 32; /* Basic IPv4 format check */ for (i = 0; i < len; i++) { /* Return 0 on error state */ if (state == -1) return 0; c = ipv4[i]; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': octet = octet * 10 + CHAR_TO_NUMBER(c); switch (state) { case 0: case 2: case 4: case 6: case 8: state++; break; } break; case '.': switch (state) { case 1: case 3: case 5: data[index++] = octet; octet = 0; state++; break; default: state = -1; } break; case '/': switch (state) { case 7: data[index++] = octet; octet = 0; state++; break; default: state = -1; } break; default: state = -1; } } /* Exit state handling */ switch (state) { case 7: case 9: data[index] = octet; break; default: /* Bad states */ return 0; } /* * Final IPv4 format check. */ for (i=0; i < 4; i++) { if (data[i] < 0 || data[i] > 255) { syslog(LOG_ERR,"Invalid IPv4 address/network format(%s) in allowed_hosts option\n",ipv4); return 0; } } if (data[4] < 0 || data[4] > 32) { syslog(LOG_ERR,"Invalid IPv4 network mask format(%s) in allowed_hosts option\n",ipv4); return 0; } /* Conver ip and mask to unsigned long */ ip = htonl((data[0] << 24) + (data[1] << 16) + (data[2] << 8) + data[3]); mask = htonl(-1 << (32 - data[4])); /* Wrong network address */ if ( (ip & mask) != ip) { syslog(LOG_ERR,"IP address and mask do not match in %s\n",ipv4); return 0; } /* Add addr to ip_acl list */ if ( (ip_acl_curr = malloc(sizeof(*ip_acl_curr))) == NULL) { syslog(LOG_ERR,"Can't allocate memory for ACL, malloc error\n"); return 0; } /* Save result in ACL ip list */ ip_acl_curr->family = AF_INET; ip_acl_curr->addr.s_addr = ip; ip_acl_curr->mask.s_addr = mask; ip_acl_curr->next = NULL; if (ip_acl_head == NULL) { ip_acl_head = ip_acl_curr; } else { ip_acl_prev->next = ip_acl_curr; } ip_acl_prev = ip_acl_curr; return 1; }