Esempio n. 1
0
// obs³u¿ przychodz¹ce dane na port telnetowy
void telnet_handle_packet(unsigned char* data, unsigned int len) {

    // komenda telnetowa - IAC?
    if (data[0] == TELNET_IAC) {

        // typ komendy
        switch(data[1]) {

            // Are You There?
            case TELNET_AYT:
                len = 0;

                // dodaj nazwê urz¹dzenia nadan¹ przez u¿ytkownika
                strcpy((char*)data, config_get()->name);
                len += strlen(config_get()->name);

                data[len++] = ' ';
                data[len++] = '|';
                data[len++] = ' ';

                // sygnatura urz¹dzenia                
                memcpy_P(data+len, RS2ETH_SIGNATURE, strlen_P(RS2ETH_SIGNATURE));
                len += strlen_P(RS2ETH_SIGNATURE);
                data[len++] = 0x0D; // \r
                data[len++] = 0x0A; // \n
                uip_send(data, len);
                break;

            // negocjacja podopcji
            case TELNET_SB:
                // podopcja dla portu COM
                if (data[2] == TELNET_COM_SB) {
                    if (telnet_handle_com_negotiation((data+3), len-3)) {
                        uip_send(data, len);
                    }
                }
                break;

            // przeœlij znak 0xFF
            case TELNET_IAC:
                rs_send(0xFF);
                break;
        }
    }
    // dane -> przeœlij na port COM
    else {
        if (len > 0) {
            LED_ON(LED_TX);
        }

        for (; len > 0; len--) {
            rs_send(*(data++));
        }
    }
}
Esempio n. 2
0
static int send_xfer(int size)
{
	struct pollfd fds;
	int offset, ret;

	if (verify)
		format_buf(buf, size);

	if (use_async) {
		fds.fd = rs;
		fds.events = POLLOUT;
	}

	for (offset = 0; offset < size; ) {
		if (use_async) {
			ret = do_poll(&fds, poll_timeout);
			if (ret)
				return ret;
		}

		ret = rs_send(rs, buf + offset, size - offset, flags);
		if (ret > 0) {
			offset += ret;
		} else if (errno != EWOULDBLOCK && errno != EAGAIN) {
			perror("rsend");
			return ret;
		}
	}

	return 0;
}
Esempio n. 3
0
void daq_pooling() {
    daq_interval++;

    // jeszcze / ju¿ nie teraz
    if ( (daq_interval < daq_task.interval) || (daq_task.samples == 0) ) 
        return;

    // dokonaj odczytu z kana³u <ch>
    signed int readout = ds_temp[daq_task.ch];

    // debug
    rs_send('D'); rs_int(readout); rs_newline();

    // zapisz do pliku
    fs_write(&(daq_task.fp), (unsigned char*)&readout, sizeof(signed int));

    daq_interval = 0;
    daq_task.samples--;

    // zakoñczono zadanie
    if (daq_task.samples == 0) {
        rs_text_P(PSTR("DAQ: zakonczono rejestracje do pliku '")); rs_text((char*)(daq_task.fp.name)); rs_send('\''); rs_newline();
        fs_close(&(daq_task.fp));
    }
}
Esempio n. 4
0
unsigned int firmware_read_sector(unsigned char sector, unsigned char* buf)
{
    unsigned int length, len;

    rs_text_P(PSTR("Firmware: czytam sektor #"));
    rs_hex(sector);
    rs_send(' ');

    // pobierz rozmiar danych w sektorze
    length = firmware_get_sector_length(sector);

    rs_int(length);
    rs_send('B');
    rs_newline();

    // kontrola d³ugoœci pakietu
    if (length > FIRMWARE_SECTOR_SIZE)
        return 0;

    // pierwsza strona w danym sektorze
    unsigned int page = sector * FIRMWARE_SECTOR_SIZE;

    len = length;

    while (len > 0) {
        // czytaj po stronie pamieci (po 256 bajtow)
        eeprom_page_read(page, buf, (len > 255 ? 255 : len));

        //rs_dump(buf, 255);

        // przesun wskaznik docelowy dla danych
        buf += 255;
        len -= (len > 255 ? 255 : len);
        page += 0x0100;
    }

    //rs_text_P(PSTR("Returned -> ")); rs_int(length); rs_send('B'); rs_newline();

    return length;
}
Esempio n. 5
0
// Empfangenes Telegramm verarbeiten
void write_value_req(void)
{
	unsigned char length,n=0;
	unsigned int ga;
	unsigned int val=0;

	eibledcount=0xff;// EIBLED lang einschalten
	length=telegramm[5]&0x0F;
	if (length<=15 )	{// wenn ein Telegramm reinkommt..
		if(length==1)val=telegramm[7] & 0x3F;
		if(length==2)val=telegramm[8] ;
		if(length==3)val=256*telegramm[8]+telegramm[9];
		ga=256*telegramm[3]+telegramm[4];
		if(filtermode){
			for(n=0;n<=61;n++) {						// Wert der GA aus Flash lesen
				if(ga_db[n].ga==ga) {
					n=63;
				}
			}
		}
		if ((n>=63 || !filtermode)) {
			if(!tel_sent){
				rs_send_dec(telegramm[3]>>3);			// GA senden
				rs_send('/');
				rs_send_dec(telegramm[3] & 0x07);
				rs_send('/');
				rs_send_dec(telegramm[4]);
				rs_send('=');
				if (length<=3)	rs_send_dec(val);		// Value senden
				if(length==4){
					n='.';  
					if(telegramm[8]>31){// time
						rs_send((telegramm[8]>>5)+'0');
						rs_send(',');
						n=':';
					}
					rs_send_dec(telegramm[8]&0x1F);
					rs_send(n);
					rs_send_dec(telegramm[9]);
					rs_send(n);
					rs_send_dec(telegramm[10]);
				}
				if(length>4){
					for(n=8;n <= length+6;n++){
						rs_send(telegramm[n]);
					}
				}
				rs_send_s("\n");							// CR LF
				//rs_send(10);
			}
Esempio n. 6
0
unsigned int daq_start(char* name, unsigned char ch, unsigned int interval, unsigned int samples) {

    // trwa ju¿ inne zadanie akwizycji - poczekaj na jego zakoñczenie
    if (daq_task.samples > 0) {
        return 0;
    }

    // dalsze sprawdzenie poprawnoœci parametrów
    if ( (ch >= ds_devices_count) || (interval < 1) || (interval > 3600) || (samples < 1) || (samples > 200) || !strlen(name) ) {
        return 0;
    }

    // utwórz plik na wyniki pomiarów
    if (!fs_open(&(daq_task.fp), (unsigned char*)name, 0) || daq_task.fp.size > 0) {
        return 0;
    }

    // kopiuj dane do struktury zadania DAQ
    memcpy((void*)daq_task.name, (void*)name, strlen(name));
    daq_task.ch = ch;
    daq_task.interval = interval;
    daq_task.samples = samples;

    //
    // funkcja daq_pooling() dokonuje od teraz okresowego (co <interval> sekund) pomiaru <samples> próbek
    //

    rs_text_P(PSTR("DAQ: rozpoczeto rejestracje do pliku ")); rs_text((char*)(daq_task.fp.name)); rs_send('\''); rs_newline();

    return 1;
}
Esempio n. 7
0
unsigned int daq_handle_packet(unsigned char* data) {

    unsigned int len = 0;

    rs_text_P(PSTR("Pakiet DAQ: ")); rs_send(data[0]); rs_send(data[1]); rs_newline();

    // rozdzielaj zadania
    switch(data[0]) {

        // informacje o systemie
        case DAQ_CMD_INFO:

            strcpy_P((char*)data, PROGRAM_NAME); len += strlen_P(PROGRAM_NAME);
            data[len++] = ' ';
            strcpy_P((char*)data+len, PROGRAM_VERSION1); len += strlen_P(PROGRAM_VERSION1);
            data[len++] = ' ';
            strcpy_P((char*)data+len, PROGRAM_VERSION2); len += strlen_P(PROGRAM_VERSION2);

            return len;

            break;

        // liczba czujników temperatury
        case DAQ_CMD_COUNT_SENSORS:

            // little endian - intel / avr
            data[0] = ds_devices_count;
            data[1] = 0;

            return 2;

            break;

        // odczyt danych
        case DAQ_CMD_READ:
            
            switch(data[1]) {
                // odczyt temperatury
                case DAQ_CMD_READ_TEMPERATURE:
                    return daq_read_temperature(data);

                // wype³nienia kana³ów PWM
                case DAQ_CMD_READ_PWM_FILL:
                    for (len=0; len < PWM_CHANNELS; len++) {
                        data[len] = pwm_get_fill(len);
                    }
                    return PWM_CHANNELS * sizeof(unsigned char);
            }

            break;

        // zapis danych
        case DAQ_CMD_SET:
            
            switch(data[1]) {
                // ustawienie wype³nienia kana³u PWM
                case DAQ_CMD_SET_PWM_FILL:
                    pwm_set_fill( (data[2]-'0') % PWM_CHANNELS, atoi( (char*)data+3) );
                    return 0;
            }

            break;
    }

    // zwróæ informacjê o b³êdzie
    data[0] = 'e';
    data[1] = 'r';
    data[2] = 'r';

    return 3;
}
Esempio n. 8
0
unsigned int firmware_handle_packet(unsigned char* data)
{
    firmware_packet *packet = (firmware_packet*) data;

    rs_text_P(PSTR("Firmware: offset "));
    rs_hex( packet->offset >> 16);
    rs_hex( packet->offset >> 8);
    rs_hex( packet->offset);

    rs_send(' ');
    rs_send('#');
    rs_hex(packet->op);

    switch (packet->op) {

    // pakiet z danymi strony do wgrania do pamieci
    case FIRMWARE_OP_SEND:

        // na poczatku aktualizacji wyczysc cala pamiec
        if (packet->offset == 0L) {
            eeprom_enable_write(1);
            eeprom_chip_erase();
        }

        // wlacz zapis do pamieci EEPROM
        eeprom_enable_write(1);

        // zapisz dane do pamieci
        eeprom_page_write(packet->offset, packet->data, packet->len);

        //rs_dump(packet->data, packet->len);

        // odsylamy pakiet z potwierdzeniem wgrania danych
        packet->op = FIRMWARE_OP_SEND_OK;

        return 6 + packet->len;

    // weryfikacja danych (odeslij zawartosci podanej strony)
    case FIRMWARE_OP_VERIFY:

        // pobierz cala strone
        packet->len = 255;

        // pobierz dane
        eeprom_page_read(packet->offset, packet->data, packet->len);

        //rs_dump(packet->data, packet->len+1);

        // odsylamy pakiet z danymi z pamieci (skrypt aktualizujacy dokona porownania)
        return 6 + packet->len + 1;

    // pakiet z blednym kodem operacji
    default:
        packet->op     = 0;
        packet->offset = 0UL;
        packet->len    = 0;
        return 6;
    }

    return 0;
}