/**********************   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)
	}
}
Beispiel #2
0
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;
}