buttonclickthread.cpp 6.7 KB

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