Exemplo n.º 1
0
//---------------------------------------------------------------------------------
void avrDataHandler(int bytes, void *user_data) {
//---------------------------------------------------------------------------------
	AvrFifoMessage msg;
	int value;

	fifoGetDatamsg(FIFO_AVR, bytes, (u8*)&msg);
	
	if(msg.type == PROFILE_MESSAGE) {
    	long int i;
    	
		for(i=0;i < (50000);i++) {
		    swiDelay(10000);
		}
    	
    	fifoSendValue32(FIFO_AVR, (u32)1337 );
	} else if(msg.type == CONFIG_MESSAGE) {
	   	shortwait = WAIT_1MS * msg.SPIConfig.m1;
	   	speed = msg.SPIConfig.m2;
	   	spi_debug = msg.SPIConfig.debug;
	} else if(msg.type == LED_FLASH_MESSAGE) {
	    send_chars(2, FLASH_LED_COMMAND, msg.LEDFlash.count);
	} else if (msg.type == ANALOG_READ_MESSAGE) {
		send_chars(2, ANALOG_READ_COMMAND, msg.AnalogRead.pin);
		swiDelay(10000);
		send_chars(3, NULL_COMMAND, 0, 0);

		fifoSendDatamsg(FIFO_AVR, sizeof(incoming), incoming);
		//value = incoming[1];
		//value |= (incoming[2] << 8);
		/*value = read_increment(1);
		swiDelay(COMMAND_WAIT);
		value |= (read_increment(1) << 8);*/
		
		//fifoSendValue32(FIFO_AVR, (u32)value);
	} else if (msg.type == IO_PORT_GET_MESSAGE) {
		value = ioport_get(msg.IOPortGetSet.address);
		fifoSendValue32(FIFO_AVR, (u32)value);
	} else if (msg.type == IO_PORT_SET_MESSAGE) {
		ioport_set(msg.IOPortGetSet.address, msg.IOPortGetSet.value);
	} else if (msg.type == PWM_MESSAGE) {
		if(msg.PWM.command == PWM_ON) {
			if(msg.PWM.output == PWM5) {
				reg_orequal(TCCR2B, _BV(CS22));
				//TCCR2B |= CS22
			}
		}
	}
}
Exemplo n.º 2
0
uint8_t ioport_get(uint8_t address) {
    uint8_t value;
	send_chars(2, IO_REG_GET_COMMAND, address);
	swiDelay(10000); // 2.1 ms
	value = read_increment(1);
	return value;
}
Exemplo n.º 3
0
gpointer serial_thread(gpointer args)
{
    gint fd, res, i;
    struct termios oldtio, newtio;
    gchar buf[32];

    while (*((gboolean *)args)) {
        serial_changed = FALSE;

        g_usleep(500000);

        if (!serial_used)
            continue;

        if (serial_device[0] == 0)
            continue;

        fd = open(serial_device, O_RDWR | O_NOCTTY ); 
        if (fd < 0)
            continue;
        
        tcgetattr(fd,&oldtio); /* save current port settings */
        
        bzero(&newtio, sizeof(newtio));
        newtio.c_cflag = serial_baudrates[serial_baudrate].value | CRTSCTS | CS8 | CLOCAL | CREAD;
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;
        
        /* set input mode (non-canonical, no echo,...) */
        newtio.c_lflag = 0;
         
        newtio.c_cc[VTIME]    = 2;   /* inter-character timer in 0.1 sec */
        newtio.c_cc[VMIN]     = 0;   /* blocking read until 1 char received */
        
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
        
        while (*((gboolean *)args) && serial_device[0] && serial_changed == FALSE) {       /* loop for input */
            gchar ch = 0, ch2 = 0;

            res = read(fd, buf, sizeof(buf)-1);   /* returns after 1 char has been input */

            for (i = 0; i < res; i++) {
                ch2 = handle_character(buf[i]);
                if (ch2 && ch == 0) ch = ch2;
            }

            if (!ch) ch = send_chars();

            if (ch) {
                buf[0] = ch;
                write(fd, buf, 1);
            }
        }

        tcsetattr(fd,TCSANOW,&oldtio);
        close(fd);
    }

    g_thread_exit(NULL);    /* not required just good pratice */
    return NULL;
}
Exemplo n.º 4
0
gpointer serial_thread(gpointer args)
{
    gint i;
    char szBuff[32];
    DWORD dwBytesRead;

    while (*((gboolean *)args)) {
        serial_changed = FALSE;

        g_usleep(500000);

        if (!serial_used)
            continue;

        if (serial_device[0] == 0)
            continue;

        HANDLE hSerial;
        hSerial = CreateFile(serial_device,
                             GENERIC_READ | GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL,
                             0);
        if(hSerial==INVALID_HANDLE_VALUE){
            if(GetLastError()==ERROR_FILE_NOT_FOUND){
                //serial port does not exist. Inform user.
                ERR_SER;
            }
            //some other error occurred. Inform user.
            ERR_SER;
            continue;
        }

        DCB dcbSerialParams = {0};
        dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
        if (!GetCommState(hSerial, &dcbSerialParams)) {
            //error getting state
            ERR_SER;
            continue;
        }
        dcbSerialParams.BaudRate = serial_baudrates[serial_baudrate].value;
        dcbSerialParams.ByteSize = 8;
        dcbSerialParams.StopBits = ONESTOPBIT;
        dcbSerialParams.Parity = NOPARITY;
        if(!SetCommState(hSerial, &dcbSerialParams)) {
            //error setting serial port state
            ERR_SER;
            continue;
        }

        COMMTIMEOUTS timeouts = {0};
        timeouts.ReadIntervalTimeout=50;
        timeouts.ReadTotalTimeoutConstant=50;
        timeouts.ReadTotalTimeoutMultiplier=10;
        timeouts.WriteTotalTimeoutConstant=50;
        timeouts.WriteTotalTimeoutMultiplier=10;
        if(!SetCommTimeouts(hSerial, &timeouts)) {
            //error occureed. Inform user
            ERR_SER;
            continue;
        }

        while (*((gboolean *)args) && serial_device[0] && serial_changed == FALSE) {       /* loop for input */
            gchar ch = 0, ch2 = 0;

            if (ReadFile(hSerial, szBuff, 31, &dwBytesRead, NULL)) {
                szBuff[dwBytesRead] = 0;
                for (i = 0; i < dwBytesRead; i++) {
                    ch2 = handle_character(szBuff[i]);
                    if (ch2 && ch == 0) ch = ch2;
                }
            }

            if (!ch) ch = send_chars();

            if (ch) {
                szBuff[0] = ch;
                if(!WriteFile(hSerial, szBuff, 1, &dwBytesRead, NULL))
                    g_print("Cannot write to COM!\n");
            }
        }

        CloseHandle(hSerial);
    } // while

    g_thread_exit(NULL);    /* not required just good pratice */
    return NULL;
}
Exemplo n.º 5
0
void ioport_set(uint8_t address, uint8_t val) {
	send_chars(3, IO_REG_SET_COMMAND, address, val);
}
Exemplo n.º 6
0
/*! 
 *  \brief     Parse from Login
 *  \details   Parse informations from auth server
 *  \author    Fimbulwinter Development Team
 *  \author    GreenBox
 *  \date      08/12/11
 *
 **/
int CharServer::parse_from_login(tcp_connection::pointer cl)
{
	CharSessionData *csd;

	if (cl->flags.eof)
	{
		cl->do_close();

		connect_to_auth();

		return 0;
	}

	while(RFIFOREST(cl) >= 2)
	{
		unsigned short cmd = RFIFOW(cl, 0);

		switch (cmd)
		{
		case INTER_AC_REQ_ACC_DATA_REPLY:
			if (RFIFOREST(cl) < 62)
				return 0;
			{
				int tag = RFIFOL(cl, 2);

				if (tcp_connection::session_exists(tag) && 
					(csd = (CharSessionData *)tcp_connection::get_session_by_tag(tag)->get_data()))
				{
					memcpy(csd->email, RFIFOP(cl,6), 40);
					csd->expiration_time = (time_t)RFIFOL(cl,46);
					csd->gmlevel = RFIFOB(cl,50);
					strncpy(csd->birthdate, (const char*)RFIFOP(cl,51), sizeof(csd->birthdate));

					// TODO: Check max users and min level to bypass

					csd->auth = true;
					send_chars(csd->cl, csd);
				}
			}
			cl->skip(62);
			break;
		case INTER_AC_AUTH_REPLY:
			if (RFIFOREST(cl) < 20)
				return 0;
			{
				int account_id = RFIFOL(cl,2);
				unsigned int login_id1 = RFIFOL(cl,6);
				unsigned int login_id2 = RFIFOL(cl,10);
				unsigned char sex = RFIFOB(cl,14);
				unsigned char result = RFIFOB(cl,15);
				int request_id = RFIFOL(cl,16);
				cl->skip(20);

				if (tcp_connection::session_exists(request_id) && 
					(csd = (CharSessionData *)tcp_connection::get_session_by_tag(request_id)->get_data()) &&
					!csd->auth && csd->account_id == account_id && csd->login_id1 == login_id1 &&
					csd->login_id2 == login_id2 && csd->sex == sex)
				{
					tcp_connection::pointer client_cl = csd->cl;

					if (result == 0)
					{
						auth_ok(client_cl, csd);
					}
					else
					{
						WFIFOPACKET(client_cl,packet,HC_REFUSE_ENTER);
						packet->header = HEADER_HC_REFUSE_ENTER;
						packet->error_code = 0;
						client_cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_ENTER));
					}
				}
			}
			break;
		
		case INTER_AC_KICK:
			{
				int aid = RFIFOL(cl, 2);
				cl->skip(6);

				if (online_chars.count(aid))
				{
					if (online_chars[aid].server > -1)
					{
						// TODO: Kick from ZoneServer
					}
					else
					{
						if (!online_chars[aid].cl->flags.eof)
						{
							WFIFOPACKET(online_chars[aid].cl,packet,SC_NOTIFY_BAN);
							packet->header = HEADER_SC_NOTIFY_BAN;
							packet->error_code = 2;
							online_chars[aid].cl->send_buffer(sizeof(struct PACKET_SC_NOTIFY_BAN));
							online_chars[aid].cl->set_eof();
						}
						else
							set_char_offline(aid, -1);
					}
				}
			}
			break;
		case INTER_AC_LOGIN_REPLY:
			{
				unsigned char result = RFIFOB(cl, 2);
				cl->skip(3);

				if (result == 0)
				{
					auth_conn_ok = true;

					ShowStatus("Connected to AuthServer.\n");
				}
				else
				{
					ShowError("Connectiong rejected from AuthServer.");
					cl->set_eof();
					return 0;
				}
			}
			break;
		default:
			ShowWarning("Unknown packet 0x%x sent from AuthServer, closing connection.\n", cmd, cl->socket().remote_endpoint().address().to_string().c_str());
			cl->set_eof();
			return 0;
		}
	}

	return 0;
}