buttonclickthread.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "buttonclickthread.h"
  2. #include <unistd.h>
  3. #include <linux/input.h>
  4. #include "pdu_ctrl.h"
  5. //#define USE_Gravity
  6. typedef enum { KEY_CODE_NONE = 0, KEY_CODE_USER0, KEY_CODE_USER1 } KeyCode;
  7. ButtonClickThread::ButtonClickThread(QObject *parent)
  8. :QThread(parent)
  9. {
  10. isRunning=true;
  11. nButtonSave[0]=0;nButtonSave[1]=0;nButtonSave[2]=0;nButtonSave[3]=0;nButtonSave[4]=0;
  12. bButtonSend[0]=0;bButtonSend[1]=0;bButtonSend[2]=0;
  13. nButtonTime[0]=0;nButtonTime[1]=0;nButtonTime[2]=0;
  14. qDebug()<<"bButtonSend"<<bButtonSend[0]<<bButtonSend[1]<<bButtonSend[2];
  15. qDebug()<<"nButtonTime"<<nButtonTime[0]<<nButtonTime[1]<<nButtonTime[2];
  16. pTimeAngle=QTime::currentTime();
  17. }
  18. ButtonClickThread::~ButtonClickThread()
  19. {
  20. isRunning=false;
  21. }
  22. void ButtonClickThread::InitConnect()
  23. {
  24. bool ret=connect(this,SIGNAL(signal_ButtonClick(int)),pdu_Ctrl::instance(),SLOT(slot_ClickBtn(int)));
  25. qDebug()<<"slot_ClickBtn ="<<ret;
  26. ret= connect(this,SIGNAL(signal_ButtonDoubleClick(int)),pdu_Ctrl::instance(),SLOT(slot_DClickBtn(int)));
  27. qDebug()<<"slot_DClickBtn ="<<ret;
  28. ret= connect(this,SIGNAL(signal_ButtonLongPressed(int)),pdu_Ctrl::instance(),SLOT(slot_LClickBtn(int)));
  29. qDebug()<<"slot_LClickBtn ="<<ret;
  30. ret= connect(this,SIGNAL(signal_ButtonClear(int)),pdu_Ctrl::instance(),SLOT(slot_BtnClear(int)));
  31. qDebug()<<"slot_BtnClear ="<<ret;
  32. ret= connect(this,SIGNAL(signal_AngleSet(int)),pdu_Ctrl::instance(),SLOT(slot_setAngel(int)));
  33. qDebug()<<"slot_setAngel ="<<ret;
  34. }
  35. void ButtonClickThread::run()
  36. {
  37. qDebug() <<"Start BtnThread";
  38. while (isRunning) {
  39. checkBtnStatus(GPIO_KEY1);
  40. checkBtnStatus(GPIO_KEY2);
  41. checkBtnStatus(GPIO_KEY3);
  42. checkBtnStatus(GPIO_KEY4);
  43. #ifdef USE_Gravity
  44. checkBtnStatus(GPIO_X);
  45. checkBtnStatus(GPIO_Y);
  46. #endif
  47. if(!nButtonSave[1]&&!nButtonSave[2]&&!nButtonSave[0])
  48. {
  49. msleep(2000);
  50. }else
  51. {
  52. //qDebug()<<"SaveDAta"<<nButtonSave[1]<<nButtonSave[2]<<nButtonSave[3];
  53. for(int i=0;i<5;i++)
  54. {
  55. ButtonDownTime(i,nButtonSave[i]);
  56. }
  57. }
  58. msleep(100);
  59. }
  60. }
  61. void ButtonClickThread::checkBtnStatus(int KeyID)
  62. {
  63. QString gpioPath=QString("/sys/class/gpio/gpio%1/value").arg(KeyID);
  64. QFile file(gpioPath);
  65. if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
  66. QTextStream in(&file);
  67. QString value = in.readLine();
  68. switch (KeyID) {
  69. case GPIO_KEY1:
  70. nButtonSave[0]=value.toInt();
  71. break;
  72. case GPIO_KEY2:
  73. nButtonSave[1]=value.toInt();
  74. break;
  75. case GPIO_KEY3:
  76. nButtonSave[2]=value.toInt();
  77. break;
  78. #ifdef USE_Gravity
  79. case GPIO_X:
  80. nButtonSave[3]=value.toInt();
  81. break;
  82. case GPIO_Y:
  83. nButtonSave[4]=value.toInt();
  84. break;
  85. #endif
  86. default:
  87. break;
  88. }
  89. //ButtonDownTime(KeyID,value.toInt());
  90. file.close();
  91. }
  92. }
  93. void ButtonClickThread::ButtonDownTime(int KeyID,int nValue)
  94. {
  95. switch (KeyID) {
  96. case 0:
  97. TimeSet(GPIO_KEY1,0,nValue);
  98. break;
  99. case 1:
  100. TimeSet(GPIO_KEY2,1,nValue);
  101. break;
  102. case 2:
  103. TimeSet(GPIO_KEY3,2,nValue);
  104. break;
  105. #ifdef USE_Gravity
  106. case 3:
  107. SaveSataus(nValue,m_nY);
  108. break;
  109. case 4:
  110. SaveSataus(m_nX,nValue);
  111. break;
  112. #endif
  113. default:
  114. break;
  115. }
  116. }
  117. void ButtonClickThread::TimeSet(int KeyID,int nIndex, int nValue)
  118. {
  119. //qDebug()<<"TimeSetStart:Key"<<KeyID<<"_Time:"<<nButtonTime[nIndex]<<"Send:"<<bButtonSend[nIndex];
  120. int* pTime=nButtonTime;
  121. //负数记录松开时长正数记录按下时长
  122. if(nValue==0)
  123. {//按下
  124. if(bButtonSend[nIndex])
  125. {//已发送不响应
  126. pTime[nIndex]=1;
  127. bButtonSend[nIndex]=true;
  128. }else
  129. {
  130. if(pTime[nIndex]<0)
  131. {//当前已松开此时判断为双击
  132. pTime[nIndex]=1;
  133. emit signal_ButtonDoubleClick(KeyID);
  134. qDebug()<<"bButtonSend"<<bButtonSend[0]<<bButtonSend[1]<<bButtonSend[2];
  135. qDebug()<<"nButtonTime"<<nButtonTime[0]<<nButtonTime[1]<<nButtonTime[2];
  136. bButtonSend[nIndex]=true;
  137. }else
  138. {
  139. pTime[nIndex]+=1;
  140. if(pTime[nIndex]>20)
  141. {
  142. //超过3秒判断为长按
  143. emit signal_ButtonLongPressed(KeyID);
  144. qDebug()<<"bButtonSend"<<bButtonSend[0]<<bButtonSend[1]<<bButtonSend[2];
  145. qDebug()<<"nButtonTime"<<nButtonTime[0]<<nButtonTime[1]<<nButtonTime[2];
  146. bButtonSend[nIndex]=true;
  147. }
  148. }
  149. }
  150. }else
  151. {//松开
  152. if(bButtonSend[nIndex])
  153. { //已发送过了松开重置
  154. pTime[nIndex]=0;
  155. bButtonSend[nIndex]=false;
  156. emit signal_ButtonClear(KeyID);
  157. qDebug()<<"bButtonSend"<<bButtonSend[0]<<bButtonSend[1]<<bButtonSend[2];
  158. qDebug()<<"nButtonTime"<<nButtonTime[0]<<nButtonTime[1]<<nButtonTime[2];
  159. }
  160. else
  161. {
  162. if(pTime[nIndex]>0)
  163. {//当前已点击此时松开可能为双击
  164. pTime[nIndex]=-1;
  165. }else if(pTime[nIndex]<-2)
  166. {//超过400毫秒未点击则判断无双击此时为单单击
  167. pTime[nIndex]=0;
  168. emit signal_ButtonClick(KeyID);
  169. qDebug()<<"bButtonSend"<<bButtonSend[0]<<bButtonSend[1]<<bButtonSend[2];
  170. qDebug()<<"nButtonTime"<<nButtonTime[0]<<nButtonTime[1]<<nButtonTime[2];
  171. bButtonSend[nIndex]=true;
  172. }else if(pTime[nIndex]<0)
  173. {//松开计时
  174. pTime[nIndex]-=1;
  175. }else
  176. {
  177. pTime[nIndex]=0;
  178. }
  179. }
  180. }
  181. //qDebug()<<"TimeSetEnd:Key"<<KeyID<<"_Time:"<<nButtonTime[nIndex]<<"Send:"<<bButtonSend[nIndex];
  182. }
  183. void ButtonClickThread::SaveSataus(int nX, int nY)
  184. {
  185. int nAngle=0;
  186. m_nX=nX;
  187. m_nY=nY;
  188. if(m_nX&&m_nY)nAngle=90;
  189. if(m_nX&&!m_nY)nAngle=0;
  190. if(!m_nX&&m_nY)nAngle=270;
  191. if(!m_nX&&!m_nY)nAngle=180;
  192. if(m_nSaveAngle!=nAngle)
  193. {
  194. QTime pNew=QTime::currentTime();
  195. int nSecTo=pTimeAngle.secsTo(pNew);
  196. if(nSecTo>=2)
  197. {
  198. m_nSaveAngle=nAngle;
  199. emit signal_AngleSet(m_nSaveAngle);
  200. pTimeAngle=pNew;
  201. }
  202. qDebug()<<"Check Angle:"<<nAngle<<" X="<<m_nX<<" Y="<<m_nY<<"SecTo:"<<nSecTo;
  203. }
  204. }