WS2822S
Diff: WS2822S.cpp
- Revision:
- 0:2fc093733833
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WS2822S.cpp Tue Mar 13 14:25:02 2018 +0000 @@ -0,0 +1,153 @@ +#include "WS2822S.h" + +// 送信データの先頭 +void WS2822S_Ctrl::PutDataHeader(int MTBP, int BREAK, int MAB, DigitalOut* pin, bool AddressHigh/* = false*/) +{ + *pin = 1; + wait_us(MTBP); + *pin = 0; + wait_us(BREAK); + *pin = 1; + wait_us(MAB); + + if(AddressHigh){ + AddressPin = 1; + } + // SC + DataPut8(0, pin); +} + +// 色情報かアドレス情報の先頭を出力する +void WS2822S_Ctrl::PutDataHeader(bool AddressHeader/*=false*/) +{ + if(!AddressHeader) + { + PutDataHeader(C_MTBP, C_BREAK, C_MAB, &ColorPin,true); + } + else + { + PutDataHeader(A_MTBP, A_BREAK, A_MAB, &AddressPin); + } +} + +// 8bitのデータを出力する +void WS2822S_Ctrl::DataPut8(uint8_t data, DigitalOut* pin) +{ + // MTBF + *pin = 0; + wait_us(2); + for(int i = 0; i < 8; i++) + { + if(((data & (1 << i)) != 0x00)){ + *pin = 1; + }else{ + *pin = 0; + } + + wait_us(1); + } + *pin = 1; + wait_us(STOP_BIT); +} + +// コンストラクタ +WS2822S_Ctrl::WS2822S_Ctrl(PinName ColorPinName, PinName AddressPinName, int PixcelNum) +: ColorPin(ColorPinName) +, AddressPin(AddressPinName) +, PixcelNum(PixcelNum) +{ + Display = new uint8_t*[PixcelNum]; + for(int i = 0; i < PixcelNum; i++) + { + Display[i] = new uint8_t[3]; + } +} +// デストラクタ +WS2822S_Ctrl::~WS2822S_Ctrl() +{ + for(int i = 0; i < PixcelNum; i++) + { + delete[] Display[i]; + } + delete[] Display; +} + +// 色を設定する +void WS2822S_Ctrl::SetColor(int pos, uint8_t R, uint8_t G, uint8_t B) +{ + if(pos >= PixcelNum || pos < 0) + { + return; + } + + Display[pos][0] = B; + Display[pos][1] = G; + Display[pos][2] = R; +} +// 設定された色を削除する +void WS2822S_Ctrl::ClearColor(uint8_t R, uint8_t G, uint8_t B) +{ + for(int i = 0; i < PixcelNum; i++) + { + SetColor(i,R,G,B); + } +} + +// 設定したデータを出力する +void WS2822S_Ctrl::OutputData() +{ + // B > G > R + PutDataHeader(); + AddressPin = 1; + for(int i = 0; i < PixcelNum; i++){ + DataPut8(Display[i][0], &ColorPin); + DataPut8(Display[i][1], &ColorPin); + DataPut8(Display[i][2], &ColorPin); + } +} + +void WS2822S_Ctrl::OutputAddress() +{ + ColorPin = 1; + PutDataHeader(true); + for(int tmp1 = 1; tmp1 < PixcelNum * 3; tmp1+=3){ + + //セットするアドレスを用意 32uS + uint8_t tmp_data = tmp1; + DataPut8(tmp_data, &AddressPin); + + //セットするアドレスによってブロック番号を変える + int temp = 0; + int channel = tmp1; + if (channel >= 0 && channel < 256) + temp = 0xF0;//0x0F; //0xF0 -> 0b11110000 -reverse order-> 0b00001111 -> 0x0F + else if (channel >= 256 && channel < 512) + temp = 0xE1;//0x87; //0xE1 -> 0b11100001 -reverse order-> 0b10000111 -> 0x87 + else if (channel >= 512 && channel < 768) + temp = 0xD2;//0x4B; //0xD2 -> 0b11010010 -reverse order-> 0b01001011 -> 0x4B + else if (channel >= 768 && channel < 1024) + temp = 0xC3;//0xC3; //0xC3 -> 0b11000011 -reverse order-> 0b11000011 -> 0xC3 + else if (channel >= 1024 && channel < 1280) + temp = 0xB4;//0x2D; //0xB4 -> 0b10110100 -reverse order-> 0b00101101 -> 0x2D + else if (channel >= 1280 && channel < 1536) + temp = 0xA5;//0xA5; //0xA5 -> 0b10100101 -reverse order-> 0b10100101 -> 0xA5 + else if (channel >= 1536 && channel < 1792) + temp = 0x96;//0x69; //0x96 -> 0b10010110 -reverse order-> 0b01101001 -> 0x69 + else if (channel >= 1792 && channel < 2048) + temp = 0x87;//0xE1; //0x87 -> 0b10000111 -reverse order-> 0b11100001 -> 0xE1 + else if (channel >= 2048 && channel < 2304) + temp = 0x78;//0x1E; //0x78 -> 0b01111000 -reverse order-> 0b00011110 -> 0x1E + else if (channel >= 2304 && channel < 2560) + temp = 0x69;//0x96; //0x69 -> 0b01101001 -reverse order-> 0b10010110 -> 0x96 + else if (channel >= 2560 && channel < 2816) + temp = 0x5A;//0x5A; //0x5A -> 0b01011010 -reverse order-> 0b01011010 -> 0x5A + else if (channel >= 2816 && channel < 3072) + temp = 0x4B;//0xD2; //0x4B -> 0b01001011 -reverse order-> 0b11010010 -> 0xD2 + DataPut8(temp, &AddressPin); + + //アドレス書込み時の定数 + tmp_data = 0xD2; + DataPut8(tmp_data, &AddressPin); + } + +} \ No newline at end of file