UartContext.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /*
  2. * UartContext.cpp
  3. *
  4. */
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <memory.h>
  9. #include <termio.h>
  10. #include <string>
  11. #include <sys/ioctl.h>
  12. #include "uart/UartContext.h"
  13. #include "utils/Log.h"
  14. #include "utils/ByteUtil.h"
  15. #include "base/strings.hpp"
  16. #include "storage/StoragePreferences.h"
  17. #include "service/BusinessConfig.h"
  18. #include "net/tcp_client5084.h"
  19. #define UART_DATA_BUF_LEN 16384 // 16KB
  20. extern int parseProtocol(const BYTE *pData, UINT len);
  21. extern void buildProtocolData(std::string info);
  22. static const char* getBaudRate(UINT baudRate) {
  23. struct {
  24. UINT baud;
  25. const char *pBaudStr;
  26. } baudInfoTab[] = {
  27. { B1200, "B1200" },
  28. { B2400, "B2400" },
  29. { B4800, "B4800" },
  30. { B9600, "B9600" },
  31. { B19200, "B19200" },
  32. { B38400, "B38400" },
  33. { B57600, "B57600" },
  34. { B115200, "B115200" },
  35. { B230400, "B230400" },
  36. { B460800, "B460800" },
  37. { B921600, "B921600" }
  38. };
  39. int len = sizeof(baudInfoTab) / sizeof(baudInfoTab[0]);
  40. for (int i = 0; i < len; ++i) {
  41. if (baudInfoTab[i].baud == baudRate) {
  42. return baudInfoTab[i].pBaudStr;
  43. }
  44. }
  45. return NULL;
  46. }
  47. UartContext::UartContext(int uartNum) :
  48. mIsOpen(false),
  49. mUartID(0),
  50. mDataBufPtr(NULL),
  51. mDataBufLen(0),
  52. mUartNumber(uartNum){
  53. }
  54. UartContext::~UartContext() {
  55. delete[] mDataBufPtr;
  56. closeUart();
  57. }
  58. static bool mUart1IsOpen = false;
  59. static bool mUart2IsOpen = false;
  60. static bool mUart3IsOpen = false;
  61. // 打开串口,pFileName为串口号,baudRate为波特率
  62. bool UartContext::openUart(const char *pFileName, UINT baudRate) {
  63. // LOGD("打开串口 串口号 = %s, 波特率 = %s\n", pFileName, getBaudRate(baudRate));
  64. mUartID = open(pFileName, O_RDWR|O_NOCTTY); // mUartID等于打开的串口
  65. if (mUartID <= 0) {
  66. mIsOpen = false;
  67. if (mUartNumber == 1) {
  68. mUart1IsOpen = false;
  69. }
  70. if (mUartNumber == 2) {
  71. mUart2IsOpen = false;
  72. }
  73. if (mUartNumber == 3) {
  74. mUart3IsOpen = false;
  75. }
  76. LOGD("uart%d open error", mUartNumber);
  77. } else {
  78. struct termios oldtio = { 0 };
  79. struct termios newtio = { 0 };
  80. tcgetattr(mUartID, &oldtio);
  81. newtio.c_cflag = baudRate|CS8|CLOCAL|CREAD;
  82. newtio.c_iflag = 0; // IGNPAR | ICRNL
  83. newtio.c_oflag = 0;
  84. newtio.c_lflag = 0; // ICANON
  85. newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
  86. newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
  87. tcflush(mUartID, TCIOFLUSH);
  88. tcsetattr(mUartID, TCSANOW, &newtio);
  89. // 设置为非阻塞 Set to non-blocking
  90. fcntl(mUartID, F_SETFL, O_NONBLOCK);
  91. mIsOpen = run("uart");
  92. if (!mIsOpen) {
  93. close(mUartID);
  94. mUartID = 0;
  95. }
  96. if (mUartNumber == 1) {
  97. mUart1IsOpen = true;
  98. }
  99. if (mUartNumber == 2) {
  100. mUart2IsOpen = true;
  101. }
  102. if (mUartNumber == 3) {
  103. mUart3IsOpen = true;
  104. }
  105. LOGD("openUart mIsOpen = %d\n", mIsOpen);
  106. }
  107. return mIsOpen;
  108. }
  109. void UartContext::closeUart() {
  110. LOGD("closeUart mIsOpen: %d...\n", mIsOpen);
  111. if (mIsOpen) {
  112. requestExit();
  113. close(mUartID);
  114. mUartID = 0;
  115. mIsOpen = false;
  116. }
  117. }
  118. // 发送串口消息
  119. bool UartContext::send(const BYTE *pData, UINT len) {
  120. // 这里是串口没有打开
  121. if (!mIsOpen) {
  122. LOGD("uart%d not opend", mUartNumber);
  123. return false;
  124. }
  125. int ret = write(mUartID, pData, len); // 这是发送串口消息
  126. if (ret != (int) len) { // 这里是发送失败
  127. LOGD("发送串口消息失败\n");
  128. return false;
  129. }
  130. std::string logInfo = " >>> ";
  131. for (int i = 0; i < len; ++i) {
  132. logInfo += base::format("%02x",pData[i]);
  133. }
  134. LOGD("%s",logInfo.c_str());
  135. // success
  136. LOGD("send Success\n");
  137. return true;
  138. }
  139. //UartContext* UartContext::getInstance() {
  140. // static UartContext sUC;
  141. // return &sUC;
  142. //}
  143. bool UartContext::readyToRun() {
  144. if (mDataBufPtr == NULL) {
  145. mDataBufPtr = new BYTE[UART_DATA_BUF_LEN];
  146. }
  147. if (mDataBufPtr == NULL) {
  148. closeUart();
  149. }
  150. return (mDataBufPtr != NULL);
  151. }
  152. static std::string sleepRevStr = "";
  153. static int sleepRevStrSize = 0;
  154. static unsigned char s433Buffer[5] = {0};
  155. static int s433BufferSize = 0;
  156. void dataProcessing(int ret, unsigned char* buffer, std::string serialType) {
  157. if (serialType == SerialType::ENABLE) {
  158. return;
  159. }
  160. else if (serialType == SerialType::PANEL_BUTTON) {
  161. if (buffer[0]==CMD_HEAD && buffer[ret-2] == CMD_END1 && buffer[ret-1] == CMD_END2){
  162. std::string revStr = "";
  163. //std::string logInfo = " <<< ";
  164. //依次将读取到的数据输出到日志
  165. for (int i = 0; i < ret; ++i) {
  166. if (i==0 || i==ret-1 || i==ret-2){
  167. continue;
  168. }
  169. revStr += buffer[i];
  170. }
  171. buildProtocolData(revStr);
  172. }
  173. }
  174. else if (serialType == SerialType::S433_BUTTON) {
  175. std::string revStr = "";
  176. if (ret < 5) {
  177. for (int i = 0; i < ret; ++i) {
  178. s433Buffer[s433BufferSize + i] = buffer[i];
  179. }
  180. s433BufferSize += ret;
  181. if (s433BufferSize < 5) {
  182. return;
  183. }
  184. else {
  185. s433BufferSize = 0;
  186. }
  187. }
  188. else {
  189. ByteUtil::copyUnsignedCharArray(buffer, s433Buffer, ret);
  190. }
  191. for (int i = 0; i < 5; ++i) {
  192. if (i == 0 || i == 4){
  193. continue;
  194. }
  195. char buf[1024];
  196. sprintf(buf, "%02x", s433Buffer[i]);
  197. revStr += buf;
  198. }
  199. // LOGD("revStr == %s", revStr.c_str());
  200. TcpClient::instance()->dataParse(revStr);
  201. return;
  202. }
  203. else if (serialType == SerialType::MULTIFUNCTIONAL_BUTTON) {
  204. return;
  205. }
  206. else if (serialType == SerialType::SLEEP_MATTRESS) {
  207. // cd0f0076000004643320504168100064e401a601e301a501df01a501e601a601e101a501e101a401e401a601e301a401e401a301e401a401e101a601e201a501e301a301e401a401e101a401df01a401e301a501e301a501e201a401e401a401e101a401e101a501e201a301e201a501e201a3015631303032dc
  208. char buf[1024] = {0};
  209. // 根据进入的数据来判断,如果进入的数据是cd开头
  210. if (buffer[0] == 0xcd && sleepRevStr == "") {
  211. // 循环拼接解析
  212. sleepRevStr = ByteUtil::convertToString(buffer, ret);
  213. // LOGD("sleepRevStr1 =======================> %s", sleepRevStr.c_str());
  214. // 如果进入的数据字节数大于4,就可以判断完整数据长度
  215. if (ret >= 4) {
  216. sprintf(buf, "%02x", buffer[3]);
  217. char *stop;
  218. sleepRevStrSize = strtol(buf, &stop, 16);
  219. }
  220. }
  221. else {
  222. if (sleepRevStr.substr(0, 2) == "cd") {
  223. for (int i = 0; i < ret; ++i) {
  224. sprintf(buf, "%02x", buffer[i]);
  225. sleepRevStr += buf;
  226. if (sleepRevStr.size() == 8) {
  227. char *stop;
  228. sleepRevStrSize = strtol(buf, &stop, 16);
  229. }
  230. }
  231. // LOGD("sleepRevStr2 =======================> %s", sleepRevStr.c_str());
  232. }
  233. }
  234. if (sleepRevStr.size() >= (sleepRevStrSize + 4) * 2) {
  235. TcpClient5084::instance()->dataParse(sleepRevStr);
  236. // 然后对数据进行处理
  237. sleepRevStr = "";
  238. sleepRevStrSize = 0;
  239. }
  240. }
  241. else if (serialType == SerialType::NFC) {
  242. if (buffer[0] == 0xfe && buffer[2] == 0x03) {
  243. if (buffer[1] == 0x08) {
  244. std::string revStr = "";
  245. for (int i = 0; i < ret; ++i) {
  246. if (i==0 || i==1 || i==2 || i==3 || i==4 || i==ret-1){
  247. continue;
  248. }
  249. char buf[1024];
  250. sprintf(buf, "%02x", buffer[i]);
  251. revStr += buf;
  252. }
  253. LOGD("revStr == %s", revStr.c_str());
  254. }
  255. }
  256. return;
  257. }
  258. }
  259. bool UartContext::threadLoop() {
  260. if (mIsOpen) {
  261. #if 0
  262. // 可能上一次解析后有残留数据,需要拼接起来
  263. int readNum = read(mUartID, mDataBufPtr + mDataBufLen, UART_DATA_BUF_LEN - mDataBufLen);
  264. if (readNum > 0) {
  265. mDataBufLen += readNum;
  266. // 解析协议
  267. int len = parseProtocol(mDataBufPtr, mDataBufLen);
  268. if ((len > 0) && (len < mDataBufLen)) {
  269. // 将未解析的数据移到头部
  270. memcpy(mDataBufPtr, mDataBufPtr + len, mDataBufLen - len);
  271. }
  272. mDataBufLen -= len;
  273. } else {
  274. Thread::sleep(50);
  275. }
  276. #else
  277. unsigned char buffer[1024] = {0};
  278. int ret = read(mUartID, buffer, sizeof(buffer));
  279. if (ret > 0) {
  280. if (mUartNumber == 2) {
  281. dataProcessing(ret, buffer, StoragePreferences::getString(STORE_LINUX_SERIAL2, "PANEL_BUTTON"));
  282. }
  283. else if (mUartNumber == 3) {
  284. dataProcessing(ret, buffer, StoragePreferences::getString(STORE_LINUX_SERIAL3, "ENABLE"));
  285. }
  286. else if (mUartNumber == 1) {
  287. dataProcessing(ret, buffer, StoragePreferences::getString(STORE_LINUX_SERIAL1, "ENABLE"));
  288. }
  289. } else {
  290. //没收到数据时,休眠50ms,防止过度消耗cpu
  291. usleep(1000 * 50);
  292. }
  293. #endif
  294. return true;
  295. }
  296. return false;
  297. }
  298. static UartContext* uart0 = NULL;
  299. static UartContext* uart1 = NULL;
  300. static UartContext* uart2 = NULL;
  301. static UartContext* uart3 = NULL;
  302. void UartContext::init() {
  303. // uart0 = new UartContext(UART_TTYS0);
  304. // uart0->openUart("/dev/ttyS0", B115200);
  305. uart1 = new UartContext(UART_TTYS1);
  306. uart1->openUart("/dev/ttyS1", B115200);
  307. LOGD("打开串口1");
  308. uart2 = new UartContext(UART_TTYS2);
  309. uart2->openUart("/dev/ttyS2", B115200);
  310. LOGD("打开串口2");
  311. uart3 = new UartContext(UART_TTYS3);
  312. uart3->openUart("/dev/ttyS3", B115200);
  313. LOGD("打开串口3");
  314. }
  315. void UartContext::destroy() {
  316. if (uart0) {
  317. delete uart0;
  318. uart0 = NULL;
  319. }
  320. if (uart1) {
  321. delete uart1;
  322. uart1 = NULL;
  323. }
  324. if (uart2) {
  325. delete uart1;
  326. uart2 = NULL;
  327. }
  328. if (uart3) {
  329. delete uart1;
  330. uart3 = NULL;
  331. }
  332. }
  333. bool UartContext::sendTo(int uart, const BYTE* pData, UINT len) {
  334. switch (uart) {
  335. case UART_TTYS0:
  336. return uart0->send(pData, len);
  337. case UART_TTYS1:
  338. return uart1->send(pData, len);
  339. case UART_TTYS2:
  340. return uart2->send(pData, len);
  341. case UART_TTYS3:
  342. return uart3->send(pData, len);
  343. }
  344. LOGD("无效的串口号");
  345. return false;
  346. }
  347. bool UartContext::Uart1IsOpen() {return mUart1IsOpen;}
  348. bool UartContext::Uart2IsOpen() {return mUart2IsOpen;}
  349. bool UartContext::Uart3IsOpen() {return mUart3IsOpen;}