buttonclickthread.cpp 6.5 KB

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