Exemple #1
0
void exec_init() {
	// initialize all sub-systems
	hl_init();
	schd_init();
	lcd_init();
	cam_init();	
	adc_init();
	serv_init();
	cont_init();
	ui_init();
	mot_init();
	//comms_init();	
	
	// disable interrupt
	disable_irq(EXEC_PIT_IRQ_NUM);
	
	// enable the clock to the PIT module (pg. 299)
	SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;

	// enable clock for PIT timers and allow timers to continue to
	// run in debug mode (pg. 1038)
	PIT_MCR = 0x0; 
	
	exec_disablePit();
	
	exec_sysMode = EXEC_MODE_IDLE;
	lcd_update();
	exec_update();		
}
Exemple #2
0
/// \brief      Executes an interactive command
/// \details    Tries to match the beginning of the supplied string to the registered commands.
///             If a matching command string is found, its handler is invoked.
///             In case no suitable command could be matched, or the executed handler returns a
///             non-zero value, an error message is sent.
/// \param      command
///                 the full command line as a C-string
static inline void execute_command(const char * const command)
{
    bool success = true;

    if (strcmp(command, "clear") == 0) {
        for (int i=0; i<80; ++i) {
            usb_puts(PSTR(""));
        }
    }

    else if (strncmp(command, "fwupdate", 8) == 0) {
        success = exec_update(command);
    }

    else if (strcmp(command, "help") == 0) {
        success = exec_help();
    }

    else if (strcmp(command, "reset") == 0) {
        usb_puts(PSTR("Resetting device..."));
        reset = true;
    }

    else {
        // Iterate all user-defined commands and try to find a matching one
        for (uint8_t i=0; i<user_commands_size; ++i) {
            const struct serial_command* user_command = user_commands + i;
            if (strncmp_P(command, user_command->cmd_string, strlen_P(user_command->cmd_string)) == 0) {
                success = user_command->handler(command);
                goto cleanup;
            }
        }

        // No known command matches :-(
        usb_printf(PSTR("Unknown command: [%s]" USB_NEWLINE), command);
        usb_puts(PSTR("Type `help` for help." USB_NEWLINE));
    }

cleanup:
    if (!success) {
        usb_printf(PSTR("Error executing command: [%s]" USB_NEWLINE), command);
    }

    // Clear command buffer and reset write pointer
    memset(cmd_buffer, '\0', sizeof(cmd_buffer));
    cmd_buffer_index = 0;
}
Exemple #3
0
void cont_disProc() {
	int ones = 0;
	int tens = 0;
	int hundreds = 0;
	int error = 0;
    int smoothing;
    int averages[124];
    int average;
    int min_contrast = 40;


    int difference = 0;
    int total = 0;

    int calcwidth = -1;
    int leftedge = 0;
    int rightedge = 0;
    int center = -1;
    int oldcenter = 50;
    int linewidth = -1;
    int i = 2; 

    int exp_line = 12;// Set expected line width
    //int exp_ssline = 10; // Set expected SSLine width
    int tolerance = 4; //set the expected tolerance

    for (i=2; i<126; i++){
		smoothing = (adc_rawCameraData[i+0]+adc_rawCameraData[i-1]+adc_rawCameraData[i-2]+adc_rawCameraData[i+1]+adc_rawCameraData[i+2])/5;
		averages[i-2] = smoothing;
    }

	for (i=0; i<100; i++){
		difference = averages[i+12]-averages[i+11];
		derivative[i] = abs(difference);
		total = total+derivative[i];
	}
        
	average = total/100;

	cutoff = average*3;  //////
	if (cutoff < 4){
		cutoff = 4;
	}

	for (i=0; i<100; i++){
		if (derivative[i] > cutoff){
			flag[i] = 1;
		}
		else{
			flag[i] = 0;
		}
	}

	for (i=3; i<96; i++){
		if (flag[i] == 1 && leftedge ==0){
			if(flag[i-1] == 1 || flag[i-2] ==1 || flag[i+1] == 1 || flag[i+2] ==1){
				leftedge = i;
				while (flag[i+1]==1|| flag[i+2] ==1 ){
					if(flag[i-1] == 1 || flag[i-2] ==1 || flag[i+1] == 1 || flag[i+2] ==1|| flag[i+3] ==1 || flag[i-3] ==1  ){
						leftedge = i;
						i++;
					}
				}
			}
		}
		else if (flag[i] == 1 && leftedge !=0 && rightedge ==0 && i> leftedge +4 ){
			if(flag[i-1] == 1 || flag[i-2] ==1 || flag[i+1] == 1 || flag[i+2] ==1 ){
				while ((flag[i+1]==1 || flag[i+2]==1)&& i<96){
					if(flag[i-1] == 1 || flag[i-2] ==1 || flag[i+1] == 1 || flag[i+2] ==1 || flag[i+3] ==1 || flag[i-3] ==1  ){
						rightedge = i;
						i++;
					}
				}
			}
		}
		
		if (leftedge != 0 && rightedge != 0){
			calcwidth = rightedge - leftedge;
			
			if (calcwidth < (exp_line +tolerance) && calcwidth > (exp_line -tolerance)){  //Is it the size of the line?
				if (averages[leftedge+8]>(averages[leftedge+16]+min_contrast) && (averages[rightedge+8]+min_contrast)<averages[rightedge+16]){   // Is it a white to black transition?
					
					center = ((leftedge + rightedge)/2)-1;  
					
					leftedge = rightedge;
					rightedge = 0;
					
					
				}
				else if ((averages[leftedge+8]<(averages[leftedge+16]+min_contrast) && (averages[rightedge+8]+min_contrast)>averages[rightedge+16]&& (averages[rightedge+8]+min_contrast)>averages[rightedge+0])||(averages[leftedge+8]<(averages[leftedge+16]+min_contrast) && (averages[rightedge+8]+min_contrast)>averages[rightedge+16]&& (averages[rightedge+8]+min_contrast)>averages[rightedge+36])){
					linewidth = calcwidth;
					inframe = 1;
					leftedge = rightedge;
					rightedge = 0;
				}
					
				
				else {   // Is it a white to black transition?
					leftedge = rightedge;   //We don't care, so set leftedge to be rightedge and keep looking
					rightedge = 0;
				}
			}

			else{
				leftedge = rightedge;
				rightedge = 0;
	
			}
		}
	}
	
	
	if (inframe == 1 && center != -1 && center > 25 && center < 75){
		inframe = 0;
		numcounts = 50;
		
	}
	
	else if (inframe == 0 && numcounts > 0 && center != -1 && center > 25 && center < 75){
		numcounts--;
	}
	else if (inframe == 0 && numcounts == 0 && center != -1 && center > 25 && center < 75 && lapsremaining > 0){
		lapsremaining--;
		numcounts = -1;
		
	}
	
	
	
	
	
	
//	if (center == -1){
//		center = oldcenter;
//	}
//	oldcenter = center;
	cont_lineWidth = linewidth;
	cont_lineLoc = center;
//	
//	ones=cont_lineLoc%10;
//	tens=(cont_lineLoc/10)%10;
//	hundreds=(cont_lineLoc/100)%10;
//
//	//Update SLCD
//	tlcd_set_numeric3(ones); // ones
//	tlcd_set_numeric2(tens); // tens
//	tlcd_set_numeric1(hundreds); // hundreds
	
	
	
	
	
	
	
	
	if (cont_lineLoc >= 0){
		
		error = cont_lineLoc-50;
		correctionval = error+50;
		//serv_angle = (correctionval * 2062) / 100;
	}
	else{
		//serv_angle = oldservangle;
	}
	
	//oldservangle = serv_angle;
	
	//serv_update();
	
	if (center >= 0){
		if (lostline > 0){
			lostline--;
		}
	}
	
	else if (center == -1 && lostline < 701){
		
		lostline++;
	}

	
	
	
//	if (lapsremaining <= 0 || lostline >= 100){
//		mot_motorSpeedA1 = 000;
//		mot_motorSpeedA2 = 000;
//		
//		mot_motorSpeedB1 = 000;
//		mot_motorSpeedB2 = 000;
//		
//		mot_update();
//	}
//	
//	else if (serv_angle < 1100 && serv_angle > 962){
//		mot_motorSpeedA1 = 0000;
//		mot_motorSpeedA2 = maxspeed;
//		
//		mot_motorSpeedB1 = 0000;
//		mot_motorSpeedB2 = maxspeed;
//		
//		mot_update();
//	}
//	
//	else{
//		
//		if( serv_angle > 1100 ){
//			mot_motorSpeedA1 = 0000;
//			mot_motorSpeedA2 = maxspeed - (((serv_angle-1100)*2));
//			
//			mot_motorSpeedB1 = 0000;
//			mot_motorSpeedB2 = maxspeed;
//			
//			mot_update();
//		}	
//		else if (serv_angle < 962){
//			mot_motorSpeedA1 = 0000;
//			mot_motorSpeedA2 = maxspeed;
//			
//			mot_motorSpeedB1 = 0000;
//			mot_motorSpeedB2 = maxspeed - (((962-serv_angle)*2));
//			
//			mot_update();
//		}
//			
//			
//	}
		
	if (cont_lineLoc != -1) {
		// motor setup
//		mot_motorSpeedA1 = 0000;
//		mot_motorSpeedA2 = 0000;	
//		mot_motorSpeedB1 = 0000;
//		mot_motorSpeedB2 = 0000;	
//		mot_update();
		exec_sysMode = EXEC_MODE_PERF_SPE;
		exec_update();
	}
	
	cont_disServUpdateCnt++;
	if (cont_disServUpdateCnt == 100) {
		if (serv_angle < CONT_DIS_SERV_MAX) {
			serv_angle += CONT_DIS_SERV_INC;
			serv_update();
		}
		cont_disServUpdateCnt = 0;
	}
}