diff --git a/99-intrepidcs.rules b/99-intrepidcs.rules new file mode 100644 index 0000000..24f2500 --- /dev/null +++ b/99-intrepidcs.rules @@ -0,0 +1,26 @@ +# Intrepid Control System, Inc. neoVI Devices +SUBSYSTEM=="usb", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" +KERNEL=="ttyUSB?", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" +KERNEL=="ttyACM?", ATTRS{idVendor}=="093c", GROUP="users", MODE="0666" + +# neoVI ION/PLASMA PIDs are not in the latest ftdi_sio driver so lets make a +# rule to add it when we see a new unclaimed device. +# PLASMA = 0x0801, ION = 0x0901 +ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \ + ATTRS{idVendor}=="093c", ATTRS{idProduct}=="0801", \ + DRIVER=="", \ + RUN+="/sbin/modprobe -b ftdi_sio" +ACTION=="add", SUBSYSTEM=="drivers", \ + ENV{DEVPATH}=="/bus/usb-serial/drivers/ftdi_sio", \ + ATTR{new_id}="093c 0801" +ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \ + ATTRS{idVendor}=="093c", ATTRS{idProduct}=="0901", \ + DRIVER=="", \ + RUN+="/sbin/modprobe -b ftdi_sio" +ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_interface", \ + ATTRS{idVendor}=="093c", ATTRS{idProduct}=="1000", \ + DRIVER=="", \ + RUN+="/sbin/modprobe -b ftdi_sio" +ACTION=="add", SUBSYSTEM=="drivers", \ + ENV{DEVPATH}=="/bus/usb-serial/drivers/ftdi_sio", \ + ATTR{new_id}="093c 0901" diff --git a/README.md b/README.md index bd72d96..dbe458e 100644 --- a/README.md +++ b/README.md @@ -121,4 +121,10 @@ The dependencies are as follows - CMake 3.2 or above - GCC 4.7 or above, 4.8+ recommended - `libusb-1.0-0-dev` - - `build-essential` is recommended \ No newline at end of file + - `build-essential` is recommended + +If you'd like to be able to run programs that use this library without being root, consider using the included udev rules + +``` +$ sudo cp 99-intrepidcs.rules /etc/udev/rules.d/ +``` diff --git a/api/icsneolegacy/icsneolegacy.cpp b/api/icsneolegacy/icsneolegacy.cpp index fbcf679..7e9e1b3 100644 --- a/api/icsneolegacy/icsneolegacy.cpp +++ b/api/icsneolegacy/icsneolegacy.cpp @@ -44,7 +44,6 @@ static void NeoMessageToSpyMessage(const neomessage_t& newmsg, icsSpyMessage& ol oldmsg.ExtraDataPtr = (void*)newmsg.data; memcpy(oldmsg.Data, newmsg.data, std::min(newmsg.length, (size_t)8)); oldmsg.ArbIDOrHeader = *(uint32_t*)newmsg.header; - oldmsg.ExtraDataPtrEnabled = newmsg.length > 8; oldmsg.NetworkID = (uint8_t)newmsg.netid; // Note: NetID remapping from the original API is not supported oldmsg.StatusBitField = newmsg.status.statusBitfield[0]; oldmsg.StatusBitField2 = newmsg.status.statusBitfield[1]; @@ -187,24 +186,7 @@ int icsneoGetMessages(void* hObject, icsSpyMessage* pMsg, int* pNumberOfMessages } int icsneoTxMessages(void* hObject, icsSpyMessage* pMsg, int lNetworkID, int lNumMessages) { - if(!icsneoValidateHObject(hObject)) - return false; - neodevice_t* device = (neodevice_t*)hObject; - std::vector data; - neomessage_t newmsg = {}; - newmsg.netid = (uint16_t)lNetworkID; - memcpy(newmsg.header, &pMsg[0].ArbIDOrHeader, sizeof(newmsg.header)); - for(int i = 0; i < lNumMessages; i++) - data.insert(data.end(), pMsg[i].Data, pMsg[i].Data + pMsg[i].NumberBytesData); - newmsg.data = data.data(); - newmsg.length = data.size(); - newmsg.status.statusBitfield[0] = pMsg[0].StatusBitField; - newmsg.status.statusBitfield[1] = pMsg[0].StatusBitField2; - newmsg.status.statusBitfield[2] = pMsg[0].StatusBitField3; - newmsg.status.statusBitfield[3] = pMsg[0].StatusBitField4; - if(pMsg[0].Protocol == SPY_PROTOCOL_CANFD) - newmsg.status.canfdFDF = true; - return icsneo_transmit(device, &newmsg); + return icsneoTxMessagesEx(hObject, pMsg, lNetworkID, lNumMessages, nullptr, 0); } int icsneoTxMessagesEx(void* hObject, icsSpyMessage* pMsg, unsigned int lNetworkID, unsigned int lNumMessages, unsigned int* NumTxed, unsigned int zero2) { @@ -212,6 +194,9 @@ int icsneoTxMessagesEx(void* hObject, icsSpyMessage* pMsg, unsigned int lNetwork return false; neodevice_t* device = (neodevice_t*)hObject; neomessage_t newmsg; + unsigned int temp = 0; + if(NumTxed == nullptr) + NumTxed = &temp; *NumTxed = 0; for(unsigned int i = 0; i < lNumMessages; i++) { const icsSpyMessage& oldmsg = pMsg[i]; @@ -219,7 +204,7 @@ int icsneoTxMessagesEx(void* hObject, icsSpyMessage* pMsg, unsigned int lNetwork newmsg.netid = (uint16_t)lNetworkID; memcpy(newmsg.header, &oldmsg.ArbIDOrHeader, sizeof(newmsg.header)); newmsg.length = oldmsg.NumberBytesData | (oldmsg.NodeID << 8); - if (oldmsg.ExtraDataPtrEnabled) + if (oldmsg.ExtraDataPtr != nullptr) newmsg.data = reinterpret_cast(oldmsg.ExtraDataPtr); else newmsg.data = oldmsg.Data;