/**
 * Only used in UDP mode. First call will send the start marker. When all
 * ttcp data has been sent, a number of end markers will be sent. After
 * end marker transmission, this function will complete the ttcp process.
 */
static void
udp_send_data(struct ttcp* ttcp)
{
        /* send start marker first time */
        if (!ttcp->udp_started) {
                if (udp_send_bytes(ttcp, 4) == 0) {
                        ttcp->udp_started = 1;
                        ttcp->start_time = timer_get_ms();
                }
        }

        /* normal case */
        else if (ttcp->left) {
                /* send data */
                if (udp_send_bytes(ttcp, ttcp->buflen) == 0)
                        ttcp->left -= ttcp->buflen;
        }

        /* end marker? */
        else if (ttcp->left == 0 && ttcp->udp_end_marker_left) {
                if (udp_send_bytes(ttcp, 4) == 0)
                        ttcp->udp_end_marker_left--;
        }

        /* all end markers sent */
        else if (ttcp->left == 0) {
                ttcp_done(ttcp, 0);
                return;
        }

        ttcp->tid = timer_sched_timeout_cb(0, TIMEOUT_ONESHOT,
                                           udp_timeout_cb, ttcp);
}
Example #2
0
/* Ping using the raw ip */
static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p,
                      struct ip_addr *addr)
{
        struct icmp_echo_hdr *iecho;
        struct ip_hdr *ip = p->payload;
        struct ping_info_t* ping_info = (struct ping_info_t*) arg;
        uint32_t us;

        if (pbuf_header( p, -PBUF_IP_HLEN)==0) {
                iecho = p->payload;

                if ((iecho->id == PING_ID) &&
                    (iecho->seqno == htons(ping_info->seq_num))) {
                        ping_info->last_rx_tm = timer_get_ms();
                        ping_info->num_rx++;
                        us = 1000 *
                                (ping_info->last_rx_tm - ping_info->last_tx_tm);

                        if (!ping_info->quiet)
                                printk("%d bytes from %s: icmp_seq=%d ttl=%d " \
                                       "time=%d.%03d ms\n",
                                       p->tot_len, ip2str(ip->src),
                                       iecho->seqno,
                                       IPH_TTL(ip),
                                       us / 1000, us % 1000);
                        
                        /* do some ping result processing */
                        ping_info->flags |= PING_REPLY;
                }
        }

        pbuf_free(p);
        return 1; /* eat the event */
}
/**
 * Only used in UDP mode. Will finalize the ttcp process when an end marker
 * is seen.
 */
static void
udp_recv_cb(void *arg, struct udp_pcb *upcb, struct pbuf *p,
            struct ip_addr *addr, u16_t port)
{
        struct ttcp* ttcp = arg;

        /* got start marker? we might lose this so if we get it just reset
	 * the timer
	 */
        if (!ttcp->udp_started && p->tot_len <= 4) {
                ttcp->start_time = timer_get_ms();
		ttcp->udp_started = 1;
		goto out;
	}

        /* after receiving at least 1 byte, check end marker
	 * don't check udp_started since we might have lost the start marker
	 */
        if (ttcp->recved && p->tot_len <= 4) {
                ttcp_done(ttcp, 0);
                goto out;
        }

        /* for print_stats() */
        ttcp->recved += p->tot_len;
        if (ttcp->verbose) {
                printk(".");
                if (ttcp->print_cnt % 80 == 0)
                        printk("\n");
                ttcp->print_cnt++;
        }

out:
        pbuf_free(p);
}
Example #4
0
static int init_ping_info(int argc, char* argv[], struct ping_info_t* ping_info)
{
        int c;
        ping_complete_cb_t cb;
        void *ctx;

        cb = ping_info->complete_cb;
        ctx = ping_info->ctx;
        memset(ping_info, 0, sizeof(struct ping_info_t));
        ping_info->complete_cb = cb;
        ping_info->ctx = ctx;

        ping_info->deadline = 0;
        ping_info->interval = 1000;
        ping_info->timeout = 3000;
        ping_info->data_size = 32;
        ping_info->count = 3;
        ping_info->destination =
                netif_default ? netif_default->gw : ip_addr_any;

        optind = 1;
        while ((c = getopt(argc, argv, "c:i:s:w:q")) != -1) {
                switch (c) {
                case 'c':
                        ping_info->count = atoi(optarg);
                        break;

                case 'i':
                        ping_info->interval = atoi(optarg);
                        break;

                case 's':
                        ping_info->data_size = atoi(optarg);
                        break;

                case 'q':
                        ping_info->quiet = 1;
                        break;

                case 'w':
                        ping_info->deadline = atoi(optarg);
                        break;
                }
        }

        ping_info->size = sizeof(struct icmp_echo_hdr) + ping_info->data_size;

        if (optind >= argc)
                return -1;

        ping_info->destination = str2ip(argv[optind]);
        if (!ping_info->destination.addr)
                return -1;


        ping_info->last_rx_tm = timer_get_ms();

        return 0;
}
Example #5
0
/**
 * Send data without buffer
 */
void can_send_message2(tExtendedCAN *message) {

	uint32_t send_ms = timer_get_ms();

	while (mcp2515_send_extmessage(message) == 0) {
		if ((timer_get_ticks() - send_ms) > 10)
			return;
	}
}
Example #6
0
/**
 * Send CAN Messages
 *
 * This handler send messages which are stored in the buffer.
 *
 * \see \ref can_buffer
 */
void can_send_handler(void) {

	static uint32_t last_send = 0; // ms

	if (can_buffer_head == can_buffer_tail)
		return;

	if (timer_get_ms() - last_send < SEND_DELAY)
		return;


	if (mcp2515_send_extmessage(&can_buffer[can_buffer_tail]) != 0) {
		if (++can_buffer_tail == CAN_MSG_BUFFER_LENGTH)
			can_buffer_tail = 0;
		last_send = timer_get_ms();
	}

}
Example #7
0
/**
 * Parser fuction for the default state.
 *
 * This is the parser for the normal operation.
 *
 * \param m The received message
 */
void parse_default(tExtendedCAN *m) {

	switch (m->data[0]) {
		case CMD_PING:
			last_heartbeat = timer_get_ms();
			can_put_cmd(CMD_PONG, NULL, 0);
			break;
		case CMD_GET_VERSION:
			{
				char *version = "RK" XSTRING(MAJOR) "." XSTRING(MINOR);
				uint8_t len = strlen(version);
				if (len > 7) len = 7;
				can_put_cmd(CMD_VERSION, (uint8_t*) version, len);
			}
			break;
		case CMD_DRIBBLE:
			{
				ballhandler_set((int8_t)m->data[1],(int8_t)m->data[2]);
			}
			break;
		case CMD_STOP:
			{
				stop_set((uint8_t)m->data[1]);
			}
			break;
		case CMD_SERVO:
			{
				servo_set((uint8_t)m->data[1]);
			}
			break;
		case CMD_LIGHT:
			{
				if( (uint8_t)m->data[1] > 0 )
				{
					RESET(OF_LED);
					light = true;
				}
				else
				{
					SET(OF_LED);
					light = false;
				}
				//debug("receive light");
			}
			break;
		case 'm':
			debug("manual");
			manual_mode = true;
			parse_data = parse_manual;
			break;
		default:
			error("Command not implemented");
			break;
	}
}
Example #8
0
static void print_stats(struct ping_info_t* ping_info)
{
        printk("\n--- %s ping statistics ---\n",
               ip2str(ping_info->destination));
        printk("%d packets transmitted, %d received, %d%% packet loss, "\
               "time %dms\n\n",
               ping_info->num_tx, ping_info->num_rx,
               100 * (ping_info->num_tx - ping_info->num_rx) /
               ping_info->num_tx,
               timer_get_ms() - ping_info->first_tx_tm);
}
Example #9
0
/**
 * Only used in TCP mode.
 */
static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
	struct ttcp* ttcp = arg;

	INFO_TCP("TTCP [%p-%p]: connect %d %d\n", ttcp, tpcb, err, ttcp->tpcb->state);

	_connected =  ( ttcp->tpcb->state == ESTABLISHED) ? 1 : 0;
    tcp_poll_retries = 0;

	ttcp->start_time = timer_get_ms();

	return ERR_OK;
}
Example #10
0
void 
poll(struct ctx_server* hs)
{
        /* this will trigger any scheduled timer callbacks */
        timer_poll();

        /* handle console input */
        console_poll();

        /* wl api 'tick' */
        wl_tick(timer_get_ms());

        /* lwip driver poll */
        wlif_poll(hs->net_cfg.netif);

        if (initSpiComplete) spi_poll(hs->net_cfg.netif);

#ifdef WITH_GUI
        gui_exec(timer_get_ms());
#endif
}
int Lua_GetPeriodMs(lua_State *L)
{
    uint8_t pulsePerRevolution;
    size_t channel;
    int result = 0;
    if (luaToTimerValues(L, &pulsePerRevolution, &channel)) {
        int period = timer_get_ms(channel) * pulsePerRevolution;
        lua_pushinteger(L, period);
        result = 1;
    }
    return result;
}
Example #12
0
static void ping_send(struct raw_pcb *raw, struct ping_info_t* ping_info)
{
        struct pbuf *p;
        struct icmp_echo_hdr *iecho;

        if (!(p = pbuf_alloc(PBUF_IP, ping_info->size, PBUF_RAM))) {
                return;
        }
        if ((p->len == p->tot_len) && (p->next == NULL)) {
                iecho = p->payload;

                ping_prepare_echo(iecho, ping_info);
                raw_sendto(raw, p, &ping_info->destination);

                if (!ping_info->first_tx_tm)
                        ping_info->first_tx_tm = timer_get_ms();
                ping_info->last_tx_tm = timer_get_ms();
                ping_info->num_tx++;
        }
        pbuf_free(p);
}
Example #13
0
/*!
 * Delays for ms milliseconds
 * Wenn RTC_AVAILABLE dann ueber rtc, sonst ueber delay_100ms
 * ==> aufloesung ohne rtc: 100ms-schritte mir rtc: 5ms-Schritte
 * @param ms Anzahl der Millisekunden
 */
void delay(uint16 ms){
	
	#ifdef TIME_AVAILABLE
		uint16 ms_start = timer_get_ms();
		uint16 s_start = timer_get_s();
		
		uint16 ms_stop = ms_start + ms;
		
		uint16 s_stop = s_start + ms_stop/1000;
		ms_stop %= 1000;
		
		while ((s_stop != timer_get_s()) && (ms_stop != timer_get_ms())){asm volatile("nop");}
	#else 
		uint16 ms_counter=0;
	
		while (ms_counter <ms){
				delay_100ms();
				ms_counter+=100;
		}
	#endif
}
Example #14
0
/**
 * Calculate bitrate based on number of bytes transmitted and elapsed time
 */
static void ard_tcp_print_stats(struct ttcp *ttcp) {
	uint32_t ms = timer_get_ms() - ttcp->start_time;
	uint32_t bytes = ttcp->mode == TTCP_MODE_TRANSMIT ? ttcp->nbuf
			* ttcp->buflen : ttcp->recved;

	if (ttcp->verbose)
		printk("\n");

	printk("TTCP [%p]: %d bytes processed, %d.%d KB/s (%s/%s)\n", ttcp, bytes,
			bytes / ms, bytes % ms, ttcp->udp ? "udp" : "tcp", ttcp->mode
					== TTCP_MODE_TRANSMIT ? "tx" : "rx");
}
Example #15
0
/**
 * Only used in TCP mode.
 */
static err_t
tcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err)
{
        struct ttcp* ttcp = arg;

        ttcp->tpcb = newpcb;
        tcp_recv(ttcp->tpcb, tcp_recv_cb);
        tcp_err(ttcp->tpcb, tcp_conn_err_cb);

        printk("TTCP [%p]: accept\n", ttcp);
        ttcp->start_time = timer_get_ms();
        return ERR_OK;
}
Example #16
0
/* Ping using the raw ip */
static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p,
                      struct ip_addr *addr)
{
        struct icmp_echo_hdr *iecho;
        struct ip_hdr *ip = p->payload;
        struct ping_info_t* ping_info = (struct ping_info_t*) arg;
        uint32_t us;

#if ( (LWIP_VERSION) != ((1U << 24) | (3U << 16) | (2U << 8) | (LWIP_VERSION_RC)) )
        struct ip_addr ip_adr;

        /* to get unpacked version without losing alignment */
        memcpy(&ip_adr, &(ip->src), sizeof(ip_adr));
#endif
        if (pbuf_header( p, -PBUF_IP_HLEN)==0) {
                iecho = p->payload;

                if ((iecho->id == PING_ID) &&
                    (iecho->seqno == htons(ping_info->seq_num))) {
                        ping_info->last_rx_tm = timer_get_ms();
                        ping_info->num_rx++;
                        us = 1000 *
                                (ping_info->last_rx_tm - ping_info->last_tx_tm);

                        if (!ping_info->quiet)
#if ( (LWIP_VERSION) == ((1U << 24) | (3U << 16) | (2U << 8) | (LWIP_VERSION_RC)) )
                                printk("%d bytes from %s: icmp_seq=%d ttl=%d " \
                                       "time=%d.%03d ms\n",
                                       p->tot_len, ip2str(ip->src),
                                       ntohs(iecho->seqno),
                                       IPH_TTL(ip),
                                       us / 1000, us % 1000);
#else
                                printk("%d bytes from %s: icmp_seq=%d ttl=%d " \
                                       "time=%d.%03d ms\n",
                                       p->tot_len, ip2str(ip_adr),
                                       ntohs(iecho->seqno),
                                       IPH_TTL(ip),
                                       us / 1000, us % 1000);

#endif

                        /* do some ping result processing */
                        ping_info->flags |= PING_REPLY;
                }
        }

        pbuf_free(p);
        return 1; /* eat the event */
}
Example #17
0
/**
 * Only used in TCP mode.
 */
static err_t
tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err)
{
        struct ttcp* ttcp = arg;

        printk("TTCP [%p]: connect\n", ttcp);

        ttcp->start_time = timer_get_ms();
#if 0
        tcp_sent(tpcb, tcp_sent_cb);
#endif
        tcp_send_data(ttcp);
        return ERR_OK;
}
Example #18
0
/**
 * Only used in TCP mode. 
 * Will transmit a maximum of pbuf->tot_len bytes. 
 * Called upon connect and when there's space available in the TCP send window
 * 
 */
static void tcp_send_data(struct ttcp *ttcp) {
	err_t err = ERR_OK;
	uint32_t len, orig_len;

	len = ttcp->left;
	ttcp->buff_sent = 0;
	INFO_TCP_VER("left=%d len:%d tcp_sndbuf:%d\n", ttcp->left, len, tcp_sndbuf(ttcp->tpcb));


	/* don't send more than we have in the payload */
	if (len > ttcp->buflen)
		len = ttcp->buflen;

	/* We cannot send more data than space available in the send
	 buffer. */
	if (len > tcp_sndbuf(ttcp->tpcb))
		len = tcp_sndbuf(ttcp->tpcb);

	orig_len = len;
	uint8_t count = 0;
	do {
		startTime = timer_get_ms();
		err = tcp_write(ttcp->tpcb, ttcp->payload, len, TCP_WRITE_FLAG_COPY);
		INFO_TCP_VER("%d) tcp_write %p state:%d len:%d err:%d\n", count++, ttcp->tpcb, ttcp->tpcb->state, len, err);
		if (err == ERR_MEM)
		{
			len /= 2;
			ttcp->buff_sent = 0;
		}else if (err == ERR_OK){
			ttcp->buff_sent = 1;
			isDataSentCount = 0;
		}
	} while (err == ERR_MEM && len > 1);

	if (err == ERR_OK){
		//tcp_output(ttcp->tpcb);
		INFO_TCP_VER("tcp_output: left=%d new left:%d\n",
				ttcp->left, ttcp->left-len);
		ttcp->left -= len;
	}
	else
		WARN("TTCP [%p-%p]: tcp_write failed err:%d origLen:%d len:%d\n",
				ttcp, ttcp->tpcb, err, orig_len, len);
	//
	//        ttcp->tid = timer_sched_timeout_cb(0, TIMEOUT_ONESHOT,
	//                                           tcp_timeout_cb, ttcp);
}
Example #19
0
/**
 * Zeigt ein paar Infos an, die man nicht naeher zuordnen kann
 */
void misc_display(void) {
	/* Anzeige der Bot-Adresse (aenderbar) */
	display_cursor(1, 1);
	display_puts("bot_addr=");

#ifdef KEYPAD_AVAILABLE
	if (RC5_Code == RC5_CODE_MUTE) {
		gui_keypad_request(change_bot_addr_callback, 1, 1, 10);
#ifdef PC
		display_cursor(1, 10);
#endif
		display_puts("          "); // clean
		new_address = 1;
		RC5_Code = 0;
	}
	if (new_address == 0)
#endif // KEYPAD_AVAILABLE
	{
#ifdef PC
		display_cursor(1, 10);
#endif
		display_printf("0x%x", get_bot_address());
	}

#ifdef BEHAVIOUR_AVAILABLE
	display_cursor(2, 1);
	display_printf("TS=%+4d %+4d", target_speed_l, target_speed_r);
#endif

#ifdef SRF10_AVAILABLE
	display_cursor(2, 15);
	display_printf("US%4u", sensSRF10);
#endif

	display_cursor(3, 1);
	display_printf("RC=%+4d %+4d", sensEncL, sensEncR);

	display_cursor(4, 1);
	display_printf("Speed=%+4d", v_center);

	display_cursor(4, 12);
	display_printf("%4u:%03u", timer_get_s(), timer_get_ms());
}
float timer_get_sample(const int cid)
{
        if (cid >= TIMER_CHANNELS)
                return -1;

        TimerConfig *c = getWorkingLoggerConfig()->TimerConfigs + cid;
        unsigned char ppr = c->pulsePerRevolution;
        switch (c->mode) {
        case MODE_LOGGING_TIMER_RPM:
                return timer_get_rpm(cid) / ppr;
        case MODE_LOGGING_TIMER_FREQUENCY:
                return timer_get_hz(cid) / ppr;
        case MODE_LOGGING_TIMER_PERIOD_MS:
                return timer_get_ms(cid) * ppr;
        case MODE_LOGGING_TIMER_PERIOD_USEC:
                return timer_get_usec(cid) * ppr;
        default:
                return -1;
        }
}
Example #21
0
static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) {
	struct ttcp *_ttcp;

	LWIP_UNUSED_ARG(len);

	_ttcp = arg;

	tcp_poll_retries = 0;
	if (_ttcp) _ttcp->buff_sent = 1;


	INFO_TCP("Packet sent pcb:%p len:%d dur:%d left:%d count:%d\n", pcb, len, timer_get_ms() - startTime,
			(_ttcp)?(_ttcp->left):0, isDataSentCount);

	isDataSentCount = 0;

	if ((_ttcp)&&(_ttcp->left > 0)) {
		tcp_send_data(_ttcp);
	}

	return ERR_OK;
}
Example #22
0
/**
 * Only used in TCP mode.
 */
static err_t atcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err) {
	struct ttcp* ttcp = arg;

	INFO_TCP("ARD TCP [%p]: accept new [%p]\n", ttcp, newpcb);
	INFO_TCP("local:%d remote:%d state:%d\n", newpcb->local_port, newpcb->remote_port, newpcb->state);

	if (pending_accept)
	{
		WARN("Accepting another connection: %p-%p\n", ttcp->tpcb, newpcb);
		return ERR_OK;
	}
	pending_accept = true;
    tcp_setprio(newpcb, TCP_PRIO_MIN);
    tcp_poll_retries = 0;
	ttcp->tpcb = newpcb;
	tcp_recv(ttcp->tpcb, atcp_recv_cb);
	tcp_err(ttcp->tpcb, atcp_conn_err_cb);
	tcp_poll(ttcp->tpcb, atcp_poll, 4);

	ttcp->start_time = timer_get_ms();
	return ERR_OK;
}
Example #23
0
/*!
 * Direkter Zugriff auf den Motor
 * @param left	Geschwindigkeit fuer den linken Motor
 * @param right Geschwindigkeit fuer den linken Motor
 * Geschwindigkeit liegt zwischen -255 und +255.
 * 0 bedeutet Stillstand, 255 volle Kraft voraus, -255 volle Kraft zurueck.
 * Sinnvoll ist die Verwendung der Konstanten: BOT_SPEED_XXX, 
 * also z.B. motor_set(BOT_SPEED_LOW,-BOT_SPEED_LOW);
 * fuer eine langsame Drehung
*/
void motor_set(int16 left, int16 right){
	#ifdef SPEED_CONTROL_AVAILABLE
		volatile static int16 old_mot_time_s=0;
		volatile static int16 old_mot_time_ms=0;
	#endif

	if (left == BOT_SPEED_IGNORE)	
		left=BOT_SPEED_STOP;

	if (right == BOT_SPEED_IGNORE)	
		right=BOT_SPEED_STOP;

	
	// Haben wir ueberhaupt etwas zu tun?
	if ((speed_l == left) && (speed_r == right)){
		// Hier sitzt die eigentliche Regelung
		#ifdef SPEED_CONTROL_AVAILABLE
			if (timer_get_ms_since(old_mot_time_s,old_mot_time_ms) > SPEED_CONTROL_INTERVAL) {
				speed_control();
				old_mot_time_s= timer_get_s();
				old_mot_time_ms= timer_get_ms();
			}
		#endif
		return;		// Keine Aenderung? Dann zuerueck
	}
		
	if (abs(left) > BOT_SPEED_MAX)	// Nicht schneller fahren als moeglich
		speed_l = BOT_SPEED_MAX;
	else if (left == 0)				// Stop wird nicht veraendert
		speed_l = BOT_SPEED_STOP;
	else if (abs(left) < BOT_SPEED_SLOW)	// Nicht langsamer als die 
		speed_l = BOT_SPEED_SLOW;	// Motoren koennen
	else				// Sonst den Wunsch uebernehmen
		speed_l = abs(left);

	if (abs(right) > BOT_SPEED_MAX)// Nicht schneller fahren als moeglich
		speed_r = BOT_SPEED_MAX;
	else if (abs(right) == 0)	// Stop wird nicht veraendert
		speed_r = BOT_SPEED_STOP;
	else if (abs(right) < BOT_SPEED_SLOW)	// Nicht langsamer als die 
		speed_r = BOT_SPEED_SLOW;	// Motoren koennen
	else				// Sonst den Wunsch uebernehmen
		speed_r = abs(right);
	
	if (left < 0 )
		speed_l=-speed_l;
	
	if (right < 0 )	
		speed_r=-speed_r;
		
	#ifdef SPEED_CONTROL_AVAILABLE
		// TODO Hier koennten wir die Motorkennlinie heranziehen um gute Einstiegswerte fuer die Regelung zu haben
		// Evtl. sogar eine im EEPROM kalibrierbare Tabelle??
		encoderTargetRateL = left / SPEED_TO_ENCODER_RATE;	// Geschwindigkeit [mm/s] umrechnen in [EncoderTicks/Aufruf]
		encoderTargetRateR = right / SPEED_TO_ENCODER_RATE;	// Geschwindigkeit [mm/s] umrechnen in [EncoderTicks/Aufruf]
	#endif
	
	// Zuerst einmal eine lineare Kennlinie annehmen
	bot_motor(speed_l/2,speed_r/2);
	
}
Example #24
0
File: beagle.c Project: dzz/ctt2
int main(int argc, char **argv){ 
    
    int fps                                         = -1;
    double frame_millis                             = -1;
    double init_millis                              = 0;
    double tick_millis                              = 0;
    double frame_overflow                           = 0;
    double spf                                      = 0.0;
    int tick_next                                   = 0;
    unsigned int ctt2_state                         = CTT2_EVT_POLL_EVENTS;
    unsigned int render_test = 0;
        finished = 0;
    initialized_modules = 0;


    print_banner();

    if(argc==5 || argc==6) {
        SCREEN_WIDTH    = atoi( argv[1] );
        SCREEN_HEIGHT   = atoi( argv[2] );
        fullscreen      = atoi( argv[3] );
        fps             = atoi( argv[4] );
        spf = 1.0/(double)fps;
        frame_millis    = (double)1000/(double)fps;
        if(argc==6) {
            beagle_application_path = argv[5]; 
            printf("Application path: `%s`\n", beagle_application_path );
        }
    } else {

        print_usage();
        return;
    }


    loadRuntimeModule( &initLog,        &dropLog,           CTT2_RT_MODULE_LOG );
    loadRuntimeModule( &initCore,       &dropCore,          CTT2_RT_MODULE_CORE );
    loadRuntimeModule( &initDisplay,    &dropDisplay,       CTT2_RT_MODULE_DISPLAY );
    loadRuntimeModule( &initOpenGL,     &dropOpenGL,        CTT2_RT_MODULE_OPENGL );

    loadRuntimeModule( &initAudio,      &dropAudio,         CTT2_RT_MODULE_AUDIO );
    loadRuntimeModule( &initWinMsgs,    &dropWinMsgs,       CTT2_RT_MODULE_WINDOW_MSGS );
    loadRuntimeModule( &initTextInput,  &dropTextInput,     CTT2_RT_MODULE_TEXT_INPUT );
    loadRuntimeModule( &initTimer,      &dropTimer,         CTT2_RT_MODULE_TIMER );
    loadRuntimeModule( &initGamepad,    &dropGamepad,       CTT2_RT_MODULE_GAMEPAD);
    loadRuntimeModule( &initPython,     &dropPython,        CTT2_RT_MODULE_PYTHON);

    int run = 1;
    /** MAIN DISPATCH LOOP **/
    if(run) {
        SDL_Event event;
        double base_millis = timer_get_ms();
        tick_millis = timer_get_ms();


        while(finished != CTT2_RT_TERMINATED ) {
            switch(ctt2_state) {
                    case CTT2_EVT_TICK:
                        if(api_tick() == API_FAILURE) { 
                                finished = 1; 
                            } else {
                                tick_millis += frame_millis;
                                if( (timer_get_ms() - tick_millis) > frame_millis ) {
                                    ctt2_state = CTT2_EVT_TICK;
                                } else {
                                ctt2_state = CTT2_EVT_RENDER;
                                }
                            }
                         break;
                    case CTT2_EVT_RENDER:
                         if(render_test == 0) {
                            api_render();
                         } 
                         if(render_test==1) {
                             hwgfx_render_test();
                         }
                         if(render_test==2) {
                            api_render_test();
                         }
                         ctt2_state = CTT2_EVT_SYNC_GFX;
                         break;
                    case CTT2_EVT_SYNC_GFX:
                        updateViewingSurface();  
                        ctt2_state = CTT2_EVT_POLL_EVENTS;
                        break;
                    case CTT2_EVT_POLL_EVENTS:
                        if( (timer_get_ms() - tick_millis) > frame_millis ) {
                            ctt2_state = CTT2_EVT_TICK;
                         } 
                          break;
            }


            while(SDL_PollEvent(&event)) {
                switch (event.type) {
                    case SDL_CONTROLLERDEVICEADDED:
                        dropGamepad();
                        initGamepad();
                        break;
                    case SDL_CONTROLLERDEVICEREMOVED:
                        dropGamepad();
                        initGamepad();
                        break;
                    case SDL_JOYAXISMOTION:
                        GamepadHandleEvent( &event );
                        break; 
                    case SDL_TEXTINPUT:
                        api_dispatch_text( event.text.text );
                        break;
                    case SDL_QUIT:
                        finished = CTT2_RT_TERMINATED;
                        break;
                    case SDL_SYSWMEVENT:
                        #ifdef _WIN32
                            #ifdef WACOM_ENABLED
                                handle_wm_event(event); //used for the wacom tablet module, but currently missing...
                            #endif
                        #endif
                        break;
                    case SDL_KEYDOWN:
                        if( api_dispatch_key(event.key.keysym.sym,1) == API_FAILURE ) finished = CTT2_RT_TERMINATED;
                        if( event.key.keysym.sym == SDLK_F5 && (event.key.keysym.mod & KMOD_CTRL) ) {
                            dropPython();
                            initPython();
                        }
                        if( event.key.keysym.sym == SDLK_F6 && (event.key.keysym.mod & KMOD_CTRL) ) {
                            render_test = (render_test+1)%3;
                        }
                        if( event.key.keysym.sym == SDLK_F4 && (event.key.keysym.mod & KMOD_ALT) ) {
                            finished = CTT2_RT_TERMINATED;
                        }
                        break;
                    case SDL_KEYUP:
                        if( api_dispatch_key(event.key.keysym.sym,0) 
                                == API_FAILURE ) finished = CTT2_RT_TERMINATED;
                        break;
                    case SDL_MOUSEBUTTONDOWN:
                        if(api_dispatch_mousedown(
                                    event.button.button, 
                                    event.button.x, 
                                    event.button.y) == API_FAILURE ) 
                                        finished = CTT2_RT_TERMINATED ;
                        break;
                    case SDL_MOUSEBUTTONUP:
                        if(api_dispatch_mouseup(
                                    event.button.button, 
                                    event.button.x, 
                                    event.button.y) == API_FAILURE ) 
                                        finished = CTT2_RT_TERMINATED;
                        break;
                    case SDL_MOUSEMOTION:
                        if(api_dispatch_mousemotion(
                                    event.motion.x, 
                                    event.motion.y) == API_FAILURE ) 
                                        finished = CTT2_RT_TERMINATED;
                        break;
                }
            }
        }
    }
    
    sequencer_halt();
    dropRuntimeModules(0);
    return 0;
}
Example #25
0
/*!
 * Zeigt ein paar Informationen an
 */
	void display(void){
		
		#ifdef DISPLAY_BEHAVIOUR_AVAILABLE
		 /*!
          * Definitionen fuer die Verhaltensanzeige
          */
		  #undef TEST_AVAILABLE_COUNTER
		  Behaviour_t	*ptr	= behaviour;
		  int8 colcounter       = 0;
		  int8 linecounter      = 0;
		  int8 firstcol         = 0; 
		#endif 
		
		#ifdef TEST_AVAILABLE_COUNTER
			static int counter=0;
		#endif
 		if (display_update >0)
 			#ifdef DISPLAY_SCREENS_AVAILABLE
			switch (display_screen) {
				case 0:
			#endif
					display_cursor(1,1);
					display_printf("P=%03X %03X D=%03d %03d ",sensLDRL,sensLDRR,sensDistL,sensDistR);
		
					display_cursor(2,1);
					display_printf("B=%03X %03X L=%03X %03X ",sensBorderL,sensBorderR,sensLineL,sensLineR);
		
					display_cursor(3,1);
					display_printf("R=%2d %2d F=%d K=%d T=%d ",sensEncL % 10,sensEncR %10,sensError,sensDoor,sensTrans);
		
					display_cursor(4,1);
					display_printf("I=%04X M=%05d %05d",RC5_Code,sensMouseX,sensMouseY);
			#ifdef 	DISPLAY_SCREENS_AVAILABLE					
					break;
				case 1:
					#ifdef TIME_AVAILABLE
						display_cursor(1,1);
						display_printf("Zeit: %04d:%03d", timer_get_s(), timer_get_ms());
					#endif

					display_cursor(2,1);
					display_printf("TS=%+4d %+4d",target_speed_l,target_speed_r);
					#ifdef SRF10_AVAILABLE		
						display_cursor(2,15);
						display_printf("US%+4d",sensSRF10);
					#endif
		
					display_cursor(3,1);
					display_printf("RC=%+4d %+4d",sensEncL,sensEncR);
		
					display_cursor(4,1);
					display_printf("Speed= %04d %04d",v_left,v_right);
					break;

				case 2:
					display_cursor(1,1);
					  
                   #ifdef DISPLAY_BEHAVIOUR_AVAILABLE
                    /*!
                     * zeilenweise Anzeige der Verhalten
                     */ 
					display_printf("Verhalten (Pri/Akt)%d",behaviour_page);
					
					colcounter = 0; linecounter = 2;
					/* je nach Seitenwahl die ersten  Saetze ueberlesen bis richtige Seite */
					firstcol = (behaviour_page -1)*6;
					 
					/*!
					 * max. 3 Zeilen mit 6 Verhalten anzeigbar wegen Ueberschrift
					 * Seitensteuerung bei mehr Verhalten 
					 */ 
					while((ptr != NULL)&& (linecounter<5))	{
					 
					  if  ((ptr->priority > 2) &&(ptr->priority <= 200)) {
                        if   (colcounter >= firstcol) { 
				          display_cursor(linecounter,((colcounter % 2)* 12)+1);
					      display_printf(" %3d,%2d",ptr->priority,ptr->active_new);				      
					      colcounter++;
					    
					      /* bei colcounter 0 neue Zeile */
					      if (colcounter % 2 == 0)
					  	    linecounter++;
					      
					    }
					    else
					    colcounter ++;
					  }
					  ptr = ptr->next;
				    }  
					
				    #endif
					 

					#ifdef TEST_AVAILABLE_COUNTER	
					    display_printf("Screen 3");					
						display_cursor(2,1);
						display_printf("count %d",counter++);

						display_cursor(3,1);
						display_printf("Reset-Counter %d",resets);
					#endif
					break;

				case 3:
					display_cursor(1,1);
					#ifdef DISPLAY_SCREEN_RESETINFO
						/* Zeige den Grund fuer Resets an */
						display_printf("MCUCSR - Register");
												
						display_cursor(2,1);
						display_printf("PORF :%d  WDRF :%d",binary(reset_flag,0),binary(reset_flag,3)); 

						display_cursor(3,1);
						display_printf("EXTRF:%d  JTRF :%d",binary(reset_flag,1),binary(reset_flag,4)); 
									
						display_cursor(4,1);
						display_printf("BORF :%d",binary(reset_flag,2)); 
					#else
						display_printf("Screen 4");
					#endif
					break;
					
				case 4:
					/* Wird zur Ausgabe von Loggings verwendet. */
					break;
			}
			#endif	
	}
Example #26
0
void cmd_memtest(char *arg)
{
	unsigned long *sdptr;
	unsigned long i;
	unsigned long loop;
	int errcnt;
	int sec,us,us2;
	const int TEST_SIZE = 0x01000000;

	printf("SDRAMメモリテストを開始します\n");
	
	us = timer_get_ms();
	memset((void *)0x08000000,0x55,0x01000000);
	us2 = timer_get_ms();

	printf("16MBytesをmemsetする時間は %d秒でした\n",(us2-us)/1000);

	us = timer_get_ms();
	memcpy((void *)0x08000000,(void *)0x09000000,0x01000000);
	us2 = timer_get_ms();
	printf("16MBytesをmemcpyする時間は %d.%06d秒でした\n",(us2-us)/1000);

	sdptr = (unsigned long *)0x08000000;
//	timer_start();
	for(i=0;i<16777216/4;i++)
	{
		volatile int t = *sdptr++;
	}
//	timer_check(&sec,&us);
//	timer_stop();
//	printf("16MBytesをfor文で読み出す時間は %d.%06d秒でした\n",sec,us);

	sdptr = (unsigned long *)0x08000000;
//	timer_start();
	for(i=0;i<16777216/4;i++)
	{
		*sdptr++ = i;
	}
//	timer_check(&sec,&us);
//	timer_stop();
//	printf("16MBytesにfor文で書き込む時間は %d.%06d秒でした\n",sec,us);
		
	{
		void (*func)(void);
		unsigned char *src,*dst;

//		timer_start();
		empty_loop();
//		timer_check(&sec,&us);
//		timer_stop();
//		printf("10^6回ループを内蔵RAM上で実行する時間は %d.%06d秒でした\n",sec,us);

		src = (unsigned char *)empty_loop;
		dst = (unsigned char *)0x08000000;
		memcpy(dst,src,(unsigned long)empty_loop_next - (unsigned long)empty_loop);

		func = (void (*)(void))0x08000000;
//		timer_start();
		func();
//		timer_check(&sec,&us2);
//		timer_stop();
		printf("10^6回ループをSDRAM上で実行する時間は %d.%06d秒でした\n",(int)sec,(int)us2);
		
		us2 *= 100;
		printf("約%d.%d倍の時間がかかっています\n",(int)(us2/us/100),(int)((us2/us)%100));
	}

	printf("読み書きチェックを行います\n");
	
	loop = 1;
	while(!sci_rxcount())
	{
		srand(loop);
		sdptr = (unsigned long *)0x08000000;
		for(i=0;i<TEST_SIZE / sizeof(long);i++)
		{
			*sdptr++ = myrand();
		}

		srand(loop);
		errcnt = 0;
		sdptr = (unsigned long *)0x08000000;
		for(i=0;i<TEST_SIZE / sizeof(long);i++)
		{
			if(*sdptr != myrand())
			{
				printf("Error:addr=%08x data=%02x\n",(unsigned int)sdptr,(unsigned char)*sdptr);
				errcnt++;
				if(sci_rxcount()) break;
				if(errcnt > 50) break;
			}
			sdptr++;
		}

		gpio_write_port(PIN_BUZZ,1);
		if(errcnt == 0)
		{
			printf("Memory test success loop=%d\n",(int)loop);
			for(i=0;i<500;i++)
			{
				int j;
				for(j=0;j<20000;j++) {}
				gpio_write_port(PIN_LED2,j & 1);
			}
		}
		else
		{
			printf("Memory test failed loop=%d\n",(int)loop);
			for(i=0;i<100;i++)
			{
				int j;
				for(j=0;j<100000;j++) {}
				gpio_write_port(PIN_LED2,j & 1);
			}
			break;
		}
		gpio_write_port(PIN_BUZZ,0);
		loop++;
	}
}
Example #27
0
cmd_state_t cmd_ping(int argc, char* argv[], void* ctx)
{
        static enum {
                INIT,
                PING,
                WAIT_REPLY
        } state = INIT;

        struct ping_info_t *ping_info = &INFO;
        static struct raw_pcb *pcb;

        switch (state) {
        case INIT:
                if (init_ping_info(argc, argv, ping_info) != 0) {
                        printk("Usage: ping [-c count] [-i interval] "  \
                               "[-s packetsize]\n            " \
                               "[-w deadline] [-q] destination\n");
                        return CMD_DONE;
                }

                if (!(pcb = raw_new(IP_PROTO_ICMP))) {
                        printk("could not allocate pcb\n");
                        state = INIT;
                        return CMD_DONE;
                }
                raw_recv(pcb, ping_recv, ping_info);
                raw_bind(pcb, IP_ADDR_ANY);

                printk("PING %s %d(%d) bytes of data\n",
                       ip2str(ping_info->destination),
                       ping_info->data_size,
                       ping_info->size);
                state = PING;
                /* fall through */

        case PING:
                if (!netif_is_up(netif_default)) {
                        printk("netif is down\n");
                        raw_remove(pcb);
                        state = INIT;
                        return CMD_DONE;
                }

                if (ping_info->count && ping_info->num_tx == ping_info->count) {
                        ping_finalize(ping_info);
                        raw_remove(pcb);
                        state = INIT;
                        return CMD_DONE;
                }


                if (timer_get_ms() < ping_info->last_rx_tm + ping_info->interval) {
                        return CMD_INPROGRESS;
                }
                ping_send(pcb, ping_info);

                state = WAIT_REPLY;
                return CMD_INPROGRESS;

        case WAIT_REPLY:
                if (ping_info->flags & PING_REPLY) {
                        ping_info->flags &= (~PING_REPLY);
                        state = PING;
                        return CMD_INPROGRESS;
                }

                if (timer_get_ms() >
                    ping_info->last_tx_tm + ping_info->timeout) {
                        if (!ping_info->quiet)
                                printk("timeout from %s\n",
                                       ip2str(ping_info->destination));
                        state = PING;
                        return CMD_INPROGRESS;
                }

                if (ping_info->deadline &&
                    timer_get_ms() >
                    ping_info->first_tx_tm + ping_info->deadline * 1000) {
                        ping_finalize(ping_info);
                        raw_remove(pcb);
                        state = INIT;
                        return CMD_DONE;
                }

                return CMD_INPROGRESS;
        }

        /* unreachable */
        assert(0);
	return CMD_DONE;
}