//--------------------------------------------------------------------------------- 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 } } } }
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; }
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; }
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; }
void ioport_set(uint8_t address, uint8_t val) { send_chars(3, IO_REG_SET_COMMAND, address, val); }
/*! * \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; }