From d2665aebd48c1ff1275551b06f85c51c4a38e2e8 Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Sat, 18 Jan 2014 22:22:10 +0000 Subject: [PATCH] Updated and addition of more tests for ws2812b control Former-commit-id: 57078dac71173b2cb203f644e4158e179161bf17 --- test/CMakeLists.txt | 3 +- test/TestNonInvWs2812b.cpp | 87 +++++++++++++-- test/TestNonUniformWs2812b.cpp | 186 +++++++++++++++++++++++++++++++++ test/TestUartHighSpeed.cpp | 3 +- 4 files changed, 269 insertions(+), 10 deletions(-) create mode 100644 test/TestNonUniformWs2812b.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b8bc6765..bd46d059 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -66,5 +66,6 @@ if(NOT APPLE AND UNIX) include_directories(/usr/include) add_executable(test_uartHighSpeed TestUartHighSpeed.cpp) - add_executable(test_nonInvWs2812b TestNonInvWs2812b.cpp) + add_executable(test_nonUniformWs2812b TestNonUniformWs2812b.cpp) + add_executable(test_nonInvWs2812b TestNonInvWs2812b.cpp) endif() diff --git a/test/TestNonInvWs2812b.cpp b/test/TestNonInvWs2812b.cpp index 05d60b39..269c9d27 100644 --- a/test/TestNonInvWs2812b.cpp +++ b/test/TestNonInvWs2812b.cpp @@ -4,6 +4,11 @@ #include #include +#include //Used for UART +#include //Used for UART +#include //Used for UART +#include + std::vector encode(const std::vector & data); void split(const uint8_t byte, uint8_t & out1, uint8_t & out2); uint8_t encode(const bool bit1, const bool bit2, const bool bit3); @@ -23,10 +28,41 @@ void print(uint8_t byte) } } +void printClockSignal(const std::vector & signal) +{ + bool prevBit = true; + bool nextBit = true; + + for (uint8_t byte : signal) + { + + for (int i=-1; i<9; ++i) + { + if (i == -1) // Start bit + nextBit = false; + else if (i == 8) // Stop bit + nextBit = true; + else + nextBit = byte & (1 << i); + + if (!prevBit && nextBit) + { + std::cout << ' '; + } + + if (nextBit) + std::cout << '1'; + else + std::cout << '0'; + + prevBit = nextBit; + } + } +} + int main() { - std::vector data(3, 0x55); - + const std::vector data(9, 0xff); std::vector encData = encode(data); for (uint8_t encByte : encData) @@ -36,7 +72,45 @@ int main() std::cout << " 1"; } std::cout << std::endl; + printClockSignal(encData); + std::cout << std::endl; + //OPEN THE UART +// int uart0_filestream = open("/dev/ttyAMA0", O_WRONLY | O_NOCTTY | O_NDELAY); + int uart0_filestream = open("/dev/ttyUSB0", O_WRONLY | O_NOCTTY | O_NDELAY); + if (uart0_filestream == -1) + { + //ERROR - CAN'T OPEN SERIAL PORT + printf("Error - Unable to open UART. Ensure it is not in use by another application\n"); + return -1; + } + + // Configure the port + struct termios options; + tcgetattr(uart0_filestream, &options); + options.c_cflag = B4000000 | CS8 | CLOCAL; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + + tcflush(uart0_filestream, TCIFLUSH); + tcsetattr(uart0_filestream, TCSANOW, &options); + + char c = getchar(); + + const int breakLength_ms = 1; + + encData = std::vector(128, 0x10); + + write(uart0_filestream, encData.data(), encData.size()); + + tcsendbreak(uart0_filestream, breakLength_ms); + + //tcdrain(uart0_filestream); +// res = write(uart0_filestream, encData.data(), encData.size()); +// (void)res; + + close(uart0_filestream); return 0; } @@ -96,19 +170,16 @@ std::vector encode(const std::vector & data) previousByte = nextByte; } + result.push_back(previousByte); + + return result; } void split(const uint8_t byte, uint8_t & out1, uint8_t & out2) { - print(byte); std::cout << " => "; - print(out2); std::cout << " => "; - out1 &= ~0x0F; out1 |= (byte & 0x0F) << 4; -// out2 &= ~0xF0; - print(out2); std::cout << " => "; out2 = (byte & 0xF0) >> 4; - print(out2); std::cout << std::endl; } uint8_t encode(const bool bit1, const bool bit2, const bool bit3) diff --git a/test/TestNonUniformWs2812b.cpp b/test/TestNonUniformWs2812b.cpp new file mode 100644 index 00000000..0a15339d --- /dev/null +++ b/test/TestNonUniformWs2812b.cpp @@ -0,0 +1,186 @@ + +// STL includes +#include +#include +#include + +#include //Used for UART +#include //Used for UART +#include //Used for UART +#include + +std::vector encode(const std::vector & data); +uint8_t encode(const bool bit1, const bool bit2, const bool bit3); + +void printClockSignal(const std::vector & signal) +{ + bool prevBit = true; + bool nextBit = true; + + for (uint8_t byte : signal) + { + + for (int i=-1; i<9; ++i) + { + if (i == -1) // Start bit + nextBit = true; + else if (i == 8) // Stop bit + nextBit = false; + else + nextBit = ~byte & (1 << i); + + if (!prevBit && nextBit) + { + std::cout << ' '; + } + + if (nextBit) + std::cout << '1'; + else + std::cout << '0'; + + prevBit = nextBit; + } + } +} + +int main() +{ + const std::vector white{0xff, 0xff, 0xff}; + const std::vector green{0xff, 0x00, 0x00}; + const std::vector red {0x00, 0xff, 0x00}; + const std::vector blue {0x00, 0x00, 0xff}; + const std::vector cyan {0xff, 0x00, 0xff}; + const std::vector mix {0x55, 0x55, 0x55}; + const std::vector black{0x00, 0x00, 0x00}; + const std::vector gray{0x01, 0x01, 0x01}; + +// printClockSignal(encode(mix));std::cout << std::endl; + + //OPEN THE UART +// int uart0_filestream = open("/dev/ttyAMA0", O_WRONLY | O_NOCTTY | O_NDELAY); + int uart0_filestream = open("/dev/ttyUSB0", O_WRONLY | O_NOCTTY | O_NDELAY); + if (uart0_filestream == -1) + { + //ERROR - CAN'T OPEN SERIAL PORT + printf("Error - Unable to open UART. Ensure it is not in use by another application\n"); + return -1; + } + + // Configure the port + struct termios options; + tcgetattr(uart0_filestream, &options); + options.c_cflag = B2500000 | CS8 | CLOCAL; + options.c_iflag = IGNPAR; + options.c_oflag = 0; + options.c_lflag = 0; + + tcflush(uart0_filestream, TCIFLUSH); + tcsetattr(uart0_filestream, TCSANOW, &options); + + { + getchar(); + const std::vector encGreenData = encode(green); + const std::vector encBlueData = encode(blue); + const std::vector encRedData = encode(red); + const std::vector encGrayData = encode(gray); + const std::vector encBlackData = encode(black); + + //std::cout << "Writing GREEN ("; printClockSignal(encode(green)); std::cout << ")" << std::endl; + const std::vector garbage {0x0f}; + write(uart0_filestream, garbage.data(), garbage.size()); + write(uart0_filestream, encGreenData.data(), encGreenData.size()); + write(uart0_filestream, encRedData.data(), encRedData.size()); + write(uart0_filestream, encBlueData.data(), encBlueData.size()); + write(uart0_filestream, encGrayData.data(), encGrayData.size()); + write(uart0_filestream, encBlackData.data(), encBlackData.size()); + } + { + getchar(); + const std::vector encData = encode(white); + std::cout << "Writing WHITE ("; printClockSignal(encode(white)); std::cout << ")" << std::endl; + const std::vector garbage {0x0f}; + write(uart0_filestream, garbage.data(), garbage.size()); + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(green); + std::cout << "Writing GREEN ("; printClockSignal(encode(green)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(red); + std::cout << "Writing RED ("; printClockSignal(encode(red)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(blue); + std::cout << "Writing BLUE ("; printClockSignal(encode(blue)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(cyan); + std::cout << "Writing CYAN? ("; printClockSignal(encode(cyan)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(mix); + std::cout << "Writing MIX ("; printClockSignal(encode(mix)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + } + { + getchar(); + const std::vector encData = encode(black); + std::cout << "Writing BLACK ("; printClockSignal(encode(black)); std::cout << ")" << std::endl; + write(uart0_filestream, encData.data(), encData.size()); + write(uart0_filestream, encData.data(), encData.size()); + write(uart0_filestream, encData.data(), encData.size()); + write(uart0_filestream, encData.data(), encData.size()); + } + + close(uart0_filestream); + + return 0; +} + +std::vector encode(const std::vector & data) +{ + std::vector result; + for (size_t iByte=0; iByte