usb_application_switch.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "core/config.h"
  2. #include "usbapp/usb_application_switch.h"
  3. #include "usb/usb_bridge.h"
  4. #include "usb/usb_config.h"
  5. #include "usbd_vendor.h"
  6. #if CONFIG_NFMBASECLASS
  7. #include "app/nfm/nfm_base.h"
  8. #elif CONFIG_KEYSW
  9. #include "drivers/keycontrol/keycontrol.h"
  10. #endif
  11. #define PROTO_REQ_GET_KEY_STAT 0x04 // ñ÷èòàòü ñîñòîÿíèå êëþ÷åé
  12. #define PROTO_REQ_SET_KEY_STAT 0x05 // çàïèñàòü ñîñòîÿíèå êëþ÷åé
  13. #define PROTO_REQ_GET_KEY_STAT2 0xF0 // ïðî÷åñòü óïðàâëÿþùèé êîä âûäàííûé íà êëþ÷è
  14. #define PROTO_REQ_AMP_KEY_STAT 0x05 // Çàïèñàòü ñîñòîÿíèå óñèëèòåëåé
  15. #define PROTO_REQ_FILT_KEY_STAT 0x0C // Çàïèñàòü ñîñòîÿíèå ôèëüòðîâ
  16. #define PROTO_REQ_AMP_KEY_READ 0x0D // Ñ÷èòàòü ñîñòîÿíèå óñèëèòåëåé
  17. #define PROTO_REQ_FILT_KEY_READ 0x0E // Ñ÷èòàòü ñîñòîÿíèå ôèëüòðîâ
  18. static int8_t fSwitchAppInit();
  19. static int8_t fSwitchAppDeInit();
  20. static void fSwitchAppReset();
  21. static bool fSwitchAppSetup( const tUSBSetupPacket_t * pSetup, bool bFirstStage, bool success );
  22. static size_t fSwitchAppControlRx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * rx, size_t idx, size_t bytesRemaining );
  23. static size_t fSwitchAppControlTx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * tx, size_t idx, size_t bytesRemaining );
  24. const sUSBAppEntry_Control_t usbapplication_ACM_planarproto_switch = {
  25. .fUsbInit = fSwitchAppInit,
  26. .fUsbDeInit = fSwitchAppDeInit,
  27. .fUsbSetup = fSwitchAppSetup,
  28. .fUsbCtlEpRx = fSwitchAppControlRx,
  29. .fUsbCtlEpTx = fSwitchAppControlTx,
  30. .fResetEvent = fSwitchAppReset,
  31. };
  32. static int8_t fSwitchAppInit()
  33. {
  34. return 0;
  35. }
  36. static int8_t fSwitchAppDeInit()
  37. {
  38. return 0;
  39. }
  40. static void fSwitchAppReset()
  41. {
  42. }
  43. static bool fSwitchAppSetup( const tUSBSetupPacket_t * pSetup, bool bFirstStage, bool success )
  44. {
  45. switch( pSetup->bRequest )
  46. {
  47. case PROTO_REQ_GET_KEY_STAT2:
  48. case PROTO_REQ_GET_KEY_STAT:
  49. {
  50. return true;
  51. }
  52. break;
  53. case PROTO_REQ_AMP_KEY_STAT:
  54. {
  55. eNFMAmpState_t state = (eNFMAmpState_t)pSetup->wValue;
  56. if( ! NFMClass->methods.checkAmpStateAvailable( state ))
  57. {
  58. return false; // Key State unavailable in this device
  59. }
  60. else if( ! NFMClass->methods.keyStatesMethods.setAmpStateCommon( state ))
  61. {
  62. return false; // Key Switch Error
  63. }
  64. return true;
  65. }break;
  66. case PROTO_REQ_FILT_KEY_STAT:
  67. {
  68. eNFMFiltState_t state = (eNFMFiltState_t)pSetup->wValue;
  69. if( ! NFMClass->methods.checkFiltStateAvailable( state ))
  70. {
  71. return false; // Key State unavailable in this device
  72. }
  73. else if( ! NFMClass->methods.keyStatesMethods.setFiltStateCommon( state ))
  74. {
  75. return false; // Key Switch Error
  76. }
  77. return true;
  78. }break;
  79. case PROTO_REQ_AMP_KEY_READ:
  80. {
  81. return true;
  82. }break;
  83. case PROTO_REQ_FILT_KEY_READ:
  84. {
  85. return true;
  86. }break;
  87. // #if CONFIG_NFMBASECLASS
  88. // uint32_t dwCode = (((uint32_t)pSetup->wIndex)<<16ul) | (uint32_t)pSetup->wValue;
  89. // return NFMClass->methods.keyStatesMethods.setKeyStateLegacy( dwCode );
  90. // #elif CONFIG_KEYSW
  91. // #error Ïðîãðàììà îòïðàâëÿåò êîä â âèäå wIndex wValue
  92. // tKeySwitchState_t state = KEYSWITCH_LEGACYSTATE_2_STATE( pSetup->wValue );
  93. // return KeySwitchHandle.SetKeyState( state );
  94. // #else
  95. // return false;
  96. // #endif
  97. }
  98. return false;
  99. }
  100. static size_t fSwitchAppControlRx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * rx, size_t idx, size_t bytesRemaining )
  101. {
  102. return 0;
  103. }
  104. static size_t fSwitchAppControlTx( const tUSBSetupPacket_t * pSetup, sUSBTransfer_t * tx, size_t idx, size_t bytesRemaining )
  105. {
  106. switch( pSetup->bRequest )
  107. {
  108. #if CONFIG_NFMBASECLASS
  109. case PROTO_REQ_GET_KEY_STAT2: // read the raw lowlevel control code
  110. {
  111. if( 0 == idx && sizeof(uint32_t) == bytesRemaining )
  112. {
  113. uint32_t code = NFMClass->methods.keyStatesMethods.getRawKeyControlCode();
  114. usb_push_transfer( tx, &code, sizeof( code ) );
  115. }
  116. }
  117. break;
  118. case PROTO_REQ_GET_KEY_STAT:
  119. {
  120. if( 0 == idx && sizeof(uint16_t) == bytesRemaining )
  121. {
  122. uint16_t lstate = 0;
  123. uint32_t state = 0;
  124. if( NFMClass->methods.keyStatesMethods.getKeyStateLegacy( &state ) )
  125. {
  126. lstate = (uint16_t)state; // in 2-port ACM only lower 16-bit are used
  127. usb_push_transfer( tx, &lstate, sizeof( lstate ) );
  128. }
  129. }
  130. }
  131. break;
  132. case PROTO_REQ_AMP_KEY_READ:
  133. {
  134. if( 0 == idx && sizeof(uint16_t) == bytesRemaining )
  135. {
  136. uint16_t currentState = (uint16_t)NFMClass->methods.keyStatesMethods.getAmpStateCommon();
  137. usb_push_transfer( tx, &currentState, sizeof( currentState ) );
  138. }
  139. }
  140. break;
  141. case PROTO_REQ_FILT_KEY_READ:
  142. {
  143. if( 0 == idx && sizeof(uint16_t) == bytesRemaining )
  144. {
  145. uint16_t currentState = (uint16_t)NFMClass->methods.keyStatesMethods.getFiltStateCommon();
  146. usb_push_transfer( tx, &currentState, sizeof( currentState ) );
  147. }
  148. }
  149. break;
  150. #elif CONFIG_KEYSW
  151. case PROTO_REQ_GET_KEY_STAT2:
  152. {
  153. if( 0 == idx && sizeof(tKeySwitchCode_t) == bytesRemaining )
  154. {
  155. tKeySwitchCode_t code;
  156. if( KeySwitchHandle.GetKeyCode( &code ) )
  157. {
  158. usb_push_transfer( tx, &code, sizeof( code ) );
  159. }
  160. }
  161. }
  162. break;
  163. case PROTO_REQ_GET_KEY_STAT:
  164. {
  165. if( 0 == idx && sizeof(tKeySwitchStateLegacy_t) == bytesRemaining )
  166. {
  167. tKeySwitchStateLegacy_t lstate;
  168. tKeySwitchState_t state;
  169. if( KeySwitchHandle.GetKeyState( &state ) )
  170. {
  171. lstate = KEYSWITCH_STATE_2_LEGACYSTATE( state );
  172. usb_push_transfer( tx, &lstate, sizeof( lstate ) );
  173. }
  174. }
  175. }
  176. break;
  177. #endif
  178. }
  179. return usb_count_transfer( tx );
  180. }