Пример #1
0
int main(void) {
    /* generic hw init */
    hw_init();

    /* init uart */
    uart_init();

#ifdef DEBUG_INIT
    printf("AlceOSD hw%dv%d fw%d.%d.%d\r\n", hw_rev >> 4, hw_rev & 0xf, VERSION_MAJOR, VERSION_MINOR, VERSION_DEV);
    if (RCONbits.WDTO)
        printf("watchdog reset\r\n");
    if (RCONbits.EXTR)
        printf("external reset\r\n");
    if (RCONbits.SWR)
        printf("software reset\r\n");
    if (RCONbits.IOPUWR)
        printf("ill opcode / uninit W reset\r\n");
    if (RCONbits.WDTO)
        printf("trap conflict reset\r\n");
#endif

    /* real time clock init */
    clock_init();

    /* adc init */
    adc_init();

    /* init video driver */
    init_video();

    /* try to load config from flash */
    config_init();

    /* init widget modules */
    widgets_init();

    /* setup tabs */
    tabs_init();

    /* welcome message */
    console_printf("AlceOSD hw%dv%d fw%d.%d.%d\n", hw_rev >> 4, hw_rev & 0xf, VERSION_MAJOR, VERSION_MINOR, VERSION_DEV);

    /* init home tracking */
    init_home();

    /* init flight status tracking */
    init_flight_stats();

    /* init mavlink module */
    mavlink_init();

    /* init uavtalk module */
    uavtalk_init();

    /* link serial ports to processes */
    uart_set_config_clients(1);

    /* enable all interrupts */
    _IPL = 0;
    _IPL3 = 1;

    console_printf("Processes running...\n");
    /* main loop */
    process_run();

    return 0;
}
Пример #2
0
int main(int argc, char *argv[]) {
	char szErrbuf[PCAP_ERRBUF_SIZE];
	int i;
	pcap_t *ppcap = NULL;
	char fBrokenSocket = 0;
	int pcnt = 0;
	time_t start_time;
	uint8_t packet_transmit_buffer[MAX_PACKET_LENGTH];
	size_t packet_header_length = 0;
	fd_set fifo_set;
	int max_fifo_fd = -1;
	fifo_t fifo[MAX_FIFOS];
	int param_transmission_count = 1;
	int param_data_packets_per_block = 8;
	int param_fec_packets_per_block = 4;
	int param_packet_length = MAX_USER_PACKET_LENGTH;
	int param_port = 0;
	int param_min_packet_length = 0;
	int param_fifo_count = 1;
	strcpy(param_serial_port, "/dev/ttyUSB0");
	running = 1;
	printf("Raw data transmitter (c) 2015 befinitiv  GPL2\n");
	while (1) {
		int nOptionIndex;
		static const struct option optiona[] = {
			{ "help", no_argument, &flagHelp, 1 },
			{ 0, 0, 0, 0 }
		};
		int c = getopt_long(argc, argv, "r:hf:p:b:m:s:x:P:B:", optiona, &nOptionIndex);
		if (c == -1) {
			break;
		}
		switch (c) {
			case 0: // long option
				break;
			case 'h': // help
				usage();
			case 'r': // retransmissions
				param_fec_packets_per_block = atoi(optarg);
				break;
			case 'f': // MTU
				param_packet_length = atoi(optarg);
				break;
			case 'p': //port
				param_port = atoi(optarg);
				break;
			case 'b': //retransmission block size
				param_data_packets_per_block = atoi(optarg);
				break;
			case 'm'://minimum packet length
				param_min_packet_length = atoi(optarg);
				break;
			case 's': //how many streams (fifos) do we have in parallel
				param_fifo_count = atoi(optarg);
				break;
			case 'x': //how often is a block transmitted
				param_transmission_count = atoi(optarg);
				break;
			case 'P': //Serial-Port
				strcpy(param_serial_port, optarg);
				break;
			case 'B': //Serial-Baud
				param_serial_baud = atoi(optarg);
				break;
			default:
				printf("unknown switch %c\n", c);
				usage();
				break;
		}
	}
	if (optind >= argc) {
		usage();
	}
	mavlink_init(0, param_serial_port, param_serial_baud);
#ifdef SDL2
	wifibc_thread_telemetry = SDL_CreateThread(wifibc_update_telemetry, NULL, NULL);
#else
	wifibc_thread_telemetry = SDL_CreateThread(wifibc_update_telemetry, NULL);
#endif
	if (param_packet_length > MAX_USER_PACKET_LENGTH) {
		printf("Packet length is limited to %d bytes (you requested %d bytes)\n", MAX_USER_PACKET_LENGTH, param_packet_length);
		return (1);
	}
	if (param_min_packet_length > param_packet_length) {
		printf("Your minimum packet length is higher that your maximum packet length (%d > %d)\n", param_min_packet_length, param_packet_length);
		return (1);
	}
	if (param_fifo_count > MAX_FIFOS) {
		printf("The maximum number of streams (FIFOS) is %d (you requested %d)\n", MAX_FIFOS, param_fifo_count);
		return (1);
	}
	if (param_data_packets_per_block > MAX_DATA_OR_FEC_PACKETS_PER_BLOCK || param_fec_packets_per_block > MAX_DATA_OR_FEC_PACKETS_PER_BLOCK) {
		printf("Data and FEC packets per block are limited to %d (you requested %d data, %d FEC)\n", MAX_DATA_OR_FEC_PACKETS_PER_BLOCK,
			   param_data_packets_per_block, param_fec_packets_per_block);
		return (1);
	}
	packet_header_length = packet_header_init(packet_transmit_buffer);
	fifo_init(fifo, param_fifo_count, param_data_packets_per_block);
	fifo_open(fifo, param_fifo_count);
	fifo_create_select_set(fifo, param_fifo_count, &fifo_set, &max_fifo_fd);
	//initialize forward error correction
	fec_init();
	// open the interface in pcap
	szErrbuf[0] = '\0';
	ppcap = pcap_open_live(argv[optind], 800, 1, 20, szErrbuf);
	if (ppcap == NULL) {
		printf("Unable to open interface %s in pcap: %s\n",
			   argv[optind], szErrbuf);
		return (1);
	}
	pcap_setnonblock(ppcap, 1, szErrbuf);
	start_time = time(NULL);
	while (!fBrokenSocket) {
		fd_set rdfs;
		int ret;
		rdfs = fifo_set;
		//wait for new data on the fifos
		ret = select(max_fifo_fd + 1, &rdfs, NULL, NULL, NULL);
		if (ret < 0) {
			perror("select");
			return (1);
		}
		//cycle through all fifos and look for new data
		for (i = 0; i < param_fifo_count && ret; ++i) {
			if (!FD_ISSET(fifo[i].fd, &rdfs)) {
				continue;
			}
			ret--;
			packet_buffer_t *pb = fifo[i].pbl + fifo[i].curr_pb;
			//if the buffer is fresh we add a payload header
			if (pb->len == 0) {
				pb->len += sizeof(payload_header_t); //make space for a length field (will be filled later)
			}
			//read the data
			int inl = read(fifo[i].fd, pb->data + pb->len, param_packet_length - pb->len - sizeof(ModelDataMinimal));
			if (inl < 0 || inl > param_packet_length - pb->len - sizeof(ModelDataMinimal)) {
				perror("reading stdin");
				return 1;
			}
			if (inl == 0) {
				//EOF
				printf("Warning: Lost connection to fifo %d. Please make sure that a data source is connected\n", i);
				usleep(1e5);
				continue;
			}
			pb->len += inl;
			// add telemtry-data
			ModelDataMinimal.p_lat = ModelData[0].p_lat;
			ModelDataMinimal.p_long = ModelData[0].p_long;
			ModelDataMinimal.p_alt = ModelData[0].p_alt;
			ModelDataMinimal.pitch = ModelData[0].pitch;
			ModelDataMinimal.roll = ModelData[0].roll;
			ModelDataMinimal.yaw = ModelData[0].yaw;
			ModelDataMinimal.speed = ModelData[0].speed;
			ModelDataMinimal.voltage = ModelData[0].voltage;
			ModelDataMinimal.ampere = ModelData[0].ampere;
			ModelDataMinimal.gpsfix = ModelData[0].gpsfix;
			ModelDataMinimal.numSat = ModelData[0].numSat;
			memcpy(pb->data + pb->len + param_packet_length, &ModelDataMinimal, sizeof(ModelDataMinimal));
			pb->len += sizeof(ModelDataMinimal);
			//check if this packet is finished
			if (pb->len >= param_min_packet_length) {
				payload_header_t *ph = (payload_header_t *)pb->data;
				ph->data_length = pb->len - sizeof(
									  payload_header_t); //write the length into the packet. this is needed since with fec we cannot use the wifi packet lentgh anymore. We could also set the user payload to a fixed size but this would introduce additional latency since tx would need to wait until that amount of data has been received
				pcnt++;
				//check if this block is finished
				if (fifo[i].curr_pb == param_data_packets_per_block - 1) {
					pb_transmit_block(fifo[i].pbl, ppcap, &(fifo[i].seq_nr), i + param_port, param_packet_length, packet_transmit_buffer, packet_header_length,
									  param_data_packets_per_block, param_fec_packets_per_block, param_transmission_count);
					fifo[i].curr_pb = 0;
				} else {
					fifo[i].curr_pb++;
				}
			}
		}
		if (pcnt % 64 == 0) {
			printf("%d data packets sent (interface rate: %.3f)\n", pcnt, 1.0 * pcnt / param_data_packets_per_block * (param_data_packets_per_block + param_fec_packets_per_block) / (time(NULL) - start_time));
		}
	}
	running = 0;
	SDL_WaitThread(wifibc_thread_telemetry, NULL);
	mavlink_exit(0);
	printf("Broken socket\n");
	return (0);
}