/*************************************************************************************** Filename:lego.cpp, version v-1.0 Authored By: Sudhanshu Gaur (sgaur@vt.edu) Acknowledgement: This work is based on Daniel Berger's VC++ RCX interface and Kekoa's RCX Opcode reference page ****************************************************************************************/ #include using namespace std; #include #include #include "lego.h" lego::lego() { // initialize private variables switchbit = 0; UsbPort = 0; dbg_lvl = 0; } int lego::open() { int val; // open the USB port for comm with RCX if (!OpenUsbPort()) { cerr<<"Cannot initialize USB port on this computer"< 0) { cout<<"Opened the USB port"< 0) { cout<<"Turned off all of the motors and closed the USB port"< 20000)) { cerr<<"Frequency out of range; must be 1-20000"< 255)) { cerr<<"Duration out of range; must be 1-255"< 0) { cout<<"Set tone"< 0) { cout<<"Set sound"< 0) { cout<<"Set sensor mode"< 0) { cout<<"Set sensor type"< 0) { cout<<"Set IR transmit range"< 0) { cout<<"Turned on motor"< 0) { cout<<"Set motor direction"< 7)) { cerr<<"Motor speed out of range; must be 0-7"< 0) { cout<<"Set motor speed"< 0) { cout<<"Turned off motor"<>8)&(0x00FF); msg[5] = 0x00; RCX_send(msg,6); recv_num = RCX_receive(recbuf,24); // Transfer Firmware fclose(fp); fp = fopen(filename, "r"); while( dataExhaust == false) { ++SeqNum; msg[0] = toggle(0x45); msg[1] = (SeqNum) & 0x00FF; msg[2] = (SeqNum >> 8) & 0x00FF; msg[3] = ( DATA_SIZE) & 0x00FF; msg[4] = (DATA_SIZE >> 8) & 0x00FF; byteNum = 4; blk_checksum = 0; for( ; (fscanf(fp, "%2x", &byte) != EOF) ; ) { msg[++byteNum] = byte; blk_checksum = (blk_checksum + byte)% 256 ; // 256 = 2^8 if(byteNum == DATA_SIZE + 4) break; } if(byteNum != DATA_SIZE + 4) { dataExhaust = true; msg[1] = 0x00; // Last Pkt msg[2] = 0x00; msg[3] = ( byteNum -4) & 0x00FF; msg[4] = ((byteNum -4)>> 8) & 0x00FF; } msg[++byteNum] = blk_checksum; RCX_send(msg, byteNum +1); recv_num = RCX_receive(recbuf, 24); cout << ".."; } // Unlock Firmware msg[0] = toggle(0xa5); msg[1] = 0x4c; msg[2] = 0x45; msg[3] = 0x47; msg[4] = 0x4f; msg[5] = 0xae; RCX_send(msg, 6); recv_num = RCX_receive(recbuf, 24); if(recv_num == 0) { cout << "\nThere was problem with Firmware download"< 0) { cout<<"Received "<2) return(7); tmp=(((int)recbuf[pos+7])<<8)+recbuf[pos+5]; if(tmp > 1023) { tmp ^=0xffff; tmp = tmp +1; tmp = -tmp; } value = tmp; break; case 0x30: case 0x38: //get battery power value=(((int)recbuf[pos+7])<<8)+recbuf[pos+5]; break; } return(len); } // end of lego class files