mirror of
https://github.com/EEVengers/ThunderScope.git
synced 2025-04-22 17:43:44 +00:00
FTDI Cleanup
This commit is contained in:
parent
08486a534f
commit
7c46777040
Software/waveview/scope_link
@ -1,28 +0,0 @@
|
||||
//
|
||||
// EVSuperSpeedFIFIOBridge.hpp
|
||||
// Scope
|
||||
//
|
||||
// Created by Daniel Vasile on 2019-07-30.
|
||||
// Copyright © 2019 EEVengers. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef EVSuperSpeedFIFIOBridge_hpp
|
||||
#define EVSuperSpeedFIFIOBridge_hpp
|
||||
|
||||
#include <thread>
|
||||
#include "logger.hpp"
|
||||
#include "exception.hpp"
|
||||
#include "ftdiThings.hpp"
|
||||
|
||||
/*
|
||||
* Used To Get A Handle To The FTDI SuperSpeed FIFO Bridge
|
||||
* @params
|
||||
* FT_HANDLE *device_handle - A pointer to a variable which will hold the inialized handle to the FIFO SuperSpeed Bridge
|
||||
* @return
|
||||
* 0 on success
|
||||
*/
|
||||
void InitFTDISuperSpeedChip(FT_HANDLE *deviceHandle);
|
||||
|
||||
|
||||
|
||||
#endif /* EVSuperSpeedFIFIOBridge_hpp */
|
@ -1,90 +0,0 @@
|
||||
//
|
||||
// EVDataTransferThread.hpp
|
||||
// Scope
|
||||
//
|
||||
// Created by Daniel Vasile on 2019-07-30.
|
||||
// Copyright © 2019 EEVengers. All rights reserved.
|
||||
//
|
||||
|
||||
#ifndef EVDataTransferThread_hpp
|
||||
#define EVDataTransferThread_hpp
|
||||
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <boost/lockfree/queue.hpp>
|
||||
|
||||
#include "common.hpp"
|
||||
#include "exception.hpp"
|
||||
#include "logger.hpp"
|
||||
#include "ftdiThings.hpp"
|
||||
|
||||
enum CopyFuncs
|
||||
{
|
||||
DataTransferFullBuffRead
|
||||
};
|
||||
|
||||
/*
|
||||
Container class that encapsulates all data transfers that occur in this program.
|
||||
FTDIChip -> DataHandler
|
||||
DataHandler -> DigitalProcessingHandler
|
||||
DigitalProcessingHandler -> Electron app
|
||||
*/
|
||||
class DataTransferHandler
|
||||
{
|
||||
public:
|
||||
|
||||
DataTransferHandler(boost::lockfree::queue<buffer*, boost::lockfree::fixed_sized<false>> *outputQ);
|
||||
|
||||
void StartFTDITransferThread();
|
||||
void SetFTDITransferCopyFunction();
|
||||
void SetCopyFunc(CopyFuncs Func);
|
||||
void stopHandler();
|
||||
|
||||
uint64_t bytesRead;//used for testing
|
||||
|
||||
EVSharedCache* threadSharedCache;
|
||||
|
||||
~DataTransferHandler();
|
||||
|
||||
void createThread();
|
||||
void destroyThread();
|
||||
|
||||
uint32_t getCount();
|
||||
uint32_t getCountBytes();
|
||||
void setCount(uint32_t);
|
||||
void clearCount();
|
||||
|
||||
// Control the inner and outer transfer loops
|
||||
void transferStop();
|
||||
void transferStart();
|
||||
void transferUnpause();
|
||||
void transferPause();
|
||||
|
||||
private:
|
||||
boost::lockfree::queue<buffer*, boost::lockfree::fixed_sized<false>> *outputQueue;
|
||||
|
||||
void FTDITransferThread();
|
||||
|
||||
FT_HANDLE superSpeedFIFOBridgeHandle;
|
||||
|
||||
void (*CopyFunc)(unsigned char* buff, unsigned int& idx, unsigned int size, void* obj);
|
||||
|
||||
std::atomic<bool> stopTransfer;
|
||||
std::atomic<bool> pauseTransfer;
|
||||
std::atomic<bool> threadExists;
|
||||
|
||||
std::thread handlerThread;
|
||||
|
||||
uint32_t count;
|
||||
|
||||
protected:
|
||||
|
||||
std::mutex lock;
|
||||
std::mutex lockThread;
|
||||
|
||||
const static unsigned int numAsyncBuffers = 16;
|
||||
|
||||
buffer *asyncDataBuffers[numAsyncBuffers];
|
||||
};
|
||||
|
||||
#endif /* EVDataTransferThread_hpp */
|
@ -1,848 +0,0 @@
|
||||
//
|
||||
// ftd3xx.h
|
||||
// Scope
|
||||
//
|
||||
// Copied by Daniel Vasile from FTDI Example Program on 2019-07-26.
|
||||
//
|
||||
|
||||
#ifndef FTD3XX_H_DKFTHSPV
|
||||
#define FTD3XX_H_DKFTHSPV
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstddef>
|
||||
#include <cstdbool>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#else
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
||||
#include <windows.h>
|
||||
#ifdef FTD3XX_EXPORTS
|
||||
#define FTD3XX_API __declspec(dllexport)
|
||||
#elif defined(FTD3XX_STATIC)
|
||||
#define FTD3XX_API
|
||||
#else
|
||||
#define FTD3XX_API __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
#else /* _WIN32 || _WIN64 */
|
||||
|
||||
#define WINAPI
|
||||
#ifndef FTD3XX_EXPORTS
|
||||
#define FTD3XX_API
|
||||
#else /* !FTD3XX_EXPORTS */
|
||||
#define FTD3XX_API __attribute__((visibility("default")))
|
||||
#endif /* FTD3XX_EXPORTS */
|
||||
|
||||
typedef uint16_t WORD;
|
||||
typedef uint32_t DWORD;
|
||||
typedef uint64_t DWORD64;
|
||||
typedef uint32_t * LPDWORD;
|
||||
typedef uint8_t BYTE;
|
||||
typedef uint8_t UCHAR;
|
||||
typedef uint16_t USHORT;
|
||||
typedef USHORT * PUSHORT;
|
||||
typedef unsigned int ULONG;
|
||||
typedef uint16_t WCHAR;
|
||||
typedef uint8_t * LPBYTE;
|
||||
typedef bool BOOL;
|
||||
typedef UCHAR *PUCHAR;
|
||||
typedef ULONG *PULONG;
|
||||
typedef const char * LPCSTR;
|
||||
|
||||
typedef void VOID;
|
||||
typedef void * PVOID;
|
||||
typedef void * LPVOID;
|
||||
typedef char * PCHAR;
|
||||
typedef void * HANDLE;
|
||||
|
||||
typedef struct _OVERLAPPED {
|
||||
DWORD Internal;
|
||||
DWORD InternalHigh;
|
||||
union {
|
||||
struct {
|
||||
DWORD Offset;
|
||||
DWORD OffsetHigh;
|
||||
};
|
||||
PVOID Pointer;
|
||||
};
|
||||
HANDLE hEvent;
|
||||
} OVERLAPPED, *LPOVERLAPPED;
|
||||
|
||||
typedef struct _SECURITY_ATTRIBUTES {
|
||||
DWORD nLength;
|
||||
LPVOID lpSecurityDescriptor;
|
||||
BOOL bInheritHandle;
|
||||
} SECURITY_ATTRIBUTES , *LPSECURITY_ATTRIBUTES;
|
||||
|
||||
#endif /* OTHER OS */
|
||||
|
||||
//
|
||||
// Standard Descriptor Types
|
||||
//
|
||||
#define FT_DEVICE_DESCRIPTOR_TYPE 0x01
|
||||
#define FT_CONFIGURATION_DESCRIPTOR_TYPE 0x02
|
||||
#define FT_STRING_DESCRIPTOR_TYPE 0x03
|
||||
#define FT_INTERFACE_DESCRIPTOR_TYPE 0x04
|
||||
|
||||
//
|
||||
// Power Configuration
|
||||
//
|
||||
#define FT_IS_SELF_POWERED(bmAttributes) ((bmAttributes) == 0x40)
|
||||
#define FT_IS_BUS_POWERED(bmAttributes) (!((bmAttributes) == 0x40))
|
||||
#define FT_IS_REMOTE_WAKEUP_ENABLED(bmAttributes) ((bmAttributes) == 0x20)
|
||||
|
||||
//
|
||||
// Pipe Direction
|
||||
//
|
||||
#define FT_IS_READ_PIPE(ucEndpoint) ((ucEndpoint) & 0x80)
|
||||
#define FT_IS_WRITE_PIPE(ucEndpoint) (!((ucEndpoint) & 0x80))
|
||||
|
||||
//
|
||||
// Pipe type
|
||||
//
|
||||
#define FT_IS_BULK_PIPE(ucPipeType) ((ucPipeType) == 2)
|
||||
#define FT_IS_INTERRUPT_PIPE(ucPipeType) ((ucPipeType) == 3)
|
||||
#define FT_IS_ISOCHRONOUS_PIPE(ucPipeType) (0)
|
||||
|
||||
//
|
||||
// Reserved pipes
|
||||
//
|
||||
#define FT_RESERVED_INTERFACE_INDEX 0x0
|
||||
#define FT_RESERVED_PIPE_INDEX_SESSION 0x0
|
||||
#define FT_RESERVED_PIPE_INDEX_NOTIFICATION 0x1
|
||||
#define FT_RESERVED_PIPE_SESSION 0x1
|
||||
#define FT_RESERVED_PIPE_NOTIFICATION 0x81
|
||||
|
||||
//
|
||||
// Create flags
|
||||
//
|
||||
#define FT_OPEN_BY_SERIAL_NUMBER 0x00000001
|
||||
#define FT_OPEN_BY_DESCRIPTION 0x00000002
|
||||
#define FT_OPEN_BY_LOCATION 0x00000004
|
||||
#define FT_OPEN_BY_GUID 0x00000008
|
||||
#define FT_OPEN_BY_INDEX 0x00000010
|
||||
|
||||
//
|
||||
// ListDevices flags
|
||||
//
|
||||
#define FT_LIST_ALL 0x20000000
|
||||
#define FT_LIST_BY_INDEX 0x40000000
|
||||
#define FT_LIST_NUMBER_ONLY 0x80000000
|
||||
|
||||
|
||||
//
|
||||
// GPIO direction, value
|
||||
//
|
||||
#define FT_GPIO_DIRECTION_IN 0
|
||||
#define FT_GPIO_DIRECTION_OUT 1
|
||||
#define FT_GPIO_VALUE_LOW 0
|
||||
#define FT_GPIO_VALUE_HIGH 1
|
||||
#define FT_GPIO_0 0
|
||||
#define FT_GPIO_1 1
|
||||
|
||||
typedef PVOID FT_HANDLE, *PFT_HANDLE;
|
||||
|
||||
enum _FT_STATUS {
|
||||
FT_OK,
|
||||
FT_INVALID_HANDLE,
|
||||
FT_DEVICE_NOT_FOUND,
|
||||
FT_DEVICE_NOT_OPENED,
|
||||
FT_IO_ERROR,
|
||||
FT_INSUFFICIENT_RESOURCES,
|
||||
FT_INVALID_PARAMETER, /* 6 */
|
||||
FT_INVALID_BAUD_RATE,
|
||||
FT_DEVICE_NOT_OPENED_FOR_ERASE,
|
||||
FT_DEVICE_NOT_OPENED_FOR_WRITE,
|
||||
FT_FAILED_TO_WRITE_DEVICE, /* 10 */
|
||||
FT_EEPROM_READ_FAILED,
|
||||
FT_EEPROM_WRITE_FAILED,
|
||||
FT_EEPROM_ERASE_FAILED,
|
||||
FT_EEPROM_NOT_PRESENT,
|
||||
FT_EEPROM_NOT_PROGRAMMED,
|
||||
FT_INVALID_ARGS,
|
||||
FT_NOT_SUPPORTED,
|
||||
|
||||
FT_NO_MORE_ITEMS,
|
||||
FT_TIMEOUT, /* 19 */
|
||||
FT_OPERATION_ABORTED,
|
||||
FT_RESERVED_PIPE,
|
||||
FT_INVALID_CONTROL_REQUEST_DIRECTION,
|
||||
FT_INVALID_CONTROL_REQUEST_TYPE,
|
||||
FT_IO_PENDING,
|
||||
FT_IO_INCOMPLETE,
|
||||
FT_HANDLE_EOF,
|
||||
FT_BUSY,
|
||||
FT_NO_SYSTEM_RESOURCES,
|
||||
FT_DEVICE_LIST_NOT_READY,
|
||||
FT_DEVICE_NOT_CONNECTED,
|
||||
FT_INCORRECT_DEVICE_PATH,
|
||||
|
||||
FT_OTHER_ERROR,
|
||||
};
|
||||
|
||||
typedef ULONG FT_STATUS;
|
||||
#define FT_SUCCESS(status) ((status) == FT_OK)
|
||||
#define FT_FAILED(status) ((status) != FT_OK)
|
||||
|
||||
typedef enum _FT_PIPE_TYPE {
|
||||
FTPipeTypeControl,
|
||||
FTPipeTypeIsochronous,
|
||||
FTPipeTypeBulk,
|
||||
FTPipeTypeInterrupt
|
||||
} FT_PIPE_TYPE;
|
||||
|
||||
typedef struct _FT_COMMON_DESCRIPTOR {
|
||||
UCHAR bLength;
|
||||
UCHAR bDescriptorType;
|
||||
} FT_COMMON_DESCRIPTOR, *PFT_COMMON_DESCRIPTOR;
|
||||
|
||||
typedef struct _FT_DEVICE_DESCRIPTOR{
|
||||
UCHAR bLength;
|
||||
UCHAR bDescriptorType;
|
||||
USHORT bcdUSB;
|
||||
UCHAR bDeviceClass;
|
||||
UCHAR bDeviceSubClass;
|
||||
UCHAR bDeviceProtocol;
|
||||
UCHAR bMaxPacketSize0;
|
||||
USHORT idVendor;
|
||||
USHORT idProduct;
|
||||
USHORT bcdDevice;
|
||||
UCHAR iManufacturer;
|
||||
UCHAR iProduct;
|
||||
UCHAR iSerialNumber;
|
||||
UCHAR bNumConfigurations;
|
||||
} FT_DEVICE_DESCRIPTOR, *PFT_DEVICE_DESCRIPTOR;
|
||||
|
||||
typedef struct _FT_CONFIGURATION_DESCRIPTOR {
|
||||
UCHAR bLength;
|
||||
UCHAR bDescriptorType;
|
||||
USHORT wTotalLength;
|
||||
UCHAR bNumInterfaces;
|
||||
UCHAR bConfigurationValue;
|
||||
UCHAR iConfiguration;
|
||||
UCHAR bmAttributes;
|
||||
UCHAR MaxPower;
|
||||
} FT_CONFIGURATION_DESCRIPTOR, *PFT_CONFIGURATION_DESCRIPTOR;
|
||||
|
||||
typedef struct _FT_INTERFACE_DESCRIPTOR {
|
||||
UCHAR bLength;
|
||||
UCHAR bDescriptorType;
|
||||
UCHAR bInterfaceNumber;
|
||||
UCHAR bAlternateSetting;
|
||||
UCHAR bNumEndpoints;
|
||||
UCHAR bInterfaceClass;
|
||||
UCHAR bInterfaceSubClass;
|
||||
UCHAR bInterfaceProtocol;
|
||||
UCHAR iInterface;
|
||||
} FT_INTERFACE_DESCRIPTOR, *PFT_INTERFACE_DESCRIPTOR;
|
||||
|
||||
typedef struct _FT_STRING_DESCRIPTOR {
|
||||
UCHAR bLength;
|
||||
UCHAR bDescriptorType;
|
||||
WCHAR szString[256];
|
||||
} FT_STRING_DESCRIPTOR, *PFT_STRING_DESCRIPTOR;
|
||||
|
||||
typedef struct _FT_PIPE_INFORMATION {
|
||||
FT_PIPE_TYPE PipeType;
|
||||
UCHAR PipeId;
|
||||
USHORT MaximumPacketSize;
|
||||
UCHAR Interval;
|
||||
} FT_PIPE_INFORMATION, *PFT_PIPE_INFORMATION;
|
||||
|
||||
typedef struct _FT_SETUP_PACKET {
|
||||
UCHAR RequestType;
|
||||
UCHAR Request;
|
||||
USHORT Value;
|
||||
USHORT Index;
|
||||
USHORT Length;
|
||||
} FT_SETUP_PACKET, *PFT_SETUP_PACKET;
|
||||
|
||||
typedef enum _E_FT_NOTIFICATION_CALLBACK_TYPE {
|
||||
E_FT_NOTIFICATION_CALLBACK_TYPE_DATA,
|
||||
E_FT_NOTIFICATION_CALLBACK_TYPE_GPIO,
|
||||
E_FT_NOTIFICATION_CALLBACK_TYPE_INTERRUPT,
|
||||
} E_FT_NOTIFICATION_CALLBACK_TYPE;
|
||||
|
||||
typedef struct _FT_NOTIFICATION_CALLBACK_INFO_DATA {
|
||||
ULONG ulRecvNotificationLength;
|
||||
UCHAR ucEndpointNo;
|
||||
} FT_NOTIFICATION_CALLBACK_INFO_DATA;
|
||||
|
||||
typedef struct _FT_NOTIFICATION_CALLBACK_INFO_GPIO {
|
||||
BOOL bGPIO0;
|
||||
BOOL bGPIO1;
|
||||
} FT_NOTIFICATION_CALLBACK_INFO_GPIO;
|
||||
|
||||
typedef VOID(*FT_NOTIFICATION_CALLBACK)(PVOID pvCallbackContext,
|
||||
E_FT_NOTIFICATION_CALLBACK_TYPE eCallbackType, PVOID pvCallbackInfo);
|
||||
|
||||
//
|
||||
// Chip configuration - FlashEEPROMDetection
|
||||
//
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_ROM 0
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_MEMORY_NOTEXIST 1
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_CUSTOMDATA_INVALID 2
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_CUSTOMDATACHKSUM_INVALID 3
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_CUSTOM 4
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_GPIO_INPUT 5
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_GPIO_0 6
|
||||
#define CONFIGURATION_FLASH_ROM_BIT_GPIO_1 7
|
||||
|
||||
//
|
||||
// Chip configuration - Battery charging
|
||||
//
|
||||
#define CONFIGURATION_BATCHG_BIT_OFFSET_DCP 6 // Bit 6 and Bit 7
|
||||
#define CONFIGURATION_BATCHG_BIT_OFFSET_CDP 4 // Bit 4 and Bit 5
|
||||
#define CONFIGURATION_BATCHG_BIT_OFFSET_SDP 2 // Bit 2 and Bit 3
|
||||
#define CONFIGURATION_BATCHG_BIT_OFFSET_DEF 0 // Bit 0 and Bit 1
|
||||
#define CONFIGURATION_BATCHG_BIT_MASK 3 // 2 bits
|
||||
|
||||
//
|
||||
// Chip configuration - FIFO Clock Speed
|
||||
//
|
||||
typedef enum {
|
||||
CONFIGURATION_FIFO_CLK_100,
|
||||
CONFIGURATION_FIFO_CLK_66,
|
||||
CONFIGURATION_FIFO_CLK_50,
|
||||
CONFIGURATION_FIFO_CLK_40,
|
||||
} CONFIGURATION_FIFO_CLK;
|
||||
|
||||
//
|
||||
// Chip configuration - FIFO Mode
|
||||
//
|
||||
typedef enum {
|
||||
CONFIGURATION_FIFO_MODE_245,
|
||||
CONFIGURATION_FIFO_MODE_600,
|
||||
CONFIGURATION_FIFO_MODE_COUNT,
|
||||
} CONFIGURATION_FIFO_MODE;
|
||||
|
||||
//
|
||||
// Chip configuration - Channel Configuration
|
||||
//
|
||||
typedef enum {
|
||||
CONFIGURATION_CHANNEL_CONFIG_4,
|
||||
CONFIGURATION_CHANNEL_CONFIG_2,
|
||||
CONFIGURATION_CHANNEL_CONFIG_1,
|
||||
CONFIGURATION_CHANNEL_CONFIG_1_OUTPIPE,
|
||||
CONFIGURATION_CHANNEL_CONFIG_1_INPIPE,
|
||||
CONFIGURATION_CHANNEL_CONFIG_COUNT,
|
||||
} CONFIGURATION_CHANNEL_CONFIG;
|
||||
|
||||
//
|
||||
// Chip configuration - Optional Feature Support
|
||||
//
|
||||
typedef enum {
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEALL = 0,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLEBATTERYCHARGING = 1,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLECANCELSESSIONUNDERRUN = 2,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLENOTIFICATIONMESSAGE_INCH1 = 4,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLENOTIFICATIONMESSAGE_INCH2 = 8,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLENOTIFICATIONMESSAGE_INCH3 = 0x10,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLENOTIFICATIONMESSAGE_INCH4 = 0x20,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_ENABLENOTIFICATIONMESSAGE_INCHALL = 0x3C,
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEUNDERRUN_INCH1 = (0x1 << 6),
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEUNDERRUN_INCH2 = (0x1 << 7),
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEUNDERRUN_INCH3 = (0x1 << 8),
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEUNDERRUN_INCH4 = (0x1 << 9),
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEUNDERRUN_INCHALL = (0xF << 6),
|
||||
} CONFIGURATION_OPTIONAL_FEATURE_SUPPORT;
|
||||
|
||||
//
|
||||
// Chip configuration - Default values
|
||||
//
|
||||
#define CONFIGURATION_DEFAULT_VENDORID 0x0403
|
||||
#define CONFIGURATION_DEFAULT_PRODUCTID_600 0x601E
|
||||
#define CONFIGURATION_DEFAULT_PRODUCTID_601 0x601F
|
||||
#define CONFIGURATION_DEFAULT_POWERATTRIBUTES 0xE0
|
||||
#define CONFIGURATION_DEFAULT_POWERCONSUMPTION 0x60
|
||||
#define CONFIGURATION_DEFAULT_FIFOCLOCK \
|
||||
CONFIGURATION_FIFO_CLK_100
|
||||
#define CONFIGURATION_DEFAULT_FIFOMODE \
|
||||
CONFIGURATION_FIFO_MODE_600
|
||||
#define CONFIGURATION_DEFAULT_CHANNELCONFIG \
|
||||
CONFIGURATION_CHANNEL_CONFIG_4
|
||||
#define CONFIGURATION_DEFAULT_OPTIONALFEATURE \
|
||||
CONFIGURATION_OPTIONAL_FEATURE_DISABLEALL
|
||||
#define CONFIGURATION_DEFAULT_BATTERYCHARGING 0xE4
|
||||
#define CONFIGURATION_DEFAULT_BATTERYCHARGING_TYPE_DCP 0x3
|
||||
#define CONFIGURATION_DEFAULT_BATTERYCHARGING_TYPE_CDP 0x2
|
||||
#define CONFIGURATION_DEFAULT_BATTERYCHARGING_TYPE_SDP 0x1
|
||||
#define CONFIGURATION_DEFAULT_BATTERYCHARGING_TYPE_OFF 0x0
|
||||
#define CONFIGURATION_DEFAULT_FLASHDETECTION 0x0
|
||||
#define CONFIGURATION_DEFAULT_MSIOCONTROL 0x10800
|
||||
#define CONFIGURATION_DEFAULT_GPIOCONTROL 0x0
|
||||
|
||||
//
|
||||
//
|
||||
// Chip configuration structure
|
||||
//
|
||||
typedef struct {
|
||||
// Device Descriptor
|
||||
USHORT VendorID;
|
||||
USHORT ProductID;
|
||||
|
||||
// String Descriptors
|
||||
UCHAR StringDescriptors[128];
|
||||
|
||||
// Configuration Descriptor
|
||||
UCHAR Reserved;
|
||||
UCHAR PowerAttributes;
|
||||
USHORT PowerConsumption;
|
||||
|
||||
// Data Transfer Configuration
|
||||
UCHAR reserved;
|
||||
UCHAR FIFOClock;
|
||||
UCHAR FIFOMode;
|
||||
UCHAR ChannelConfig;
|
||||
|
||||
// Optional Feature Support
|
||||
USHORT OptionalFeatureSupport;
|
||||
UCHAR BatteryChargingGPIOConfig;
|
||||
UCHAR FlashEEPROMDetection; // Read-only
|
||||
|
||||
// MSIO and GPIO Configuration
|
||||
ULONG MSIO_Control;
|
||||
ULONG GPIO_Control;
|
||||
} FT_60XCONFIGURATION, *PFT_60XCONFIGURATION;
|
||||
|
||||
//
|
||||
// Device types
|
||||
//
|
||||
typedef enum _FT_DEVICE {
|
||||
FT_DEVICE_UNKNOWN = 3,
|
||||
FT_DEVICE_600 = 600,
|
||||
FT_DEVICE_601 = 601,
|
||||
FT_DEVICE_602 = 602,
|
||||
FT_DEVICE_603 = 603,
|
||||
} FT_DEVICE;
|
||||
|
||||
//
|
||||
// Device information
|
||||
//
|
||||
typedef enum _FT_FLAGS {
|
||||
FT_FLAGS_OPENED = 1,
|
||||
FT_FLAGS_HISPEED = 2,
|
||||
FT_FLAGS_SUPERSPEED = 4
|
||||
} FT_FLAGS;
|
||||
|
||||
typedef struct _FT_DEVICE_LIST_INFO_NODE {
|
||||
ULONG Flags; // FT_FLAGS
|
||||
ULONG Type;
|
||||
ULONG ID;
|
||||
DWORD LocId;
|
||||
char SerialNumber[32];
|
||||
char Description[32];
|
||||
FT_HANDLE ftHandle;
|
||||
} FT_DEVICE_LIST_INFO_NODE;
|
||||
|
||||
enum FT_GPIO_PULL {
|
||||
GPIO_PULL_50K_PD,
|
||||
GPIO_PULL_HIZ,
|
||||
GPIO_PULL_50K_PU,
|
||||
GPIO_PULL_DEFAULT = GPIO_PULL_50K_PD
|
||||
};
|
||||
|
||||
enum FT_PIPE_DIRECTION {
|
||||
FT_PIPE_DIR_IN,
|
||||
FT_PIPE_DIR_OUT,
|
||||
FT_PIPE_DIR_COUNT,
|
||||
};
|
||||
|
||||
struct FT_PIPE_TRANSFER_CONF {
|
||||
/* set to true PIPE is not used, default set to FALSE */
|
||||
BOOL fPipeNotUsed;
|
||||
|
||||
/* Enable non thread safe transfer to increase throughput, set this flag
|
||||
* if guarantee only single thread access the pipe at a time, default
|
||||
* set to FALSE */
|
||||
BOOL fNonThreadSafeTransfer;
|
||||
|
||||
/* Concurrent URB request number, 8 by default, set value < 2 to use
|
||||
* default value */
|
||||
BYTE bURBCount;
|
||||
|
||||
/* 256 by default, set value < 2 to use default value */
|
||||
WORD wURBBufferCount;
|
||||
|
||||
/* 32K by default, set value < 512 to use default value */
|
||||
DWORD dwURBBufferSize;
|
||||
|
||||
/* 1G by default, used by FT600 and FT601 only, set 0 to use
|
||||
* default value */
|
||||
DWORD dwStreamingSize;
|
||||
};
|
||||
|
||||
typedef struct _FT_TRANSFER_CONF {
|
||||
/* structure size: sizeof(FT_TRANSFER_CONF) */
|
||||
WORD wStructSize;
|
||||
|
||||
/* Please refer to struture FT_PIPE_TRANSFER_CONF */
|
||||
struct FT_PIPE_TRANSFER_CONF pipe[FT_PIPE_DIR_COUNT];
|
||||
|
||||
/* Stop reading next URB buffer if current buffer is not fully filled,
|
||||
* default set to FALSE */
|
||||
BOOL fStopReadingOnURBUnderrun;
|
||||
|
||||
/* Enable Bit Bang Mode */
|
||||
BOOL fBitBangMode;
|
||||
|
||||
/* Do not flush device side residue buffer after reopen the
|
||||
* device, default set to FALSE */
|
||||
BOOL fKeepDeviceSideBufferAfterReopen;
|
||||
} FT_TRANSFER_CONF;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**********************************************************************
|
||||
* Linux only APIs *
|
||||
**********************************************************************/
|
||||
|
||||
/* Set transfer parameters for each FIFO channel
|
||||
* Must be called before FT_Create is called. Need to be called again
|
||||
* after FT_Close(), otherwise default parameters will be used.
|
||||
*
|
||||
* Default value will be used for each FIFO channel if this function
|
||||
* is not been called. Please refer to structure defines for default
|
||||
* value.
|
||||
*
|
||||
* pConf: Please refer to structure FT_TRANSFER_CONF
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601 */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetTransferParams(
|
||||
FT_TRANSFER_CONF *pConf,
|
||||
DWORD dwFifoID);
|
||||
|
||||
/* ReadPipe with timeout
|
||||
*
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601
|
||||
* dwTimeoutInMs: timeout in milliseconds, 0 means return immediately
|
||||
* if no data */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ReadPipeEx(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucFifoID,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulBytesTransferred,
|
||||
DWORD dwTimeoutInMs);
|
||||
|
||||
/* WritePipe with timeout
|
||||
*
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601
|
||||
* dwTimeoutInMs: timeout in milliseconds, 0 means return immediately
|
||||
* if no data */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_WritePipeEx(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucFifoID,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulBytesTransferred,
|
||||
DWORD dwTimeoutInMs);
|
||||
|
||||
/* Get total unread buffer length in library's queue
|
||||
*
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601 */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetReadQueueStatus(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucFifoID,
|
||||
LPDWORD lpdwAmountInQueue);
|
||||
|
||||
/* Get total unsent buffer length in library's queue
|
||||
*
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601 */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetWriteQueueStatus(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucFifoID,
|
||||
LPDWORD lpdwAmountInQueue);
|
||||
|
||||
/* Read unsent buffer for OUT pipe
|
||||
* Set byBuffer to NULL first to close the pipe to get accurate buffer
|
||||
* length, allocate buffer with the length, then call this function
|
||||
* again with the allocated buffer to read out all buffers
|
||||
*
|
||||
* dwFifoID: FIFO interface ID. Valid values are 0-3 which represents
|
||||
* FIFO channel 1-4 for FT600 and FT601
|
||||
* byBuffer: User allocated buffer
|
||||
* lpdwBufferLength: Pointer to receive the size of buffer if byBuffer
|
||||
* is NULL. Size of buffer if byBuffer is not NULL. */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetUnsentBuffer(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucFifoID,
|
||||
BYTE *byBuffer,
|
||||
LPDWORD lpdwBufferLength);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetPipeTimeout(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucEndpoint,
|
||||
DWORD dwTimeoutInMs
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_CreateDeviceInfoList(
|
||||
LPDWORD lpdwNumDevs
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetDeviceInfoList(
|
||||
FT_DEVICE_LIST_INFO_NODE *ptDest,
|
||||
LPDWORD lpdwNumDevs
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ListDevices(
|
||||
PVOID pArg1,
|
||||
PVOID pArg2,
|
||||
DWORD Flags
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_Create(
|
||||
PVOID pvArg,
|
||||
DWORD dwFlags,
|
||||
FT_HANDLE *pftHandle
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_Close(
|
||||
FT_HANDLE ftHandle);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetVIDPID(
|
||||
FT_HANDLE ftHandle,
|
||||
PUSHORT puwVID,
|
||||
PUSHORT puwPID
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_WritePipe(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucEndpoint,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulBytesTransferred,
|
||||
LPOVERLAPPED pOverlapped
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ReadPipe(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucEndpoint,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulBytesTransferred,
|
||||
LPOVERLAPPED pOverlapped
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetOverlappedResult(
|
||||
FT_HANDLE ftHandle,
|
||||
LPOVERLAPPED pOverlapped,
|
||||
PULONG pulBytesTransferred,
|
||||
BOOL bWait
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_InitializeOverlapped(
|
||||
FT_HANDLE ftHandle,
|
||||
LPOVERLAPPED pOverlapped
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ReleaseOverlapped(
|
||||
FT_HANDLE ftHandle,
|
||||
LPOVERLAPPED pOverlapped
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetStreamPipe(
|
||||
FT_HANDLE ftHandle,
|
||||
BOOL bAllWritePipes,
|
||||
BOOL bAllReadPipes,
|
||||
UCHAR ucEndpoint,
|
||||
ULONG ulStreamSize
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ClearStreamPipe(
|
||||
FT_HANDLE ftHandle,
|
||||
BOOL bAllWritePipes,
|
||||
BOOL bAllReadPipes,
|
||||
UCHAR ucEndpoint
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_FlushPipe(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucEndpoint
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_AbortPipe(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucEndpoint
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetDeviceDescriptor(
|
||||
FT_HANDLE ftHandle,
|
||||
PFT_DEVICE_DESCRIPTOR ptDescriptor
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetConfigurationDescriptor(
|
||||
FT_HANDLE ftHandle,
|
||||
PFT_CONFIGURATION_DESCRIPTOR ptDescriptor
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetInterfaceDescriptor(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucInterfaceIndex,
|
||||
PFT_INTERFACE_DESCRIPTOR ptDescriptor
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetPipeInformation(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucInterfaceIndex,
|
||||
UCHAR ucEndpoint,
|
||||
PFT_PIPE_INFORMATION ptPipeInformation
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetStringDescriptor(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucStringIndex,
|
||||
PFT_STRING_DESCRIPTOR ptDescriptor
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetDescriptor(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucDescriptorType,
|
||||
UCHAR ucIndex,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulLengthTransferred
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ControlTransfer(
|
||||
FT_HANDLE ftHandle,
|
||||
FT_SETUP_PACKET tSetupPacket,
|
||||
PUCHAR pucBuffer,
|
||||
ULONG ulBufferLength,
|
||||
PULONG pulLengthTransferred
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetGPIO(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucDirection,
|
||||
UCHAR ucValue
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetGPIO(
|
||||
FT_HANDLE ftHandle,
|
||||
UCHAR ucDirection,
|
||||
FT_NOTIFICATION_CALLBACK pCallback,
|
||||
PVOID pvCallbackContext,
|
||||
USHORT uwCallbackLatency
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetNotificationCallback(
|
||||
FT_HANDLE ftHandle,
|
||||
FT_NOTIFICATION_CALLBACK pCallback,
|
||||
PVOID pvCallbackContext
|
||||
);
|
||||
|
||||
FTD3XX_API VOID WINAPI FT_ClearNotificationCallback(
|
||||
FT_HANDLE ftHandle
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetChipConfiguration(
|
||||
FT_HANDLE ftHandle,
|
||||
PVOID pvConfiguration
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetChipConfiguration(
|
||||
FT_HANDLE ftHandle,
|
||||
PVOID pvConfiguration
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetFirmwareVersion(
|
||||
FT_HANDLE ftHandle,
|
||||
PULONG pulFirmwareVersion
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ResetDevicePort(
|
||||
FT_HANDLE ftHandle
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_CycleDevicePort(
|
||||
FT_HANDLE ftHandle
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetDeviceInfoDetail(
|
||||
DWORD dwIndex,
|
||||
LPDWORD lpdwFlags,
|
||||
LPDWORD lpdwType,
|
||||
LPDWORD lpdwID,
|
||||
LPDWORD lpdwLocId,
|
||||
LPVOID lpSerialNumber,
|
||||
LPVOID lpDescription,
|
||||
FT_HANDLE *pftHandle
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_IsDevicePath(
|
||||
FT_HANDLE ftHandle,
|
||||
LPCSTR pucDevicePath
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetDriverVersion(
|
||||
FT_HANDLE ftHandle,
|
||||
LPDWORD lpdwVersion
|
||||
);
|
||||
|
||||
FTD3XX_API FT_STATUS WINAPI FT_GetLibraryVersion(
|
||||
LPDWORD lpdwVersion
|
||||
);
|
||||
|
||||
/* Enable GPIOs
|
||||
* Each bit represents one GPIO setting, GPIO0-GPIO2 from LSB to MSB
|
||||
*
|
||||
* dwMask: set bit to 0 to skip the GPIO, 1 to enable the GPIO
|
||||
* dwDirection: set bit to 0 for input, 1 for output */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_EnableGPIO(
|
||||
FT_HANDLE ftHandle,
|
||||
DWORD dwMask,
|
||||
DWORD dwDirection
|
||||
);
|
||||
|
||||
/* Set GPIO level
|
||||
* Each bit represents one GPIO setting, GPIO0-GPIO2 from LSB to MSB
|
||||
*
|
||||
* dwMask: set bit to 0 to skip the GPIO, 1 to enable the GPIO
|
||||
* dwDirection: set bit to 0 for low, 1 for high */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_WriteGPIO(
|
||||
FT_HANDLE ftHandle,
|
||||
DWORD dwMask,
|
||||
DWORD dwLevel
|
||||
);
|
||||
|
||||
/* Get level of all GPIOs
|
||||
* Each bit represents one GPIO setting, GPIO0-GPIO2, RD_N, OE_N from
|
||||
* LSB to MSB */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_ReadGPIO(
|
||||
FT_HANDLE ftHandle,
|
||||
DWORD *pdwData
|
||||
);
|
||||
|
||||
/* Set GPIO internal pull resisters
|
||||
* dwMask: Each bit represents one GPIO setting, GPIO0-GPIO2 from
|
||||
* LSB to MSB
|
||||
* dwPull: Each two bits represents one GPIO setting, GPIO0-GPIO2 from
|
||||
* LSB to MSB
|
||||
*
|
||||
* dwMask: set bit to 0 to skip the GPIO, 1 to enable the GPIO
|
||||
* dwPull: refer to enum FT_GPIO_PULL */
|
||||
FTD3XX_API FT_STATUS WINAPI FT_SetGPIOPull(
|
||||
FT_HANDLE ftHandle,
|
||||
DWORD dwMask,
|
||||
DWORD dwPull
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* end of include guard: FTD3XX_H_DKFTHSPV */
|
@ -1,51 +0,0 @@
|
||||
#ifndef ftdiThings_h
|
||||
#define ftdiThings_h
|
||||
|
||||
#include <mutex>
|
||||
#include <cstring>
|
||||
|
||||
#include "ftd3xx.h"
|
||||
#include "exception.hpp"
|
||||
|
||||
//FTDI Define
|
||||
|
||||
//#define FT601_CHIP_DESC "EVScope USB Transfer Chip"
|
||||
#define FT601_CHIP_DESC "FTDI SuperSpeed-FIFO Bridge"
|
||||
|
||||
//Flags
|
||||
#define DATATRANSFERTHREAD_FLAG_PRINT_TO_FILE (1 << 1)
|
||||
#define DATATRANSFERTHREAD_FLAG_TREAT_CHANNELS_AS_ONE (1 << 2)
|
||||
|
||||
#define FTDI_FLAG_READ_CHIP_TO_COMPUTER (0x82)
|
||||
|
||||
//global enums
|
||||
enum EVErrorCodes
|
||||
{
|
||||
EVErrorCodeInvalidValue,
|
||||
EVErrorCodeMallocFailed,
|
||||
EVErrorCodeServiceAlreadyRunning
|
||||
};
|
||||
|
||||
class EVSharedCache
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
EVSharedCache(unsigned int cacheSize, unsigned int numCaches);
|
||||
~EVSharedCache();
|
||||
|
||||
void SetWriteCache(const unsigned char* buff);
|
||||
void PartialSetWriteCache(const unsigned char* buff, unsigned int& idx, unsigned int size);
|
||||
int CopyReadCache(unsigned char* buff, unsigned int size);
|
||||
|
||||
private:
|
||||
std::mutex lock;
|
||||
unsigned char** caches;
|
||||
unsigned int cacheSize;
|
||||
unsigned int numCaches;
|
||||
|
||||
unsigned short writeCache;
|
||||
unsigned short readCache;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,18 +0,0 @@
|
||||
//
|
||||
// EVSuperSpeedFIFIOBridge.cpp
|
||||
// Scope
|
||||
//
|
||||
// Created by Daniel Vasile on 2019-07-30.
|
||||
// Copyright © 2019 EEVengers. All rights reserved.
|
||||
//
|
||||
|
||||
#include "EVSuperSpeedFIFOBridge.hpp"
|
||||
|
||||
/*
|
||||
* Used To Get A Handle To The FTDI SuperSpeed FIFO Bridge
|
||||
* @params
|
||||
* FT_HANDLE *device_handle - A pointer to a variable which will hold the inialized handle to the FIFO SuperSpeed Bridge
|
||||
*/
|
||||
void InitFTDISuperSpeedChip(FT_HANDLE *deviceHandle) {
|
||||
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
#include "EVTester.hpp"
|
||||
#include "EVMath.hpp"
|
||||
#include "dataTransferHandler.hpp"
|
||||
#include "processor.hpp"
|
||||
#include "trigger.hpp"
|
||||
#include "postProcessor.hpp"
|
||||
|
@ -1,290 +0,0 @@
|
||||
//
|
||||
// EVDataTransferThread.cpp
|
||||
// Scope
|
||||
//
|
||||
// Created by Daniel Vasile on 2019-07-30.
|
||||
// Copyright © 2019 EEVengers. All rights reserved.
|
||||
//
|
||||
|
||||
/*
|
||||
Class that runs all data transfers.
|
||||
From FTDI Chip -> DigitalProccesing
|
||||
From DigitalProcessing -> Electron App
|
||||
*/
|
||||
|
||||
#include "dataTransferHandler.hpp"
|
||||
#include "EVSuperSpeedFIFOBridge.hpp"
|
||||
|
||||
DataTransferHandler::DataTransferHandler(boost::lockfree::queue<buffer*, boost::lockfree::fixed_sized<false>> *outputQ)
|
||||
{
|
||||
pauseTransfer.store(true);
|
||||
stopTransfer.store(false);
|
||||
threadExists.store(false);
|
||||
|
||||
assert(outputQ != NULL);
|
||||
outputQueue = outputQ;
|
||||
|
||||
bytesRead = 0;
|
||||
|
||||
clearCount();
|
||||
|
||||
try {
|
||||
InitFTDISuperSpeedChip(&superSpeedFIFOBridgeHandle);
|
||||
|
||||
threadSharedCache = new EVSharedCache(BUFFER_SIZE,10);
|
||||
|
||||
CopyFunc = [](unsigned char* buff, unsigned int& idx, unsigned int size, void* obj){ return; };
|
||||
|
||||
} catch (EVException &e) {
|
||||
INFO << "DataTransferHandler:Constructor - " << e.what();
|
||||
assert(false);
|
||||
} catch (std::exception &e) {
|
||||
INFO << "DataTransferHandler:Constructor - " << e.what();
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
void DataTransferHandler::transferStart()
|
||||
{
|
||||
stopTransfer.store(false);
|
||||
}
|
||||
|
||||
void DataTransferHandler::transferStop()
|
||||
{
|
||||
stopTransfer.store(true);
|
||||
}
|
||||
|
||||
void DataTransferHandler::transferUnpause()
|
||||
{
|
||||
pauseTransfer.store(false);
|
||||
}
|
||||
|
||||
void DataTransferHandler::transferPause()
|
||||
{
|
||||
pauseTransfer.store(true);
|
||||
}
|
||||
|
||||
void DataTransferHandler::FTDITransferThread()
|
||||
{
|
||||
uint64_t bytesReadFromPipe = 0;
|
||||
uint64_t errorCode = 0;
|
||||
|
||||
// Outerloop
|
||||
while(!stopTransfer.load()) {
|
||||
//Innerloop
|
||||
while (!pauseTransfer.load()) {
|
||||
//read a chunck from the FTDI chip
|
||||
lock.lock();
|
||||
|
||||
asyncDataBuffers[0] = bufferAllocator.allocate(1);
|
||||
bufferAllocator.construct(asyncDataBuffers[0]);
|
||||
|
||||
assert(bytesReadFromPipe == BUFFER_SIZE);
|
||||
assert(errorCode == 0);
|
||||
if (errorCode != 0 || bytesReadFromPipe != BUFFER_SIZE) {
|
||||
throw EVException(errorCode,"DataTransferHandler:FTDITransferThread:FT_ReadPipe()");
|
||||
}
|
||||
|
||||
count++;
|
||||
outputQueue->push(asyncDataBuffers[0]);
|
||||
|
||||
bytesRead += bytesReadFromPipe;
|
||||
|
||||
assert(bytesReadFromPipe == BUFFER_SIZE);
|
||||
bytesReadFromPipe = 0;
|
||||
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
// Busy wait the for either unpausing or killing the thread
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(150));
|
||||
}
|
||||
|
||||
/*
|
||||
unsigned int asyncBytesRead[numAsyncBuffers];
|
||||
OVERLAPPED vOverlapped[numAsyncBuffers];
|
||||
|
||||
|
||||
for(unsigned int i = 0; i < numAsyncBuffers; i++) {
|
||||
errorCode = FT_InitializeOverlapped(superSpeedFIFOBridgeHandle,
|
||||
&(vOverlapped[i]));
|
||||
if(errorCode != FT_OK) {
|
||||
FT_Close(superSpeedFIFOBridgeHandle);
|
||||
ERROR << "FTDI Transfer Thread failed to init overlapped at index "
|
||||
<< i << ", error code " << errorCode;
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
errorCode = FT_SetStreamPipe(superSpeedFIFOBridgeHandle,
|
||||
false,
|
||||
false,
|
||||
0x82,
|
||||
BUFFER_SIZE);
|
||||
if(errorCode != FT_OK) {
|
||||
for(unsigned int i = 0; i < numAsyncBuffers;i++) {
|
||||
FT_ReleaseOverlapped(superSpeedFIFOBridgeHandle, vOverlapped + i);
|
||||
}
|
||||
FT_Close(superSpeedFIFOBridgeHandle);
|
||||
ERROR << "FTDI Transfer Thread failed to set stream pipe, error code "
|
||||
<< errorCode;
|
||||
assert(false);
|
||||
}
|
||||
|
||||
//queue up the inital batch
|
||||
for(unsigned int i = 0; i < numAsyncBuffers; i++) {
|
||||
errorCode = FT_ReadPipe(superSpeedFIFOBridgeHandle,
|
||||
0x82,
|
||||
asyncDataBuffers[i]->data,
|
||||
BUFFER_SIZE,
|
||||
&(asyncBytesRead[i]),
|
||||
vOverlapped + i);
|
||||
if(errorCode != (FT_OK | FT_IO_PENDING)) {
|
||||
for(unsigned int i = 0; i < numAsyncBuffers;i++) {
|
||||
FT_ReleaseOverlapped(superSpeedFIFOBridgeHandle, vOverlapped + i);
|
||||
}
|
||||
FT_Close(superSpeedFIFOBridgeHandle);
|
||||
ERROR << "FTDI Transfer Thread failed to queue up async read, error code "
|
||||
<< errorCode;
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int idx = 0;
|
||||
|
||||
// Outerloop
|
||||
while(!stopTransfer.load()) {
|
||||
//Innerloop
|
||||
while (!pauseTransfer.load()) {
|
||||
//wait for transfer to finish once this if statment is done, asyncDataBuffers[idx] has valid data
|
||||
errorCode = FT_GetOverlappedResult(superSpeedFIFOBridgeHandle,
|
||||
&vOverlapped[idx],
|
||||
&asyncBytesRead[idx],
|
||||
true);
|
||||
if (errorCode != FT_OK) {
|
||||
for(unsigned int i = 0; i < numAsyncBuffers;i++) {
|
||||
FT_ReleaseOverlapped(superSpeedFIFOBridgeHandle, vOverlapped + i);
|
||||
}
|
||||
FT_Close(superSpeedFIFOBridgeHandle);
|
||||
ERROR << "FTDI Transfer Thread failed to wait for overlapped result, error code "
|
||||
<< errorCode;
|
||||
assert(false);
|
||||
}
|
||||
|
||||
//re-submit the transfer request for continous streaming
|
||||
errorCode = FT_ReadPipe(superSpeedFIFOBridgeHandle,
|
||||
0x82,
|
||||
asyncDataBuffers[idx]->data,
|
||||
BUFFER_SIZE,
|
||||
&(asyncBytesRead[idx]),
|
||||
vOverlapped + idx);
|
||||
if (errorCode != (FT_OK | FT_IO_PENDING)) {
|
||||
for(unsigned int i = 0; i < numAsyncBuffers;i++) {
|
||||
FT_ReleaseOverlapped(superSpeedFIFOBridgeHandle, vOverlapped + i);
|
||||
}
|
||||
FT_Close(superSpeedFIFOBridgeHandle);
|
||||
ERROR << "FTDI Transfer Thread failed to wait for overlapped result, error code "
|
||||
<< errorCode;
|
||||
assert(false);
|
||||
}
|
||||
//submit data to shared cache
|
||||
lock.lock();
|
||||
CopyFunc(asyncDataBuffers[idx]->data,copyIdx, bytesReadFromPipe, (void*)this);
|
||||
lock.unlock();
|
||||
//Keep trace of bytes transfered
|
||||
bytesRead += asyncBytesRead[idx];
|
||||
//roll over
|
||||
if(++idx == numAsyncBuffers) {
|
||||
idx = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void DataTransferHandler::createThread()
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(lockThread);
|
||||
|
||||
// Check it thread created
|
||||
// TODO Check if the output fifo exists
|
||||
if (threadExists.load() == false) {
|
||||
// create new thread
|
||||
handlerThread = std::thread(&DataTransferHandler::FTDITransferThread, this);
|
||||
|
||||
// set thread exists flag
|
||||
threadExists.store(true);
|
||||
} else {
|
||||
// Thread already created
|
||||
throw EVException(10, "createThread(): Thread already created");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void DataTransferHandler::destroyThread()
|
||||
{
|
||||
const std::lock_guard<std::mutex> lock(lockThread);
|
||||
|
||||
if (threadExists.load() == true) {
|
||||
// Stop the transer and join thread
|
||||
stopHandler();
|
||||
handlerThread.join();
|
||||
|
||||
// clear thread exists flag
|
||||
threadExists.store(false);
|
||||
} else {
|
||||
// Thread does not exist
|
||||
throw EVException(10, "createThread(): thread does not exist");
|
||||
}
|
||||
}
|
||||
|
||||
void DataTransferHandler::stopHandler()
|
||||
{
|
||||
transferPause();
|
||||
transferStop();
|
||||
}
|
||||
|
||||
void DataTransferHandler::SetCopyFunc(CopyFuncs Func)
|
||||
{
|
||||
lock.lock();
|
||||
switch(Func) {
|
||||
case DataTransferFullBuffRead:
|
||||
CopyFunc = [](unsigned char* buff, unsigned int &idx, unsigned int size, void* obj)
|
||||
{ ((DataTransferHandler*)obj)->threadSharedCache->SetWriteCache(buff); };
|
||||
break;
|
||||
default:
|
||||
throw EVException(EVErrorCodeInvalidValue,"DataTransferHandler::SetCopyFunc()");
|
||||
break;
|
||||
}
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
DataTransferHandler::~DataTransferHandler()
|
||||
{
|
||||
transferPause();
|
||||
transferStop();
|
||||
|
||||
if(superSpeedFIFOBridgeHandle != 0)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t DataTransferHandler::getCount()
|
||||
{
|
||||
return count;
|
||||
}
|
||||
|
||||
uint32_t DataTransferHandler::getCountBytes()
|
||||
{
|
||||
return getCount() * BUFFER_SIZE;
|
||||
}
|
||||
|
||||
void DataTransferHandler::setCount(uint32_t newCount)
|
||||
{
|
||||
count = newCount;
|
||||
}
|
||||
|
||||
void DataTransferHandler::clearCount()
|
||||
{
|
||||
setCount(0);
|
||||
}
|
@ -1,96 +0,0 @@
|
||||
#include "ftdiThings.hpp"
|
||||
|
||||
//---------------EVSharecCache---------------
|
||||
|
||||
EVSharedCache::EVSharedCache(unsigned int cacheSize, unsigned int numCaches)
|
||||
{
|
||||
if(cacheSize == 0 || numCaches < 2) throw EVException(EVErrorCodeInvalidValue,"EVSharedCache::Constructor");
|
||||
|
||||
this->numCaches = numCaches;
|
||||
this->cacheSize = cacheSize;
|
||||
caches = (unsigned char**)malloc(sizeof(unsigned char**) * numCaches);
|
||||
for(unsigned int i = 0; i < numCaches; i++) {
|
||||
caches[i] = (unsigned char*)malloc(sizeof(unsigned char*) * cacheSize);
|
||||
}
|
||||
|
||||
this->readCache = 0;
|
||||
this->writeCache = 0;
|
||||
}
|
||||
|
||||
void EVSharedCache::SetWriteCache(const unsigned char* buff)
|
||||
{
|
||||
this->lock.lock();
|
||||
|
||||
//copy data
|
||||
for(unsigned int i = 0; i < cacheSize; i++)
|
||||
{
|
||||
caches[writeCache][i] = buff[i];
|
||||
}
|
||||
//set write cache to next cache
|
||||
if(writeCache == numCaches - 1){
|
||||
writeCache = 0;
|
||||
} else {
|
||||
writeCache++;
|
||||
}
|
||||
|
||||
this->lock.unlock();
|
||||
}
|
||||
|
||||
void EVSharedCache::PartialSetWriteCache(const unsigned char* buff, unsigned int &idx, unsigned int size) {
|
||||
if(idx + size > cacheSize) throw EVException(EVErrorCodeInvalidValue,"EVSharedCache::PartialSetWriteCache()");
|
||||
|
||||
this->lock.lock();
|
||||
|
||||
for(unsigned int i = 0; i < size; i++) {
|
||||
caches[writeCache][idx + i] = buff[i];
|
||||
}
|
||||
idx += size;
|
||||
|
||||
//when this buffer is full
|
||||
if(idx == cacheSize) {
|
||||
//move onto next buffer
|
||||
if(writeCache == numCaches - 1) {
|
||||
writeCache = 0;
|
||||
} else {
|
||||
writeCache++;
|
||||
}
|
||||
//reset the idx
|
||||
idx = 0;
|
||||
}
|
||||
|
||||
this->lock.unlock();
|
||||
}
|
||||
|
||||
int EVSharedCache::CopyReadCache(unsigned char* buff, unsigned int size)
|
||||
{
|
||||
//if there is no new data to return, exit function
|
||||
this->lock.lock();
|
||||
|
||||
if(this->writeCache == this->readCache) {
|
||||
this->lock.unlock();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(this->cacheSize < size) throw EVException(EVErrorCodeInvalidValue,"EVSharedCache::CopyReadCache");
|
||||
|
||||
//copy data
|
||||
memcpy(buff,caches[readCache],size);
|
||||
//advance to next cache
|
||||
if(readCache == numCaches - 1) {
|
||||
readCache = 0;
|
||||
} else {
|
||||
readCache++;
|
||||
}
|
||||
|
||||
this->lock.unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EVSharedCache::~EVSharedCache()
|
||||
{
|
||||
for(unsigned int i = 0; i < numCaches; i++) {
|
||||
free(caches[i]);
|
||||
}
|
||||
free(caches);
|
||||
}
|
Loading…
Reference in New Issue
Block a user