Callback_40.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdint>
  5. #include <cstdio>
  6. #include <functional>
  7. #include <map>
  8. #include "cStruct.h"
  9. #include "vector"
  10. // https://stackoverflow.com/questions/34863373/how-to-use-stdbind-with-lambda
  11. /*
  12. * https://shaharmike.com/cpp/lambdas-and-functions/
  13. * https://shaharmike.com/cpp/naive-std-function/
  14. * https://stackoverflow.com/questions/11372855/stdbind-to-stdfunction
  15. * https://oopscenities.net/2012/02/24/c11-stdfunction-and-stdbind/
  16. * http://www.gockelhut.com/cpp-pirate/lambda-vs-bind.html
  17. * https://thispointer.com/c11-lambda-how-to-capture-local-variables-inside-lambda/
  18. * http://www.randomprogramming.com/2014/06/stdbind-and-lambda-functions-2/
  19. * https://blog.mbedded.ninja/programming/languages/c-plus-plus/callbacks/
  20. *
  21. * https://stackoverflow.com/questions/17363003/why-use-stdbind-over-lambdas-in-c14
  22. * auto f = std::bind(&Foo::func, this, input); f();
  23. * https://stackoverflow.com/questions/9186510/how-can-i-store-a-lambda-expression-as-a-field-of-a-class-in-c11
  24. * https://stackoverflow.com/questions/35398298/c14-generic-lambdas-in-header-file
  25. *
  26. */
  27. #define TFTC_DISABLE_LIGHT 0xC618
  28. #define TFTC_DISABLE_MED 0x7BCF
  29. #define TFTC_DISABLE_DARK 0x3186
  30. /*
  31. Checkbox class
  32. */
  33. typedef struct cCheckBox_t
  34. {
  35. uint8_t CHECKBOX_SIZE = 20;
  36. uint8_t TFT_DEBOUNCE = 100; // debounce delay to minimize screen repress
  37. uint16_t C_DISABLE_LIGHT = TFTC_DISABLE_LIGHT;
  38. uint16_t C_DISABLE_MED = TFTC_DISABLE_MED;
  39. uint16_t C_DISABLE_DARK = TFTC_DISABLE_DARK;
  40. } cCheckBox_param;
  41. enum RETVAL
  42. {
  43. CONT = false,
  44. BREAK = true
  45. };
  46. enum EV_TYPE
  47. {
  48. EV_CHECKBUTTON_COORDINATES = 0,
  49. EV_ENTRY,
  50. EV_LONGPRESSED,
  51. EV_EXIT
  52. };
  53. struct myData {
  54. int myAge = 55;
  55. const char* pchar = "myData struct";
  56. enum en_sex { MALE, FEMALE, DIVERS } sex = MALE;
  57. };
  58. struct myOtherData : myData {
  59. int myOtherAge = 35;
  60. };
  61. struct Foo {
  62. typedef std::function<RETVAL()> _cb_;
  63. int register_cb(EV_TYPE type, _cb_ func)
  64. {
  65. std::map<EV_TYPE, _cb_ >::iterator it = callmap.begin();
  66. if (callmap.find(type) != callmap.end()) {
  67. std::cout << "Overwrite - Index found " << type << std::endl;
  68. }
  69. callmap[type] = func;
  70. return 1;
  71. }
  72. RETVAL call_cb(EV_TYPE type) {
  73. std::map<EV_TYPE, _cb_ >::iterator it = callmap.begin();
  74. if (callmap.find(type) == callmap.end()) {
  75. std::cout << "Index not found: " << type << std::endl;
  76. return BREAK;
  77. }
  78. std::cout << "Callmap type: " << type << std::endl;
  79. return callmap[type]();
  80. }
  81. private:
  82. std::map<EV_TYPE, _cb_ > callmap;
  83. };
  84. RETVAL hello(const std::string& name) {
  85. std::cout << "Hello " << name << "!" << std::endl;
  86. return CONT;
  87. }
  88. RETVAL test(myData* p, myOtherData* q) {
  89. std::cout << "Test " << "!" << std::endl;
  90. return CONT;
  91. }
  92. int main() {
  93. Foo f;
  94. myData mydata;
  95. myOtherData myotherdata;
  96. int i = 0, j = 1;
  97. auto arr2d = new struct sLampInterfaceLong[8][8];
  98. std::map<std::string, std::map<std::string, struct sLampInterfaceLong>> m_Presets;
  99. std::vector<std::vector<struct sLampInterfaceLong> > varr(8, std::vector<struct sLampInterfaceLong>(8));
  100. std::cout << " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " << std::endl;
  101. /*
  102. for (auto& element : varr) {
  103. std::cout << "Element: " << element.at(1).btnName << std::endl;
  104. }
  105. auto elementsa = varr.at(1).at(1);
  106. std::cout << "Element: " << elementsa << std::endl;
  107. */
  108. strcpy_s(m_Presets["P1"]["L1"].btnName, "A");
  109. strcpy_s(m_Presets["P1"]["L1"].MAC_Address, "12:34:24:36:48:60");
  110. m_Presets["P1"]["L1"].rcolor = 0xFC;
  111. m_Presets["P1"]["L1"].gcolor = 0xFD;
  112. m_Presets["P1"]["L1"].bcolor = 0xFF;
  113. m_Presets["P1"]["L1"].cwhite = 0x01;
  114. m_Presets["P1"]["L1"].wwhite = 0x02;
  115. m_Presets["P1"]["L1"].bright = 0x03;
  116. m_Presets["P1"]["L1"].OffOn = ON;
  117. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L1"] << std::endl;
  118. strcpy_s(m_Presets["P1"]["L2"].btnName, "B");
  119. strcpy_s(m_Presets["P1"]["L2"].MAC_Address, "00:12:24:36:48:60");
  120. m_Presets["P1"]["L2"].rcolor = 0xFC;
  121. m_Presets["P1"]["L2"].gcolor = 0xFD;
  122. m_Presets["P1"]["L2"].bcolor = 0xFF;
  123. m_Presets["P1"]["L2"].cwhite = 0x01;
  124. m_Presets["P1"]["L2"].wwhite = 0x02;
  125. m_Presets["P1"]["L2"].bright = 0x03;
  126. m_Presets["P1"]["L2"].OffOn = ON;
  127. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L2"] << std::endl;
  128. strcpy_s(m_Presets["P1"]["L3"].btnName, "C");
  129. strcpy_s(m_Presets["P1"]["L3"].MAC_Address, "00:12:24:36:48:60");
  130. m_Presets["P1"]["L3"].rcolor = 0xFC;
  131. m_Presets["P1"]["L3"].gcolor = 0xFD;
  132. m_Presets["P1"]["L3"].bcolor = 0xFF;
  133. m_Presets["P1"]["L3"].cwhite = 0x01;
  134. m_Presets["P1"]["L3"].wwhite = 0x02;
  135. m_Presets["P1"]["L3"].bright = 0x03;
  136. m_Presets["P1"]["L3"].OffOn = ON;
  137. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L3"] << std::endl;
  138. strcpy_s(m_Presets["P1"]["L4"].btnName, "D");
  139. strcpy_s(m_Presets["P1"]["L4"].MAC_Address, "00:12:24:36:48:60");
  140. m_Presets["P1"]["L4"].rcolor = 0xFC;
  141. m_Presets["P1"]["L4"].gcolor = 0xFD;
  142. m_Presets["P1"]["L4"].bcolor = 0xFF;
  143. m_Presets["P1"]["L4"].cwhite = 0x01;
  144. m_Presets["P1"]["L4"].wwhite = 0x02;
  145. m_Presets["P1"]["L4"].bright = 0x03;
  146. m_Presets["P1"]["L4"].OffOn = ON;
  147. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L4"] << std::endl;
  148. strcpy_s(m_Presets["P1"]["L5"].btnName, "Garten");
  149. strcpy_s(m_Presets["P1"]["L5"].MAC_Address, "00:12:24:36:48:60");
  150. m_Presets["P1"]["L5"].rcolor = 0xFC;
  151. m_Presets["P1"]["L5"].gcolor = 0xFD;
  152. m_Presets["P1"]["L5"].bcolor = 0xFF;
  153. m_Presets["P1"]["L5"].cwhite = 0x01;
  154. m_Presets["P1"]["L5"].wwhite = 0x02;
  155. m_Presets["P1"]["L5"].bright = 0x03;
  156. m_Presets["P1"]["L5"].OffOn = ON;
  157. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L5"] << std::endl;
  158. strcpy_s(m_Presets["P1"]["L6"].btnName, "Essen");
  159. strcpy_s(m_Presets["P1"]["L6"].MAC_Address, "00:12:24:36:48:60");
  160. m_Presets["P1"]["L6"].rcolor = 0xFC;
  161. m_Presets["P1"]["L6"].gcolor = 0xFD;
  162. m_Presets["P1"]["L6"].bcolor = 0xFF;
  163. m_Presets["P1"]["L6"].cwhite = 0x01;
  164. m_Presets["P1"]["L6"].wwhite = 0x02;
  165. m_Presets["P1"]["L6"].bright = 0x03;
  166. m_Presets["P1"]["L6"].OffOn = ON;
  167. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L6"] << std::endl;
  168. strcpy_s(m_Presets["P1"]["L7"].btnName, "Bad");
  169. strcpy_s(m_Presets["P1"]["L7"].MAC_Address, "00:12:24:36:48:60");
  170. m_Presets["P1"]["L7"].rcolor = 0xFC;
  171. m_Presets["P1"]["L7"].gcolor = 0xFD;
  172. m_Presets["P1"]["L7"].bcolor = 0xFF;
  173. m_Presets["P1"]["L7"].cwhite = 0x01;
  174. m_Presets["P1"]["L7"].wwhite = 0x02;
  175. m_Presets["P1"]["L7"].bright = 0x03;
  176. m_Presets["P1"]["L7"].OffOn = ON;
  177. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L7"] << std::endl;
  178. strcpy_s(m_Presets["P1"]["L8"].btnName, "Kueche");
  179. strcpy_s(m_Presets["P1"]["L8"].MAC_Address, "00:12:24:36:48:60");
  180. m_Presets["P1"]["L8"].rcolor = 0xFC;
  181. m_Presets["P1"]["L8"].gcolor = 0xFD;
  182. m_Presets["P1"]["L8"].bcolor = 0xFF;
  183. m_Presets["P1"]["L8"].cwhite = 0x01;
  184. m_Presets["P1"]["L8"].wwhite = 0x02;
  185. m_Presets["P1"]["L8"].bright = 0x03;
  186. m_Presets["P1"]["L8"].OffOn = ON;
  187. std::cout << "[INFO] cLampsInterface P1: " << m_Presets["P1"]["L8"] << std::endl;
  188. for (int i = 0; i < 8; i++) {
  189. std::cout << varr[0][i] << std::endl ;
  190. }
  191. std::function<RETVAL(int, int)> foo = [](int a, int b) {
  192. std::cout << "LAMBDA foo " << "!" << std::endl;
  193. return CONT; };
  194. f.register_cb(EV_ENTRY, std::bind(foo, 2, 2));
  195. if (BREAK == f.call_cb(EV_ENTRY)) return 0;
  196. std::function<RETVAL(myData*, myOtherData*)> foo_c = [](myData* a, myOtherData* b) {
  197. std::cout << "LAMBDA foo_c " << "!" << std::endl;
  198. return CONT; };
  199. f.register_cb(EV_ENTRY, std::bind(foo_c, &mydata, &myotherdata));
  200. if (BREAK == f.call_cb(EV_ENTRY)) return 0;
  201. f.register_cb(EV_ENTRY, std::bind(hello, "John"));
  202. if (BREAK == f.call_cb(EV_ENTRY)) return 0;
  203. f.register_cb(EV_ENTRY, std::bind(test, &mydata, &myotherdata));
  204. if ( BREAK == f.call_cb(EV_ENTRY)) return 0;
  205. if ( BREAK == f.call_cb(EV_ENTRY)) return 0;
  206. return 1;
  207. }