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