Example #1
0
int main(int argc, char **argv) {
	int cansock;
	
	if(argc < 3) {
		die("%s can_interface firware_path", argv[0]);
	}

	log("bootflashd (rev " GIT_REV ") starting up");

	cansock = can_create_socket(argv[1]);
	if(cansock < 0) {
		die("Failed to attach to can interface");
	}

	const char *firmware_dir = argv[2];

	struct can_frame msg;
	while(can_receive_frame(cansock, &msg) >= 0) {
		if(!(msg.can_id & 1 << 31) || // No extended id
		    (msg.can_id & 1 << 30))
			continue;

		if(memcmp(msg.data, "BOOTMAGC", 8))
			continue;

		uint32_t addr = msg.can_id & CAN_EFF_MASK;

		log("Received boot request from %08X", addr);

		int local_sock = can_create_socket(argv[1]);
		can_set_filter(local_sock, addr);

		if(firmware_flash(local_sock, firmware_dir, addr) < 0) {
			log("Flashing firmware failed");

			goto out;
		}

		log("Flashing succeeded");

out:
		close(local_sock);
	}
}
Example #2
0
// ----------------------------------------------------------------------------
void usbcan_decode_command(char *str, uint8_t length)
{
	uint8_t temp;
	
	if (length == 0)
		return;
	
	switch (str[0]) {
		case 'S':	// set bitrate
			// Lawicel has the folowing settings:
			// S0   10 kbps
			// S1   20 kbps
			// S2   50 kbps
			// S3  100 kbps
			// S4  125 kbps
			// S5  250 kbps
			// S6  500 kbps
			// S7  800 kbps
			// S8    1 mbps; is index 7 on USB2CAN
			// Note that the USB2CAN adapter does not support 800 kbps.
			// With index 7 USB2CAN runs on 1 mbps.
			// Report error if the range is wrong, communication channel
			// already open, Parameter wrong or the user tries to set
			// 800 kbps, which is not supported.
			if ( ((temp = str[1] - '0') > 8) || channel_open || length != 2 || temp == 7 ) {
				goto error;
			
			} else {
				// Take care of different index usage for 1 mbps.
				if ( temp == 8 ) {
					temp--;
				}
				// Set new bitrate, remember all MOB are cleared!
				can_init(temp);
				bitrate_set = true;
			}
			break;
		
		case 'r':	// send frames
		case 't':
		case 'R':
		case 'T':
			if ( !channel_open ) {
				goto error;
			
			} else {
				if ( !usbcan_decode_message(str, length) ) {
					goto error;
				}
			}
			break;
		
		case 'M':	// Set acceptance code for SJA1000
		case 'm':	// Set acceptance mask for SJA1000
		case 's':	// Set BTR0/BTR1 for SJA1000
			goto error;
			// TODO
			break;
		
		case 'O':	// Open channel, i.e. connect CAN to output.
			if ( channel_open || !bitrate_set ) {
				goto error;
			
			} else {
				can_set_mode(NORMAL_MODE);
				
				// In case the baudrate changed, re-enable some filters.
				can_filter_t filter = {
					.mask = 0,
					.id = 0,
					.flags.extended = 0,
					.flags.rtr = 0
				};
				for (uint8_t i=11; i<15; i++) {
					can_set_filter(i, &filter);
				}
				
				// Mark the channel as open.
				channel_open = true;
			}
			break;
		
		case 'L':	// Open channel, i.e. connect CAN to output in listen only mode.
			if ( channel_open || !bitrate_set ) {
				goto error;
			
			} else {
				can_set_mode(LISTEN_ONLY_MODE);
				channel_open = true;
			}
			break;
		
		case 'C':	// Close channel, i.e. disconnect CAN from output.
			if ( !channel_open ) {
				goto error;
			
			} else {
				channel_open = false;
			}
			break;
		
		case 'F':	// read Status Flags
			term_put_hex(0);
			// TODO
			break;
		
		case 'N':	// read serial number
			term_putc( 'N' );
			term_put_hex( 0 );
			term_put_hex( 0 );
			break;
		
		case 'V':	// read hardware and firmeware version
			term_putc( 'V' );
			term_put_hex( (HARDWARE_VERSION_MAJOR << 4) | HARDWARE_VERSION_MINOR );
			term_put_hex( (SOFTWARE_VERSION_MAJOR << 4) | SOFTWARE_VERSION_MINOR );
			break;
		
		case 'Z':
			// Switch on or off timestamps.
			// On Lawicel this value is stored in EEPROM.
			if ( channel_open || length != 2) {
				goto error;
			
			} else {
				use_timestamps = (str[1] - '0' == 0) ? false : true;
				CANTIM = 0;
			}
			break;
	}

	term_putc('\r');	// command could be executed
	return;
	
error:
	term_putc(7);		// Error in command
}

// ----------------------------------------------------------------------------
// processes commands in usbcan-protocol mode

void usbcan_handle_protocol(void)
{
	static char buffer[40];
	static uint8_t pos;
	static can_error_register_t last_error = { 0, 0 };
	can_error_register_t error;
	
	// check for new messages
	if (can_check_message()) {
		can_t message;
		
		// Only communicate data if channel is open.
		// Due to left -> right evaluation messages are extracted from the 
		// MOB to avoid overflow, even if no communication is desired.
		if ( can_get_message(&message) && channel_open ) {
			uint8_t length = message.length;
			
			if (message.flags.rtr)
			{
				// print identifier
				if (message.flags.extended) {
					printf_P(PSTR("R%08lx"), message.id);
				} else {
					uint16_t id = message.id;
					printf_P(PSTR("r%03x"), id);
				}
				term_putc(length + '0');
			}
			else
			{
				// print identifier
				if (message.flags.extended) {
					printf_P(PSTR("T%08lx"), message.id);
				} else {
					uint16_t id = message.id;
					printf_P(PSTR("t%03x"), id);
				}
				term_putc(length + '0');
				
				// print data
				for (uint8_t i = 0; i < length; i++)
					term_put_hex(message.data[i]);
			}

			if (use_timestamps)
				printf_P(PSTR("%04x"), message.timestamp);

			term_putc('\r');
		}
	}
	
	// get commands
	while (term_data_available())
	{
		char chr = term_getc();
		
		if (chr != '\r')
		{
			buffer[pos] = chr;
			pos++;
			
			if (pos >= sizeof(buffer)) {
				// format-error: command to long!
				pos = 0;
			}
		}
		else {
			buffer[pos] = '\0';
			usbcan_decode_command(buffer, pos);
			pos = 0;
		}
	}
	
	// get error-register
	error = can_read_error_register();
	
	if (last_error.tx != error.tx || last_error.rx != error.rx) {
		printf_P(PSTR("E%02x%02x\r"), error.rx, error.tx);
		
		last_error = error;
	}
}
Example #3
0
File: main.cpp Project: L31N/source
int main () {

    DDRA = 0xFF;

    pwm_init();

    /** testing ++++++++++++++++++ **/

    pwm_set(500, 0);
    _delay_ms(2000);
    pwm_set(1000, 0);

    while(true);

    /** ---------------------------- **/

    can_init(BITRATE_1_MBPS);
    sei();

    // motor 1
    can_filter_t filter0;
    filter0.id = BOARD_ID;
    filter0.mask = 0x7FF;
    filter0.flags.rtr = 0;

    can_set_filter(0, &filter0);

    while(42) {

        if (can_check_message()) {

            //PORTA ^= 0xF0;

            can_t message;
            can_get_message(&message);

            signed short value0;
            signed short value1;

            if (BOARD_0) {
                value0 = message.data[1];
                value1 = -message.data[3];

                if (message.data[0] == 1) value0 *= -1;
                if (message.data[2] == 1) value1 *= -1;
            }
            else {
                //value0 = message.data[5] *= -1;
                //value1 = message.data[7] *= -1;

                value0 = -message.data[5];
                value1 = -message.data[7];

                if (message.data[4] == 1) value0 *= -1;
                if (message.data[6] == 1) value1 *= -1;
            }

            long lvalue0 = value0;
            long lvalue1 = value1;

            lvalue0 += 255;
            lvalue0 *= 1000;
            lvalue0 /= (2*255);

            lvalue1 += 255;
            lvalue1 *= 1000;
            lvalue1 /= (2*255);


            /* pulsing values */
            if (abs(value0) < 45) {
                if (abs(value0) < 5) {
                    pwm_set(500, 0);
                }
                else if (abs(value0) < 13) {
                    pwm_set_ontime(pwm_lookup[0].ontime, 0);
                    pwm_set_offtime(pwm_lookup[0].offtime, 0);
                    pwm_set(value0 < 0 ? 422 : 588, 0);    // speed 45
                    //pwm_set(value0 < 0 ? 250 : 750, 0);    // speed 45
                }
                else {
                    double dindex = 0.44*abs(value0)-4.9;
                    unsigned char cindex = (unsigned char)round(dindex)%13;
                    pwm_set_ontime(pwm_lookup[cindex].ontime, 0);
                    pwm_set_offtime(pwm_lookup[cindex].offtime, 0);
                    pwm_set(value0 < 0 ? 422 : 588, 0);    // speed 45
                    //pwm_set(value0 < 0 ? 250 : 750, 0);    // speed 45
                }
            }
            else {
                pwm_set_ontime(1, 0);
                pwm_set_offtime(0, 0);
                pwm_set((unsigned long)lvalue0, 0);
            }

            if (abs(value1) < 45) {
                if (abs(value1) < 5) {
                    pwm_set(500, 1);
                }
                else if (abs(value1) < 13) {
                    pwm_set_ontime(pwm_lookup[0].ontime, 1);
                    pwm_set_offtime(pwm_lookup[0].offtime, 1);
                    pwm_set(value1 < 0 ? 422 : 588, 1);    // speed 45
                    //pwm_set(value1 < 0 ? 250 : 750, 1);    // speed 45
                }
                else {
                    double dindex = 0.44*abs(value1)-4.9;
                    unsigned char cindex = (unsigned char)round(dindex)%13;
                    pwm_set_ontime(pwm_lookup[cindex].ontime, 1);
                    pwm_set_offtime(pwm_lookup[cindex].offtime, 1);
                    pwm_set(value1 < 0 ? 422 : 588, 1);    // speed 45
                    //pwm_set(value1 < 0 ? 250 : 750, 1);    // speed 45
                }
            }
            else {
                pwm_set_ontime(1, 1);
                pwm_set_offtime(0, 1);
                pwm_set((unsigned long)lvalue1, 1);
            }



            //pwm_set((unsigned long)lvalue0, 0);
            //pwm_set((unsigned long)lvalue1, 1);
        }
    }
}
Example #4
0
File: main.cpp Project: L31N/source
int main () {

    uart_init(38400);

    // initialisation of the buttons and leds //
    DDRE &= ~(0xF0);    // buttons as input
    PORTE |= 0xF0;      // activate internal pull-ups
    DDRA |= 0xFF;       // leds as output

    /** CAN TESTING HERE **/
    can_init(BITRATE_1_MBPS);
    sei();

    // motor 1
    can_filter_t filter0;
    filter0.id = 9;
    //filter0.mask = 0x7FF;
    filter0.mask = 0;
    filter0.flags.rtr = 0;

    can_set_filter(0, &filter0);

    PORTA ^= 0x02;

    /*while(true) {
        if (can_check_message()) {
            can_t msg;
            can_get_message(&msg);
            PORTA ^= 0x01;
        }

    }*/

    PORTA = 0x01;
    _delay_ms(1000);
    PORTA = 0x02;

    int j = 0;

    while(true) {
        can_t frame;
        frame.id = 0x42;
        frame.flags.rtr = 0;
        frame.length = 8;
        for(int i = 0; i < 8; i++) {
            frame.data[i] = 42;//j + i;
        }
        j++;

        for (int k = 0; k < 8; k++) {
            if (can_send_message(&frame)) {
                PORTA &= ~0x0F;
                PORTA ^= 0xF0;
            }
            else {
                PORTA |= 0x0F;
            }
        }

        //_delay_ms(1);
        _delay_ms(1);

    }


   while(true) {
        if (can_check_message()) {
            PORTA ^= 0x03;

            /*can_t msg;
            can_get_message(&msg);*/

            can_t message;
            can_get_message(&message);
            for (int i = 0; i < 8; i++) {
                uart_debug("%d: %d\n\r", i, message.data[i]);
                _delay_ms(5);
            }
            uart_debug("##########################\n\n\r");
        }
        if (PINE < 0xF0) {
            can_t frame;
            frame.id = 0x09;
            frame.flags.rtr = 0;
            frame.length = 2;
            frame.data[0] = 0x2A;
            frame.data[1] = 0x06;

            if (can_send_message(&frame)) {
                PORTA &= ~0xE0;
                PORTA ^= 0x10;
            }
            else PORTA = 0xE0;

            uart_debug(".\n\r");
            _delay_ms(500);
        }
    }


    /** ** ++++++++++ ** **/

    return 0;
}