Changeset 32c7682 in thomson
- Timestamp:
- Jan 28, 2012, 3:13:17 PM (12 years ago)
- Branches:
- main
- Children:
- c7b4218
- Parents:
- 96bc8fa
- Location:
- elec/CrO2/software
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
elec/CrO2/software/Makefile
r96bc8fa r32c7682 23 23 all: $(PROGRAM) 24 24 25 $(PROGRAM): $(PROJECT).o device.o 25 $(PROGRAM): $(PROJECT).o device.o poller.o 26 26 $(CC) -o $(PROGRAM) $^ $(LIBS) 27 27 -
elec/CrO2/software/cro2.cpp
r96bc8fa r32c7682 5 5 */ 6 6 7 #include <iostream> 7 8 #include <stdio.h> 8 9 #include <stdlib.h> … … 15 16 16 17 #include "device.h" 18 #include "poller.h" 17 19 18 20 /* UI */ … … 29 31 30 32 33 Ihandle* motoron; 31 34 void GUI_open(int* argc, char*** argv) 32 35 { … … 48 51 ); 49 52 53 // CONTROL 54 motoron = IupProgressBar(); 55 IupSetAttribute(motoron, "RASTERSIZE", "16x16"); 56 57 // EXPLORE 50 58 Ihandle* platformlist = IupList(NULL); 51 59 IupSetAttribute(platformlist, "EXPAND", "HORIZONTAL"); … … 59 67 Ihandle* tabs = IupTabs( 60 68 IupVbox( 61 IupLabel("Hello World"), 69 IupHbox( 70 IupLabel("Motor"), 71 motoron, 72 NULL 73 ), 74 IupHbox( 75 IupToggle("play",NULL), 76 IupToggle("REC",NULL), 77 NULL 78 ), 62 79 NULL 63 80 ), … … 89 106 IupShow(dialog); 90 107 108 // Run the timer 109 startPolling(); 110 91 111 IupMainLoop(); 92 112 … … 106 126 } 107 127 108 Device dev; // Constructor inits communication.109 // TODO handle thrown exceptions.128 try { 129 Device& dev = Device::getDevice(); // Constructor inits communication. 110 130 111 112 memset(buffer, 0, 275);113 nBytes = dev.read(buffer, sizeof(buffer));114 131 if(strcmp(argv[1], "get") == 0){ 132 memset(buffer, 0, 275); 133 nBytes = dev.read(buffer, sizeof(buffer)); 134 }else if(strcmp(argv[1], "put") == 0){ 115 135 116 while (dev.getStatus() & 8) 117 usleep(1000000); 136 // wait for motor on 137 while (dev.getStatus() & 8) 138 usleep(1000000); 118 139 119 FILE* fptr = fopen(argv[2], "rb"); 120 int blockid; 121 uint8_t blktype, blksize; 122 sscanf(argv[3], "%d", &blockid); 140 // load file 141 FILE* fptr = fopen(argv[2], "rb"); 142 int blockid; 143 uint8_t blktype, blksize; 144 sscanf(argv[3], "%d", &blockid); 123 145 124 do 125 { 146 // fast-forward to requested block 126 147 do 127 148 { 149 do 150 { 151 fread(&blktype, 1, 1, fptr); 152 if (feof(fptr)) 153 { 154 fprintf(stderr, "end of file.\n"); 155 fclose(fptr); 156 exit(0); 157 } 158 } 159 while(blktype != 0x5A); // skip sync header 160 128 161 fread(&blktype, 1, 1, fptr); 129 if (feof(fptr)) 162 fread(&blksize, 1, 1, fptr); 163 blksize -= 2; 164 fread(buffer, 1, blksize + 1, fptr); 165 if (blktype == 0) 130 166 { 131 fprintf(stderr, "end of file.\n"); 132 fclose(fptr); 133 exit(0); 167 // new file 168 printf("%.11s\n",buffer); 134 169 } 135 170 } 136 while (blktype != 0x5A); // skip sync header171 while (blockid --); 137 172 138 fread(&blktype, 1, 1, fptr); 139 fread(&blksize, 1, 1, fptr); 140 blksize -= 2; 141 fread(buffer, 1, blksize + 1, fptr); 142 if (blktype == 0) 143 { 144 // new file 145 printf("%.11s\n",buffer); 146 } 173 fclose(fptr); 174 175 nBytes = dev.write(buffer, blksize, blktype); 176 }else{ 177 // TODO print usage 178 exit(2); 147 179 } 148 while (blockid --);149 180 150 fclose(fptr); 151 152 nBytes = dev.write(buffer, blksize, blktype); 153 }else{ 154 GUI_open(&argc, &argv); 155 } 156 157 if (nBytes < 0) fprintf(stderr, "USB error %s\n", usb_strerror()); 158 return 0; 181 if (nBytes < 0) fprintf(stderr, "USB error %s\n", usb_strerror()); 182 return 0; 183 } 184 catch(const char* error) 185 { 186 std::cerr << error << std::endl; 187 } 159 188 } 160 189 -
elec/CrO2/software/device.cpp
r96bc8fa r32c7682 9 9 #include "device.h" 10 10 11 #include <iostream> // TODO remove12 13 11 bool Device::initOnce = false; 12 Device* Device::instance = NULL; 14 13 15 14 const uint32_t Device::vid = 0x16C0; … … 24 23 #define PSCMD_STATUS 3 25 24 26 /* USB device lookup by VID and PID, then Vendor and Product strings, as we use V-USB shared ID. */ 27 static int usbGetStringAscii(usb_dev_handle *dev, int index, int langid, char *buf, int buflen) 25 26 // Gets the device instance. Throws an error message if something bad happens. 27 Device& Device::getDevice() throw(const char*) 28 { 29 if (instance == NULL) 30 instance = new Device(); 31 32 return *instance; 33 } 34 35 36 /* USB device lookup by VID and PID, then Vendor and Product strings, as we use 37 * V-USB shared ID. */ 38 static int usbGetStringAscii(usb_dev_handle *dev, int index, int langid, 39 char *buf, int buflen) 28 40 { 29 41 char buffer[256]; 30 42 int rval, i; 31 43 32 if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid, buffer, sizeof(buffer), 1000)) < 0) 44 if((rval = usb_control_msg(dev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, 45 (USB_DT_STRING << 8) + index, langid, buffer, sizeof(buffer), 1000)) < 0) 33 46 return rval; 34 47 if(buffer[1] != USB_DT_STRING) … … 49 62 } 50 63 51 Device::Device() 64 Device::Device() throw(const char*) 52 65 { 53 66 handle = NULL; … … 69 82 continue; 70 83 71 // Found device with correct VID and PID. Now try to match the strings 84 // Found device with correct VID and PID. Now try to match the 85 // vendor and product strings 72 86 char string[256]; 73 87 int len; 74 handle = usb_open(dev); /* we need to open the device in order to query strings */ 88 handle = usb_open(dev); 89 /* we need to open the device in order to query strings */ 75 90 if(!handle){ 76 std::cerr << "Warning: cannot open USB device: " << usb_strerror() << std::endl;77 91 continue; 78 92 } 79 93 /* now check whether the names match: */ 80 len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 0x0409, string, sizeof(string)); 81 if(len < 0) 82 { 83 std::cerr << "Warning: cannot query manufacturer for device: " << usb_strerror() << std::endl; 84 } 85 else 94 len = usbGetStringAscii(handle, dev->descriptor.iManufacturer, 95 0x0409, string, sizeof(string)); 96 if(len >= 0) 86 97 { 87 98 if(strcmp(string, vendor) == 0){ 88 len = usbGetStringAscii(handle, dev->descriptor.iProduct, 0x0409, string, sizeof(string)); 89 if(len < 0){ 90 std::cerr << "Warning: cannot query product for device: " << usb_strerror() << std::endl; 91 }else{ 99 len = usbGetStringAscii(handle, dev->descriptor.iProduct, 100 0x0409, string, sizeof(string)); 101 if(len >= 0){ 92 102 if(strcmp(string, product) == 0) 93 103 break; … … 104 114 // At this point, either we have found a device and handle is pointing to it, 105 115 // or we failed and handle is NULL. 106 //107 // TODO : use exceptions for error handling; instead of fprintf (not useable in GUI mode).108 116 if (!handle) 109 std::cerr << "Could not find USB device \"" << product << "\" with vid=0x" << std::hex << vid << " pid=0x" << pid << std::endl;117 throw "Device not found. Is the USB cable plugged correctly?"; 110 118 } 111 119 … … 119 127 int Device::read(uint8_t* buffer, size_t max) 120 128 { 121 return usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, PSCMD_GET, 0,0, (char*)buffer, max, 5000); 129 return usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 130 PSCMD_GET, 0,0, (char*)buffer, max, 5000); 122 131 123 132 } … … 127 136 { 128 137 int rqtype = (size == 0) ? USB_ENDPOINT_IN:USB_ENDPOINT_OUT; 129 return usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | rqtype, PSCMD_PUT, blktype,0 /*checksum*/, (char*)buffer, size, 5000); 138 return usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | rqtype, 139 PSCMD_PUT, blktype,0 /*checksum*/, (char*)buffer, size, 5000); 130 140 131 141 } … … 134 144 { 135 145 uint8_t status; 136 usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, PSCMD_STATUS, 0,0, (char*)&status, 1, 5000); 146 usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, 147 PSCMD_STATUS, 0,0, (char*)&status, 1, 5000); 137 148 // TODO handle errors (return value) 138 149 return status; -
elec/CrO2/software/device.h
r96bc8fa r32c7682 14 14 { 15 15 public: 16 Device(); // Open device and set it up for communication 16 static Device& getDevice() throw(const char*); 17 17 18 ~Device(); 18 19 … … 22 23 23 24 private: 25 Device() throw(const char*); // Open device and set it up for communication 26 Device(const Device& other); 27 28 24 29 usb_dev_handle* handle; 25 30 26 31 static bool initOnce; 32 static Device* instance; 27 33 28 34 static const uint32_t vid;
Note:
See TracChangeset
for help on using the changeset viewer.