Last active
August 10, 2019 00:47
-
-
Save apurvanandan1997/e4cb959d8c6bc4ff62027218068bfd19 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <thread> | |
#include <chrono> | |
#include "common.hpp" | |
static bool fifo_600mode; | |
static thread measure_thread; | |
static thread write_thread; | |
static thread read_thread; | |
static const int BUFFER_LEN = 32*1024; | |
static unsigned int check=0; | |
static char hex_val[16] = { '0', '1', '2', '3', '4', '5','6','7','8','9','A','B', 'C', 'D', 'E', 'F'}; | |
unsigned long long dec2bin(unsigned int c) | |
{ | |
int i = 0; | |
unsigned long long bin=0; | |
for(i = 7; i >= 0; i--){ | |
if((c & (1 << i)) != 0){ | |
bin=bin*10 + 1; | |
}else{ | |
bin=bin*10; | |
} | |
} | |
return bin; | |
} | |
static void write_test(FT_HANDLE handle) | |
{ | |
unique_ptr<uint8_t[]> buf(new uint8_t[BUFFER_LEN]); | |
while (!do_exit) { | |
for (uint8_t channel = 0; channel < out_ch_cnt; channel++) { | |
ULONG count = 0; | |
if (FT_OK != FT_WritePipeEx(handle, channel, | |
buf.get(), BUFFER_LEN, &count, 1000)) { | |
do_exit = true; | |
break; | |
} | |
tx_count += count; | |
} | |
} | |
printf("Write stopped\r\n"); | |
} | |
static void read_test(FT_HANDLE handle) | |
{ | |
//unsigned int buffer_value; | |
unique_ptr<uint8_t[]> buf(new uint8_t[BUFFER_LEN]); | |
while (!do_exit) { | |
for (uint8_t channel = 0; channel < in_ch_cnt; channel++) { | |
ULONG count = 0; | |
if (FT_OK != FT_ReadPipeEx(handle, channel, | |
buf.get(), BUFFER_LEN, &count, 1000)) { | |
do_exit = true; | |
break; | |
} | |
// Addition, comment for viewing data rates | |
else | |
{ | |
for (int k=0; k< BUFFER_LEN; k=k+4) { | |
//buffer_value = (uint32_t*)buf;//(unsigned int)buf[k+3]+(unsigned int)buf[k+2]*256+(unsigned int)buf[k+1]*65536+(unsigned int)buf[k]*16777216; | |
// if((check+1) != buffer_value) | |
// { printf("Error at %u ie %llu %llu %llu %llu \n", check, dec2bin(buf[k]), dec2bin(buf[k+1]), dec2bin(buf[k+2]), dec2bin(buf[k+3])); | |
// //for( int y =0; y< BUFFER_LEN ; y=y+4)printf("%llu %llu %llu %llu ", dec2bin(buf[y]), dec2bin(buf[y+1]), dec2bin(buf[y+2]), dec2bin(buf[y+3])); | |
// } | |
if((check + 1)!= buf[k+3] && (check!=255 or buf[k+3]!=0) )printf("Buffer Value : ie %c%c%c%c%c%c%c%c \n", hex_val[buf[k]/16], hex_val[buf[k]%16], hex_val[buf[k+1]/16], hex_val[buf[k+1]%16], hex_val[buf[k+2]/16], hex_val[buf[k+2]%16], hex_val[buf[k+3]/16], hex_val[buf[k+3]%16]); | |
// | |
//if(((buf[k+3] - buf[k+2]) != 68) && ((buf[k+2] - buf[k+3]) != 1880)) | |
check = buf[k+3]; | |
} | |
} | |
//Addition | |
rx_count += count; | |
} | |
} | |
printf("Read stopped\r\n"); | |
} | |
static void show_help(const char *bin) | |
{ | |
printf("Usage: %s <out channel count> <in channel count> [mode]\r\n", bin); | |
printf(" channel count: [0, 1] for 245 mode, [0-4] for 600 mode\r\n"); | |
printf(" mode: 0 = FT245 mode (default), 1 = FT600 mode\r\n"); | |
} | |
static void get_queue_status(HANDLE handle) | |
{ | |
for (uint8_t channel = 0; channel < out_ch_cnt; channel++) { | |
DWORD dwBufferred; | |
if (FT_OK != FT_GetUnsentBuffer(handle, channel, | |
NULL, &dwBufferred)) { | |
printf("Failed to get unsent buffer size\r\n"); | |
continue; | |
} | |
unique_ptr<uint8_t[]> p(new uint8_t[dwBufferred]); | |
printf("CH%d OUT unsent buffer size in queue:%u\r\n", | |
channel, dwBufferred); | |
if (FT_OK != FT_GetUnsentBuffer(handle, channel, | |
p.get(), &dwBufferred)) { | |
printf("Failed to read unsent buffer size\r\n"); | |
continue; | |
} | |
} | |
for (uint8_t channel = 0; channel < in_ch_cnt; channel++) { | |
DWORD dwBufferred; | |
if (FT_OK != FT_GetReadQueueStatus(handle, channel, &dwBufferred)) | |
continue; | |
printf("CH%d IN unread buffer size in queue:%u\r\n", | |
channel, dwBufferred); | |
} | |
} | |
static bool validate_arguments(int argc, char *argv[]) | |
{ | |
if (argc != 3 && argc != 4) | |
return false; | |
if (argc == 4) { | |
int val = atoi(argv[3]); | |
if (val != 0 && val != 1) | |
return false; | |
fifo_600mode = (bool)val; | |
} | |
out_ch_cnt = atoi(argv[1]); | |
in_ch_cnt = atoi(argv[2]); | |
if ((in_ch_cnt == 0 && out_ch_cnt == 0) || | |
in_ch_cnt > 4 || out_ch_cnt > 4) { | |
show_help(argv[0]); | |
return false; | |
} | |
return true; | |
} | |
int main(int argc, char *argv[]) | |
{ | |
get_version(); | |
if (!validate_arguments(argc, argv)) { | |
show_help(argv[0]); | |
return 1; | |
} | |
if (!get_device_lists(500)) | |
return 1; | |
if (!set_channel_config(fifo_600mode, CONFIGURATION_FIFO_CLK_100)) | |
return 1; | |
/* Must be called before FT_Create is called */ | |
turn_off_thread_safe(); | |
FT_HANDLE handle = NULL; | |
FT_Create(0, FT_OPEN_BY_INDEX, &handle); | |
if (!handle) { | |
printf("Failed to create device\r\n"); | |
return -1; | |
} | |
if (out_ch_cnt) | |
write_thread = thread(write_test, handle); | |
if (in_ch_cnt) | |
read_thread = thread(read_test, handle); | |
measure_thread = thread(show_throughput, handle); | |
register_signals(); | |
if (write_thread.joinable()) | |
write_thread.join(); | |
if (read_thread.joinable()) | |
read_thread.join(); | |
if (measure_thread.joinable()) | |
measure_thread.join(); | |
get_queue_status(handle); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment