carback.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "carback.h"
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <pthread.h>
  8. #include <unistd.h>
  9. #include <sys/ioctl.h>
  10. #include <QDebug>
  11. #include "BusinessLogic/ark_api.h"
  12. #include "ArkCar.h"
  13. #include <linux/input.h>
  14. #define CARBACK_IOCTL_BASE 0x9A
  15. #define CARBACK_IOCTL_SET_APP_READY _IO(CARBACK_IOCTL_BASE, 0)
  16. #define CARBACK_IOCTL_APP_ENTER_DONE _IO(CARBACK_IOCTL_BASE, 1)
  17. #define CARBACK_IOCTL_APP_EXIT_DONE _IO(CARBACK_IOCTL_BASE, 2)
  18. #define CARBACK_IOCTL_GET_STATUS _IOR(CARBACK_IOCTL_BASE, 3, int)
  19. #define CARBACK_IOCTL_DETECT_SIGNAL _IOR(CARBACK_IOCTL_BASE, 4, int)
  20. #define CARBACK_IOCTL_SET_CARBACK_ENTRY _IO(CARBACK_IOCTL_BASE, 5)
  21. #define CARBACK_IOCTL_SET_CARBACK_EXIT _IO(CARBACK_IOCTL_BASE, 6)
  22. static struct CarDeviceState device_state = {
  23. .reversing = ACS_Undefine,
  24. .reverse_detect = ACS_Undefine,
  25. .illlight = ACS_ILLLightOff,
  26. .brake = ACS_BrakeOff,
  27. };
  28. class CarbackPrivate
  29. {
  30. Q_DISABLE_COPY(CarbackPrivate)
  31. public:
  32. explicit CarbackPrivate(Carback* parent);
  33. ~CarbackPrivate();
  34. public:
  35. void carbackStatusChange(int status);
  36. void enableGrabInput(const bool flag);
  37. void detectSignalstatus(int status);
  38. int exitThread;
  39. int carbackFd;
  40. int m_InputFd;
  41. bool m_Flag;
  42. bool m_ArkUserInterfaceInit;
  43. private:
  44. Q_DECLARE_PUBLIC(Carback)
  45. Carback* const q_ptr;
  46. };
  47. Carback::Carback(QObject *parent) :
  48. QObject(parent),
  49. d_ptr(new CarbackPrivate(this))
  50. {
  51. }
  52. Carback::~Carback()
  53. {
  54. }
  55. static void* readCarbckStatus(void *arg)
  56. {
  57. CarbackPrivate *pThis = (CarbackPrivate *)arg;
  58. unsigned char data;
  59. static int reverse_detect_filter = 0;
  60. if (pThis->m_ArkUserInterfaceInit) {
  61. pThis->m_ArkUserInterfaceInit = false;
  62. if (ioctl(pThis->carbackFd, CARBACK_IOCTL_SET_APP_READY) != 0) {
  63. printf("CARBACK_IOCTL_SET_APP_READY fail.\n");
  64. }
  65. int data = 0;
  66. if (ioctl(pThis->carbackFd, CARBACK_IOCTL_GET_STATUS, &data) != 0) {
  67. printf("CARBACK_IOCTL_GET_STATUS fail.\n");
  68. data = 0;
  69. }
  70. enum ArkCarStatus status = (data > 0)? ACS_ReversingOn : ACS_ReversingOff;
  71. device_state.reversing = status;
  72. if (ACS_ReversingOn == status) {
  73. printf("REVERSING ON\n");
  74. arkapi_enter_carback();
  75. if (0 != ioctl(pThis->carbackFd, CARBACK_IOCTL_APP_ENTER_DONE)) {
  76. qDebug("ioctl CARBACK_IOCTL_APP_ENTER_DONE fail.");
  77. }
  78. pThis->carbackStatusChange(Carback::CBS_On);
  79. pThis->enableGrabInput(true);
  80. if (ioctl(pThis->carbackFd, CARBACK_IOCTL_DETECT_SIGNAL, &data) != 0) {
  81. printf("CARBACK_IOCTL_DETECT_SIGNAL fail.\n");
  82. data = 0;
  83. status = (0 == data)? ACS_NoDetectSignal: ACS_DetectSignal;
  84. if (device_state.reverse_detect != status) {
  85. device_state.reverse_detect = status;
  86. pThis->detectSignalstatus(data);
  87. printf("%s,%d, status = %d\n", __PRETTY_FUNCTION__, __LINE__, device_state.reverse_detect);
  88. }
  89. }
  90. } else {
  91. printf("REVERSING OFF\n");
  92. // arkapi_exit_carback();
  93. // if (0 != ioctl(pThis->carbackFd, CARBACK_IOCTL_APP_EXIT_DONE)) {
  94. // qDebug("ioctl CARBACK_IOCTL_APP_ENTER_DONE fail.");
  95. // }
  96. // pThis->carbackStatusChange(Carback::CBS_Off);
  97. // pThis->enableGrabInput(false);
  98. }
  99. }
  100. while (pThis->exitThread) {
  101. if (1 == read(pThis->carbackFd, &data, 1)) {
  102. if (ACS_Undefine != device_state.reversing) {
  103. enum ArkCarStatus status = (data > 0)? ACS_ReversingOn : ACS_ReversingOff;
  104. if (status != device_state.reversing) {
  105. device_state.reversing = status;
  106. reverse_detect_filter = 0;
  107. if (data == Carback::CBS_On) {
  108. printf("REVERSING ON\n");
  109. arkapi_enter_carback();
  110. if (0 != ioctl(pThis->carbackFd, CARBACK_IOCTL_APP_ENTER_DONE)) {
  111. qDebug("ioctl CARBACK_IOCTL_APP_ENTER_DONE fail.");
  112. }
  113. pThis->carbackStatusChange(Carback::CBS_On);
  114. pThis->enableGrabInput(true);
  115. device_state.reverse_detect = ACS_Undefine;
  116. }
  117. else if (data == Carback::CBS_Off) {
  118. printf("REVERSING OFF\n");
  119. arkapi_exit_carback();
  120. if (0 != ioctl(pThis->carbackFd, CARBACK_IOCTL_APP_EXIT_DONE)) {
  121. qDebug("ioctl CARBACK_IOCTL_APP_ENTER_DONE fail.");
  122. }
  123. pThis->carbackStatusChange(Carback::CBS_Off);
  124. pThis->enableGrabInput(false);
  125. if (pThis->m_Flag) {
  126. pThis->m_Flag = false;
  127. nice(-20);
  128. }
  129. }
  130. }
  131. }
  132. } else {
  133. printf("read reversing_fd error\n");
  134. perror("read");
  135. }
  136. if (ACS_ReversingOn == device_state.reversing) {
  137. if (pThis->carbackFd >= 0) {
  138. int data;
  139. if (ioctl(pThis->carbackFd, CARBACK_IOCTL_DETECT_SIGNAL, &data) != 0) {
  140. printf("CARBACK_IOCTL_DETECT_SIGNAL fail.\n");
  141. data = 0;
  142. }
  143. enum ArkCarStatus status = (0 == data)? ACS_NoDetectSignal: ACS_DetectSignal;
  144. if (device_state.reverse_detect != status) {
  145. if (reverse_detect_filter++ > 3) {
  146. reverse_detect_filter = 0;
  147. device_state.reverse_detect = status;
  148. pThis->detectSignalstatus(data);
  149. }
  150. }
  151. }
  152. }
  153. }
  154. }
  155. void Carback::initialize()
  156. {
  157. Q_D(Carback);
  158. pthread_t pthead;
  159. int ret = -1;
  160. d->carbackFd = open("/dev/carback", O_RDONLY);
  161. if (d->carbackFd < 0) {
  162. qDebug("open /dev/carback fail.");
  163. return;
  164. }
  165. if (0 != ioctl(d->carbackFd, CARBACK_IOCTL_SET_APP_READY)) {
  166. qDebug("ioctl CARBACK_IOCTL_SET_APP_READY fail.");
  167. return;
  168. }
  169. ret = pthread_create(&pthead, NULL,readCarbckStatus, d);
  170. if(ret != 0) {
  171. printf("pthread_create failed!\n");
  172. }
  173. }
  174. void Carback::localDeviceName()
  175. {
  176. Q_D(Carback);
  177. qDebug() << __PRETTY_FUNCTION__ <<__LINE__;
  178. }
  179. CarbackPrivate::CarbackPrivate(Carback *parent)
  180. : q_ptr(parent)
  181. {
  182. exitThread = 1;
  183. carbackFd = -1;
  184. m_InputFd = -1;
  185. m_Flag = true;
  186. m_ArkUserInterfaceInit =true;
  187. }
  188. CarbackPrivate::~CarbackPrivate()
  189. {
  190. }
  191. void CarbackPrivate::carbackStatusChange(int status){
  192. Q_Q(Carback);
  193. qDebug()<<"==[Carback::carbackStatusChange:status]=="<<status;
  194. emit q->onCarbackStatusChange(status);
  195. }
  196. void CarbackPrivate::detectSignalstatus(int status){
  197. Q_Q(Carback);
  198. qDebug()<<"==[Carback::detectSignalstatus:status]=="<<status;
  199. emit q->onDetectSignal(status);
  200. }
  201. void CarbackPrivate::enableGrabInput(const bool flag)
  202. {
  203. if (flag) {
  204. if (-1 == m_InputFd) {
  205. m_InputFd = open("/dev/input/event0", O_WRONLY);
  206. if (m_InputFd >= 0) {
  207. ioctl(m_InputFd, EVIOCGRAB, 1);
  208. }
  209. }
  210. } else {
  211. if (-1 != m_InputFd) {
  212. ioctl(m_InputFd, EVIOCGRAB, 0);
  213. close(m_InputFd);
  214. m_InputFd = -1;
  215. }
  216. }
  217. }