WS2822S
WS2822S.cpp@0:2fc093733833, 2018-03-13 (annotated)
- Committer:
- zgtk_r
- Date:
- Tue Mar 13 14:25:02 2018 +0000
- Revision:
- 0:2fc093733833
for WS2822S
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zgtk_r | 0:2fc093733833 | 1 | #include "WS2822S.h" |
zgtk_r | 0:2fc093733833 | 2 | |
zgtk_r | 0:2fc093733833 | 3 | // 送信データの先頭 |
zgtk_r | 0:2fc093733833 | 4 | void WS2822S_Ctrl::PutDataHeader(int MTBP, int BREAK, int MAB, DigitalOut* pin, bool AddressHigh/* = false*/) |
zgtk_r | 0:2fc093733833 | 5 | { |
zgtk_r | 0:2fc093733833 | 6 | *pin = 1; |
zgtk_r | 0:2fc093733833 | 7 | wait_us(MTBP); |
zgtk_r | 0:2fc093733833 | 8 | *pin = 0; |
zgtk_r | 0:2fc093733833 | 9 | wait_us(BREAK); |
zgtk_r | 0:2fc093733833 | 10 | *pin = 1; |
zgtk_r | 0:2fc093733833 | 11 | wait_us(MAB); |
zgtk_r | 0:2fc093733833 | 12 | |
zgtk_r | 0:2fc093733833 | 13 | if(AddressHigh){ |
zgtk_r | 0:2fc093733833 | 14 | AddressPin = 1; |
zgtk_r | 0:2fc093733833 | 15 | } |
zgtk_r | 0:2fc093733833 | 16 | // SC |
zgtk_r | 0:2fc093733833 | 17 | DataPut8(0, pin); |
zgtk_r | 0:2fc093733833 | 18 | } |
zgtk_r | 0:2fc093733833 | 19 | |
zgtk_r | 0:2fc093733833 | 20 | // 色情報かアドレス情報の先頭を出力する |
zgtk_r | 0:2fc093733833 | 21 | void WS2822S_Ctrl::PutDataHeader(bool AddressHeader/*=false*/) |
zgtk_r | 0:2fc093733833 | 22 | { |
zgtk_r | 0:2fc093733833 | 23 | if(!AddressHeader) |
zgtk_r | 0:2fc093733833 | 24 | { |
zgtk_r | 0:2fc093733833 | 25 | PutDataHeader(C_MTBP, C_BREAK, C_MAB, &ColorPin,true); |
zgtk_r | 0:2fc093733833 | 26 | } |
zgtk_r | 0:2fc093733833 | 27 | else |
zgtk_r | 0:2fc093733833 | 28 | { |
zgtk_r | 0:2fc093733833 | 29 | PutDataHeader(A_MTBP, A_BREAK, A_MAB, &AddressPin); |
zgtk_r | 0:2fc093733833 | 30 | } |
zgtk_r | 0:2fc093733833 | 31 | } |
zgtk_r | 0:2fc093733833 | 32 | |
zgtk_r | 0:2fc093733833 | 33 | // 8bitのデータを出力する |
zgtk_r | 0:2fc093733833 | 34 | void WS2822S_Ctrl::DataPut8(uint8_t data, DigitalOut* pin) |
zgtk_r | 0:2fc093733833 | 35 | { |
zgtk_r | 0:2fc093733833 | 36 | // MTBF |
zgtk_r | 0:2fc093733833 | 37 | *pin = 0; |
zgtk_r | 0:2fc093733833 | 38 | wait_us(2); |
zgtk_r | 0:2fc093733833 | 39 | for(int i = 0; i < 8; i++) |
zgtk_r | 0:2fc093733833 | 40 | { |
zgtk_r | 0:2fc093733833 | 41 | if(((data & (1 << i)) != 0x00)){ |
zgtk_r | 0:2fc093733833 | 42 | *pin = 1; |
zgtk_r | 0:2fc093733833 | 43 | }else{ |
zgtk_r | 0:2fc093733833 | 44 | *pin = 0; |
zgtk_r | 0:2fc093733833 | 45 | } |
zgtk_r | 0:2fc093733833 | 46 | |
zgtk_r | 0:2fc093733833 | 47 | wait_us(1); |
zgtk_r | 0:2fc093733833 | 48 | } |
zgtk_r | 0:2fc093733833 | 49 | *pin = 1; |
zgtk_r | 0:2fc093733833 | 50 | wait_us(STOP_BIT); |
zgtk_r | 0:2fc093733833 | 51 | } |
zgtk_r | 0:2fc093733833 | 52 | |
zgtk_r | 0:2fc093733833 | 53 | // コンストラクタ |
zgtk_r | 0:2fc093733833 | 54 | WS2822S_Ctrl::WS2822S_Ctrl(PinName ColorPinName, PinName AddressPinName, int PixcelNum) |
zgtk_r | 0:2fc093733833 | 55 | : ColorPin(ColorPinName) |
zgtk_r | 0:2fc093733833 | 56 | , AddressPin(AddressPinName) |
zgtk_r | 0:2fc093733833 | 57 | , PixcelNum(PixcelNum) |
zgtk_r | 0:2fc093733833 | 58 | { |
zgtk_r | 0:2fc093733833 | 59 | Display = new uint8_t*[PixcelNum]; |
zgtk_r | 0:2fc093733833 | 60 | for(int i = 0; i < PixcelNum; i++) |
zgtk_r | 0:2fc093733833 | 61 | { |
zgtk_r | 0:2fc093733833 | 62 | Display[i] = new uint8_t[3]; |
zgtk_r | 0:2fc093733833 | 63 | } |
zgtk_r | 0:2fc093733833 | 64 | } |
zgtk_r | 0:2fc093733833 | 65 | // デストラクタ |
zgtk_r | 0:2fc093733833 | 66 | WS2822S_Ctrl::~WS2822S_Ctrl() |
zgtk_r | 0:2fc093733833 | 67 | { |
zgtk_r | 0:2fc093733833 | 68 | for(int i = 0; i < PixcelNum; i++) |
zgtk_r | 0:2fc093733833 | 69 | { |
zgtk_r | 0:2fc093733833 | 70 | delete[] Display[i]; |
zgtk_r | 0:2fc093733833 | 71 | } |
zgtk_r | 0:2fc093733833 | 72 | delete[] Display; |
zgtk_r | 0:2fc093733833 | 73 | } |
zgtk_r | 0:2fc093733833 | 74 | |
zgtk_r | 0:2fc093733833 | 75 | // 色を設定する |
zgtk_r | 0:2fc093733833 | 76 | void WS2822S_Ctrl::SetColor(int pos, uint8_t R, uint8_t G, uint8_t B) |
zgtk_r | 0:2fc093733833 | 77 | { |
zgtk_r | 0:2fc093733833 | 78 | if(pos >= PixcelNum || pos < 0) |
zgtk_r | 0:2fc093733833 | 79 | { |
zgtk_r | 0:2fc093733833 | 80 | return; |
zgtk_r | 0:2fc093733833 | 81 | } |
zgtk_r | 0:2fc093733833 | 82 | |
zgtk_r | 0:2fc093733833 | 83 | Display[pos][0] = B; |
zgtk_r | 0:2fc093733833 | 84 | Display[pos][1] = G; |
zgtk_r | 0:2fc093733833 | 85 | Display[pos][2] = R; |
zgtk_r | 0:2fc093733833 | 86 | } |
zgtk_r | 0:2fc093733833 | 87 | // 設定された色を削除する |
zgtk_r | 0:2fc093733833 | 88 | void WS2822S_Ctrl::ClearColor(uint8_t R, uint8_t G, uint8_t B) |
zgtk_r | 0:2fc093733833 | 89 | { |
zgtk_r | 0:2fc093733833 | 90 | for(int i = 0; i < PixcelNum; i++) |
zgtk_r | 0:2fc093733833 | 91 | { |
zgtk_r | 0:2fc093733833 | 92 | SetColor(i,R,G,B); |
zgtk_r | 0:2fc093733833 | 93 | } |
zgtk_r | 0:2fc093733833 | 94 | } |
zgtk_r | 0:2fc093733833 | 95 | |
zgtk_r | 0:2fc093733833 | 96 | // 設定したデータを出力する |
zgtk_r | 0:2fc093733833 | 97 | void WS2822S_Ctrl::OutputData() |
zgtk_r | 0:2fc093733833 | 98 | { |
zgtk_r | 0:2fc093733833 | 99 | // B > G > R |
zgtk_r | 0:2fc093733833 | 100 | PutDataHeader(); |
zgtk_r | 0:2fc093733833 | 101 | AddressPin = 1; |
zgtk_r | 0:2fc093733833 | 102 | for(int i = 0; i < PixcelNum; i++){ |
zgtk_r | 0:2fc093733833 | 103 | DataPut8(Display[i][0], &ColorPin); |
zgtk_r | 0:2fc093733833 | 104 | DataPut8(Display[i][1], &ColorPin); |
zgtk_r | 0:2fc093733833 | 105 | DataPut8(Display[i][2], &ColorPin); |
zgtk_r | 0:2fc093733833 | 106 | } |
zgtk_r | 0:2fc093733833 | 107 | } |
zgtk_r | 0:2fc093733833 | 108 | |
zgtk_r | 0:2fc093733833 | 109 | void WS2822S_Ctrl::OutputAddress() |
zgtk_r | 0:2fc093733833 | 110 | { |
zgtk_r | 0:2fc093733833 | 111 | ColorPin = 1; |
zgtk_r | 0:2fc093733833 | 112 | PutDataHeader(true); |
zgtk_r | 0:2fc093733833 | 113 | for(int tmp1 = 1; tmp1 < PixcelNum * 3; tmp1+=3){ |
zgtk_r | 0:2fc093733833 | 114 | |
zgtk_r | 0:2fc093733833 | 115 | //セットするアドレスを用意 32uS |
zgtk_r | 0:2fc093733833 | 116 | uint8_t tmp_data = tmp1; |
zgtk_r | 0:2fc093733833 | 117 | DataPut8(tmp_data, &AddressPin); |
zgtk_r | 0:2fc093733833 | 118 | |
zgtk_r | 0:2fc093733833 | 119 | //セットするアドレスによってブロック番号を変える |
zgtk_r | 0:2fc093733833 | 120 | int temp = 0; |
zgtk_r | 0:2fc093733833 | 121 | int channel = tmp1; |
zgtk_r | 0:2fc093733833 | 122 | if (channel >= 0 && channel < 256) |
zgtk_r | 0:2fc093733833 | 123 | temp = 0xF0;//0x0F; //0xF0 -> 0b11110000 -reverse order-> 0b00001111 -> 0x0F |
zgtk_r | 0:2fc093733833 | 124 | else if (channel >= 256 && channel < 512) |
zgtk_r | 0:2fc093733833 | 125 | temp = 0xE1;//0x87; //0xE1 -> 0b11100001 -reverse order-> 0b10000111 -> 0x87 |
zgtk_r | 0:2fc093733833 | 126 | else if (channel >= 512 && channel < 768) |
zgtk_r | 0:2fc093733833 | 127 | temp = 0xD2;//0x4B; //0xD2 -> 0b11010010 -reverse order-> 0b01001011 -> 0x4B |
zgtk_r | 0:2fc093733833 | 128 | else if (channel >= 768 && channel < 1024) |
zgtk_r | 0:2fc093733833 | 129 | temp = 0xC3;//0xC3; //0xC3 -> 0b11000011 -reverse order-> 0b11000011 -> 0xC3 |
zgtk_r | 0:2fc093733833 | 130 | else if (channel >= 1024 && channel < 1280) |
zgtk_r | 0:2fc093733833 | 131 | temp = 0xB4;//0x2D; //0xB4 -> 0b10110100 -reverse order-> 0b00101101 -> 0x2D |
zgtk_r | 0:2fc093733833 | 132 | else if (channel >= 1280 && channel < 1536) |
zgtk_r | 0:2fc093733833 | 133 | temp = 0xA5;//0xA5; //0xA5 -> 0b10100101 -reverse order-> 0b10100101 -> 0xA5 |
zgtk_r | 0:2fc093733833 | 134 | else if (channel >= 1536 && channel < 1792) |
zgtk_r | 0:2fc093733833 | 135 | temp = 0x96;//0x69; //0x96 -> 0b10010110 -reverse order-> 0b01101001 -> 0x69 |
zgtk_r | 0:2fc093733833 | 136 | else if (channel >= 1792 && channel < 2048) |
zgtk_r | 0:2fc093733833 | 137 | temp = 0x87;//0xE1; //0x87 -> 0b10000111 -reverse order-> 0b11100001 -> 0xE1 |
zgtk_r | 0:2fc093733833 | 138 | else if (channel >= 2048 && channel < 2304) |
zgtk_r | 0:2fc093733833 | 139 | temp = 0x78;//0x1E; //0x78 -> 0b01111000 -reverse order-> 0b00011110 -> 0x1E |
zgtk_r | 0:2fc093733833 | 140 | else if (channel >= 2304 && channel < 2560) |
zgtk_r | 0:2fc093733833 | 141 | temp = 0x69;//0x96; //0x69 -> 0b01101001 -reverse order-> 0b10010110 -> 0x96 |
zgtk_r | 0:2fc093733833 | 142 | else if (channel >= 2560 && channel < 2816) |
zgtk_r | 0:2fc093733833 | 143 | temp = 0x5A;//0x5A; //0x5A -> 0b01011010 -reverse order-> 0b01011010 -> 0x5A |
zgtk_r | 0:2fc093733833 | 144 | else if (channel >= 2816 && channel < 3072) |
zgtk_r | 0:2fc093733833 | 145 | temp = 0x4B;//0xD2; //0x4B -> 0b01001011 -reverse order-> 0b11010010 -> 0xD2 |
zgtk_r | 0:2fc093733833 | 146 | DataPut8(temp, &AddressPin); |
zgtk_r | 0:2fc093733833 | 147 | |
zgtk_r | 0:2fc093733833 | 148 | //アドレス書込み時の定数 |
zgtk_r | 0:2fc093733833 | 149 | tmp_data = 0xD2; |
zgtk_r | 0:2fc093733833 | 150 | DataPut8(tmp_data, &AddressPin); |
zgtk_r | 0:2fc093733833 | 151 | } |
zgtk_r | 0:2fc093733833 | 152 | |
zgtk_r | 0:2fc093733833 | 153 | } |