This library is for the control of NJE-105/106. (which is the digital signage device made by Nagano Japan Radio Co., Ltd.)
Dependents: NJE10XCtrlSample TrainInfoSample
NJE10XCtrl.cpp@0:3aa62049d1de, 2010-11-14 (annotated)
- Committer:
- rinosh2
- Date:
- Sun Nov 14 15:56:52 2010 +0000
- Revision:
- 0:3aa62049d1de
- Child:
- 1:fb1109a73ce9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rinosh2 | 0:3aa62049d1de | 1 | #include "NJE10XCtrl.h" |
rinosh2 | 0:3aa62049d1de | 2 | |
rinosh2 | 0:3aa62049d1de | 3 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 4 | // Local funcs |
rinosh2 | 0:3aa62049d1de | 5 | |
rinosh2 | 0:3aa62049d1de | 6 | static bool myputc(Serial& port, int ch){ |
rinosh2 | 0:3aa62049d1de | 7 | while(!port.writeable()); |
rinosh2 | 0:3aa62049d1de | 8 | return port.putc(ch) != EOF; |
rinosh2 | 0:3aa62049d1de | 9 | } |
rinosh2 | 0:3aa62049d1de | 10 | |
rinosh2 | 0:3aa62049d1de | 11 | static bool myputs(Serial& port, const char* str, size_t len){ |
rinosh2 | 0:3aa62049d1de | 12 | while(len--){ |
rinosh2 | 0:3aa62049d1de | 13 | if(!myputc(port, *str++)) return false; |
rinosh2 | 0:3aa62049d1de | 14 | } |
rinosh2 | 0:3aa62049d1de | 15 | return true; |
rinosh2 | 0:3aa62049d1de | 16 | } |
rinosh2 | 0:3aa62049d1de | 17 | |
rinosh2 | 0:3aa62049d1de | 18 | static int myCheckMsg(const char*& msg, const char* buf, int size){ |
rinosh2 | 0:3aa62049d1de | 19 | if(msg) return strlen(msg); |
rinosh2 | 0:3aa62049d1de | 20 | msg = buf; |
rinosh2 | 0:3aa62049d1de | 21 | return size; |
rinosh2 | 0:3aa62049d1de | 22 | } |
rinosh2 | 0:3aa62049d1de | 23 | |
rinosh2 | 0:3aa62049d1de | 24 | static char GetAttr1Char(NJE10XCtrl::Attr1 a1){ |
rinosh2 | 0:3aa62049d1de | 25 | return (char(a1) & 3) + 'A'; |
rinosh2 | 0:3aa62049d1de | 26 | |
rinosh2 | 0:3aa62049d1de | 27 | } |
rinosh2 | 0:3aa62049d1de | 28 | |
rinosh2 | 0:3aa62049d1de | 29 | static char GetAttr2Char(NJE10XCtrl::Attr2 a2, NJE10XCtrl::Attr3 a3){ |
rinosh2 | 0:3aa62049d1de | 30 | const char A2[4] = {'A', 'E', 'I', 'W'}; |
rinosh2 | 0:3aa62049d1de | 31 | return A2[a2 & 3] + (a3 & 3); |
rinosh2 | 0:3aa62049d1de | 32 | } |
rinosh2 | 0:3aa62049d1de | 33 | |
rinosh2 | 0:3aa62049d1de | 34 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 35 | // NJE10XCtrl class |
rinosh2 | 0:3aa62049d1de | 36 | NJE10XCtrl::NJE10XCtrl(PinName tx_pin, PinName rx_pin) : m_port(tx_pin, rx_pin), m_size(0) { |
rinosh2 | 0:3aa62049d1de | 37 | m_port.baud(9600); |
rinosh2 | 0:3aa62049d1de | 38 | m_port.format(8, Serial::None, 1); |
rinosh2 | 0:3aa62049d1de | 39 | m_buf[0] = 0; |
rinosh2 | 0:3aa62049d1de | 40 | } |
rinosh2 | 0:3aa62049d1de | 41 | |
rinosh2 | 0:3aa62049d1de | 42 | NJE10XCtrl::~NJE10XCtrl(){ |
rinosh2 | 0:3aa62049d1de | 43 | } |
rinosh2 | 0:3aa62049d1de | 44 | |
rinosh2 | 0:3aa62049d1de | 45 | //////////////////////////////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 46 | // NJE10XCtrl private funcs |
rinosh2 | 0:3aa62049d1de | 47 | |
rinosh2 | 0:3aa62049d1de | 48 | const char NJE_DATA_HEAD[10] = { |
rinosh2 | 0:3aa62049d1de | 49 | 0x0d, 0x0a, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 |
rinosh2 | 0:3aa62049d1de | 50 | }; |
rinosh2 | 0:3aa62049d1de | 51 | |
rinosh2 | 0:3aa62049d1de | 52 | NJE10XCtrl::Status NJE10XCtrl::sendCmd(const char * str, int size){ |
rinosh2 | 0:3aa62049d1de | 53 | |
rinosh2 | 0:3aa62049d1de | 54 | char buf[128]; |
rinosh2 | 0:3aa62049d1de | 55 | memcpy(buf, str, size); |
rinosh2 | 0:3aa62049d1de | 56 | buf[size] = 0; |
rinosh2 | 0:3aa62049d1de | 57 | printf("Send '%s'\n", buf); |
rinosh2 | 0:3aa62049d1de | 58 | |
rinosh2 | 0:3aa62049d1de | 59 | if( myputs(m_port, NJE_DATA_HEAD, sizeof(NJE_DATA_HEAD)) && |
rinosh2 | 0:3aa62049d1de | 60 | myputs(m_port, str, size) && |
rinosh2 | 0:3aa62049d1de | 61 | myputs(m_port, NJE_DATA_HEAD, 2)){ |
rinosh2 | 0:3aa62049d1de | 62 | return S_OK; |
rinosh2 | 0:3aa62049d1de | 63 | } |
rinosh2 | 0:3aa62049d1de | 64 | return S_WRITE_FAILED; |
rinosh2 | 0:3aa62049d1de | 65 | } |
rinosh2 | 0:3aa62049d1de | 66 | |
rinosh2 | 0:3aa62049d1de | 67 | NJE10XCtrl::Status NJE10XCtrl::sendCmd(const char * str){ |
rinosh2 | 0:3aa62049d1de | 68 | return sendCmd(str, strlen(str)); |
rinosh2 | 0:3aa62049d1de | 69 | }; |
rinosh2 | 0:3aa62049d1de | 70 | |
rinosh2 | 0:3aa62049d1de | 71 | |
rinosh2 | 0:3aa62049d1de | 72 | // Append Str/Attr to the internal buffer /////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 73 | |
rinosh2 | 0:3aa62049d1de | 74 | NJE10XCtrl::Status NJE10XCtrl::add(char ch){ |
rinosh2 | 0:3aa62049d1de | 75 | // TODO: Escape command ( '~', "NJE...") |
rinosh2 | 0:3aa62049d1de | 76 | if(m_size >= MAX_DATA_BUF) return S_BUFFER_OVERFLOW; |
rinosh2 | 0:3aa62049d1de | 77 | m_buf[m_size++] = ch; |
rinosh2 | 0:3aa62049d1de | 78 | m_buf[m_size] = 0; |
rinosh2 | 0:3aa62049d1de | 79 | return S_OK; |
rinosh2 | 0:3aa62049d1de | 80 | } |
rinosh2 | 0:3aa62049d1de | 81 | |
rinosh2 | 0:3aa62049d1de | 82 | NJE10XCtrl::Status NJE10XCtrl::add(const char* str){ |
rinosh2 | 0:3aa62049d1de | 83 | while(*str) if(add(*str++)) return S_BUFFER_OVERFLOW; |
rinosh2 | 0:3aa62049d1de | 84 | return S_OK; |
rinosh2 | 0:3aa62049d1de | 85 | } |
rinosh2 | 0:3aa62049d1de | 86 | |
rinosh2 | 0:3aa62049d1de | 87 | NJE10XCtrl::Status NJE10XCtrl::addAttr(Attr1 a1, Attr2 a2, Attr3 a3){ |
rinosh2 | 0:3aa62049d1de | 88 | if( add('~') == S_OK && |
rinosh2 | 0:3aa62049d1de | 89 | add(GetAttr1Char(a1)) == S_OK && |
rinosh2 | 0:3aa62049d1de | 90 | add(GetAttr2Char(a2, a3)) == S_OK && |
rinosh2 | 0:3aa62049d1de | 91 | add('~') == S_OK) return S_OK; |
rinosh2 | 0:3aa62049d1de | 92 | |
rinosh2 | 0:3aa62049d1de | 93 | return S_BUFFER_OVERFLOW; // faile |
rinosh2 | 0:3aa62049d1de | 94 | } |
rinosh2 | 0:3aa62049d1de | 95 | NJE10XCtrl::Status NJE10XCtrl::clear(){ |
rinosh2 | 0:3aa62049d1de | 96 | m_size = 0; |
rinosh2 | 0:3aa62049d1de | 97 | m_buf[0] = 0; |
rinosh2 | 0:3aa62049d1de | 98 | return S_OK; |
rinosh2 | 0:3aa62049d1de | 99 | } |
rinosh2 | 0:3aa62049d1de | 100 | |
rinosh2 | 0:3aa62049d1de | 101 | |
rinosh2 | 0:3aa62049d1de | 102 | // Set/Del Normal message (01-99) ////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 103 | NJE10XCtrl::Status NJE10XCtrl::setMessage(int id, const char* msg, Attr1 a1, Attr2 a2, Attr3 a3){ |
rinosh2 | 0:3aa62049d1de | 104 | if(id < 1 || 99 < id) return S_INVALID_ID; |
rinosh2 | 0:3aa62049d1de | 105 | int len = myCheckMsg(msg, m_buf, m_size); |
rinosh2 | 0:3aa62049d1de | 106 | |
rinosh2 | 0:3aa62049d1de | 107 | const char CMD[] = "]011A110%02d01010000%c%c%s"; |
rinosh2 | 0:3aa62049d1de | 108 | const int CMD_SIZE = 8 + 2 + 8 + 2; |
rinosh2 | 0:3aa62049d1de | 109 | if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW; |
rinosh2 | 0:3aa62049d1de | 110 | |
rinosh2 | 0:3aa62049d1de | 111 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 112 | char c1 = GetAttr1Char(a1); |
rinosh2 | 0:3aa62049d1de | 113 | char c2 = GetAttr2Char(a2, a3); |
rinosh2 | 0:3aa62049d1de | 114 | |
rinosh2 | 0:3aa62049d1de | 115 | return sendCmd(buf, sprintf(buf, CMD, id, c1, c2, msg)); |
rinosh2 | 0:3aa62049d1de | 116 | } |
rinosh2 | 0:3aa62049d1de | 117 | NJE10XCtrl::Status NJE10XCtrl::delMessage(int id){ |
rinosh2 | 0:3aa62049d1de | 118 | if(id < 1 || 99 < id) return S_INVALID_ID; |
rinosh2 | 0:3aa62049d1de | 119 | |
rinosh2 | 0:3aa62049d1de | 120 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 121 | return sendCmd(buf, sprintf(buf, "]011A210%02d", id)); |
rinosh2 | 0:3aa62049d1de | 122 | } |
rinosh2 | 0:3aa62049d1de | 123 | |
rinosh2 | 0:3aa62049d1de | 124 | NJE10XCtrl::Status NJE10XCtrl::setTitle(const char* msg){ |
rinosh2 | 0:3aa62049d1de | 125 | int len = myCheckMsg(msg, m_buf, m_size); |
rinosh2 | 0:3aa62049d1de | 126 | |
rinosh2 | 0:3aa62049d1de | 127 | const char CMD[] = "]011A11000%s"; |
rinosh2 | 0:3aa62049d1de | 128 | const int CMD_SIZE = 8 + 2; |
rinosh2 | 0:3aa62049d1de | 129 | if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW; |
rinosh2 | 0:3aa62049d1de | 130 | |
rinosh2 | 0:3aa62049d1de | 131 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 132 | return sendCmd(buf, sprintf(buf, CMD, msg)); |
rinosh2 | 0:3aa62049d1de | 133 | } |
rinosh2 | 0:3aa62049d1de | 134 | NJE10XCtrl::Status NJE10XCtrl::delTitle(){ |
rinosh2 | 0:3aa62049d1de | 135 | return sendCmd("]011A210"); |
rinosh2 | 0:3aa62049d1de | 136 | } |
rinosh2 | 0:3aa62049d1de | 137 | |
rinosh2 | 0:3aa62049d1de | 138 | // Add/Clear free message ////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 139 | NJE10XCtrl::Status NJE10XCtrl::addFreeMessage(const char* msg){ |
rinosh2 | 0:3aa62049d1de | 140 | int len = myCheckMsg(msg, m_buf, m_size); |
rinosh2 | 0:3aa62049d1de | 141 | return sendCmd(msg, len); |
rinosh2 | 0:3aa62049d1de | 142 | } |
rinosh2 | 0:3aa62049d1de | 143 | NJE10XCtrl::Status NJE10XCtrl::clearFreeMessage(){ |
rinosh2 | 0:3aa62049d1de | 144 | return sendCmd("NJEM2"); |
rinosh2 | 0:3aa62049d1de | 145 | } |
rinosh2 | 0:3aa62049d1de | 146 | |
rinosh2 | 0:3aa62049d1de | 147 | NJE10XCtrl::Status NJE10XCtrl::addFreeCredit(const char* msg){ |
rinosh2 | 0:3aa62049d1de | 148 | int len = myCheckMsg(msg, m_buf, m_size); |
rinosh2 | 0:3aa62049d1de | 149 | |
rinosh2 | 0:3aa62049d1de | 150 | const char CMD[] = "NJEC1%s"; |
rinosh2 | 0:3aa62049d1de | 151 | const int CMD_SIZE = 5; |
rinosh2 | 0:3aa62049d1de | 152 | |
rinosh2 | 0:3aa62049d1de | 153 | if(len > MAX_DATA_BUF - CMD_SIZE) return S_BUFFER_OVERFLOW; |
rinosh2 | 0:3aa62049d1de | 154 | |
rinosh2 | 0:3aa62049d1de | 155 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 156 | return sendCmd(buf, sprintf(buf, CMD, msg)); |
rinosh2 | 0:3aa62049d1de | 157 | } |
rinosh2 | 0:3aa62049d1de | 158 | NJE10XCtrl::Status NJE10XCtrl::clearFreeCredit(){ |
rinosh2 | 0:3aa62049d1de | 159 | return sendCmd("NJEC2"); |
rinosh2 | 0:3aa62049d1de | 160 | } |
rinosh2 | 0:3aa62049d1de | 161 | |
rinosh2 | 0:3aa62049d1de | 162 | // NJE control commands //////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 163 | |
rinosh2 | 0:3aa62049d1de | 164 | NJE10XCtrl::Status NJE10XCtrl::reset(){ |
rinosh2 | 0:3aa62049d1de | 165 | return sendCmd("NJER"); |
rinosh2 | 0:3aa62049d1de | 166 | } |
rinosh2 | 0:3aa62049d1de | 167 | |
rinosh2 | 0:3aa62049d1de | 168 | // NJE show status ///////////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 169 | NJE10XCtrl::Status NJE10XCtrl::showTime(){ |
rinosh2 | 0:3aa62049d1de | 170 | return sendCmd("NJET"); |
rinosh2 | 0:3aa62049d1de | 171 | } |
rinosh2 | 0:3aa62049d1de | 172 | NJE10XCtrl::Status NJE10XCtrl::showContactCredit(){ |
rinosh2 | 0:3aa62049d1de | 173 | return sendCmd("NJEV1"); |
rinosh2 | 0:3aa62049d1de | 174 | } |
rinosh2 | 0:3aa62049d1de | 175 | NJE10XCtrl::Status NJE10XCtrl::showNewsCredit(){ |
rinosh2 | 0:3aa62049d1de | 176 | return sendCmd("NJEV2"); |
rinosh2 | 0:3aa62049d1de | 177 | } |
rinosh2 | 0:3aa62049d1de | 178 | NJE10XCtrl::Status NJE10XCtrl::showFreeCredit(){ |
rinosh2 | 0:3aa62049d1de | 179 | return sendCmd("NJEV3"); |
rinosh2 | 0:3aa62049d1de | 180 | } |
rinosh2 | 0:3aa62049d1de | 181 | |
rinosh2 | 0:3aa62049d1de | 182 | // NJED commands /////////////////////////////////////////////////////////////// |
rinosh2 | 0:3aa62049d1de | 183 | NJE10XCtrl::Status NJE10XCtrl::setOpMode(OpMode mode){ |
rinosh2 | 0:3aa62049d1de | 184 | const char CMD[] = "NJES02%02d"; |
rinosh2 | 0:3aa62049d1de | 185 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 186 | return sendCmd(buf, sprintf(buf, CMD, mode)); |
rinosh2 | 0:3aa62049d1de | 187 | } |
rinosh2 | 0:3aa62049d1de | 188 | |
rinosh2 | 0:3aa62049d1de | 189 | NJE10XCtrl::Status NJE10XCtrl::setFreeMode(FreeMode mode){ |
rinosh2 | 0:3aa62049d1de | 190 | const char CMD[] = "NJES05%02d"; |
rinosh2 | 0:3aa62049d1de | 191 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 192 | return sendCmd(buf, sprintf(buf, CMD, mode)); |
rinosh2 | 0:3aa62049d1de | 193 | } |
rinosh2 | 0:3aa62049d1de | 194 | |
rinosh2 | 0:3aa62049d1de | 195 | NJE10XCtrl::Status NJE10XCtrl::setScrollSpeed(ScrollSpeed speed){ |
rinosh2 | 0:3aa62049d1de | 196 | const char CMD[] = "NJES06%02d"; |
rinosh2 | 0:3aa62049d1de | 197 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 198 | return sendCmd(buf, sprintf(buf, CMD, speed)); |
rinosh2 | 0:3aa62049d1de | 199 | } |
rinosh2 | 0:3aa62049d1de | 200 | |
rinosh2 | 0:3aa62049d1de | 201 | NJE10XCtrl::Status NJE10XCtrl::setBlinkSpeed(BlinkSpeed speed){ |
rinosh2 | 0:3aa62049d1de | 202 | const char CMD[] = "NJES07%02d"; |
rinosh2 | 0:3aa62049d1de | 203 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 204 | return sendCmd(buf, sprintf(buf, CMD, speed)); |
rinosh2 | 0:3aa62049d1de | 205 | } |
rinosh2 | 0:3aa62049d1de | 206 | |
rinosh2 | 0:3aa62049d1de | 207 | NJE10XCtrl::Status NJE10XCtrl::setStopTime(int sec){ |
rinosh2 | 0:3aa62049d1de | 208 | if(sec > 10) return S_INVALID_PARAM; |
rinosh2 | 0:3aa62049d1de | 209 | const char CMD[] = "NJES08%02d"; |
rinosh2 | 0:3aa62049d1de | 210 | char buf[MAX_DATA_BUF]; |
rinosh2 | 0:3aa62049d1de | 211 | return sendCmd(buf, sprintf(buf, CMD, sec)); |
rinosh2 | 0:3aa62049d1de | 212 | } |