furiac_test.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <furi.h>
  4. /*
  5. Test: creating and killing task
  6. 1. create task
  7. 2. delay 10 ms
  8. 3. kill task
  9. 4. check that value changes
  10. 5. delay 2 ms
  11. 6. check that value stay unchanged
  12. */
  13. void create_kill_app(void* p) {
  14. // this app simply increase counter
  15. uint8_t* counter = (uint8_t*)p;
  16. while(1) {
  17. *counter = *counter + 1;
  18. delay(1);
  19. }
  20. }
  21. bool test_furi_ac_create_kill() {
  22. mu_assert(false, "please reimplement or delete test");
  23. /*
  24. uint8_t counter = 0;
  25. uint8_t value_a = counter;
  26. FuriApp* widget = furiac_start(create_kill_app, "create_kill_app", (void*)&counter);
  27. if(widget == NULL) {
  28. printf("create widget fail\r\n");
  29. return false;
  30. }
  31. delay(10);
  32. if(!furiac_kill(widget)) {
  33. printf("kill widget fail\r\n");
  34. return false;
  35. }
  36. if(value_a == counter) {
  37. printf("counter unchanged\r\n");
  38. return false;
  39. }
  40. value_a = counter;
  41. delay(10);
  42. if(value_a != counter) {
  43. printf("counter changes after kill (counter = %d vs %d)\n", value_a, counter);
  44. return false;
  45. }
  46. return true;
  47. */
  48. }
  49. /*
  50. Test: switch between tasks
  51. 1. init s
  52. 2. create task A, add 'A" to sequence'
  53. 3. switch to task B, add 'B' to sequence
  54. 4. exit from task B -> switch to A and add 'A' to sequence
  55. 5. cleanup: exit from task A
  56. 6. check sequence
  57. */
  58. #define TEST_SWITCH_CONTEXT_SEQ_SIZE 8
  59. typedef struct {
  60. char sequence[TEST_SWITCH_CONTEXT_SEQ_SIZE];
  61. size_t count;
  62. } TestSwitchSequence;
  63. void task_a(void*);
  64. void task_b(void*);
  65. void task_a(void* p) {
  66. // simply starts, add 'A' letter to sequence and switch
  67. // if sequence counter = 0, call task B, exit otherwise
  68. TestSwitchSequence* seq = (TestSwitchSequence*)p;
  69. seq->sequence[seq->count] = 'A';
  70. seq->count++;
  71. if(seq->count == 1) {
  72. furiac_switch(task_b, "task B", p);
  73. // if switch unsuccessfull, this code will executed
  74. seq->sequence[seq->count] = 'x';
  75. seq->count++;
  76. } else {
  77. // add '/' symbol on exit
  78. seq->sequence[seq->count] = '/';
  79. seq->count++;
  80. furiac_exit(NULL);
  81. }
  82. }
  83. // application simply add 'B' end exit
  84. void task_b(void* p) {
  85. TestSwitchSequence* seq = (TestSwitchSequence*)p;
  86. seq->sequence[seq->count] = 'B';
  87. seq->count++;
  88. furiac_exit(p);
  89. }
  90. bool test_furi_ac_switch_exit() {
  91. // init sequence
  92. TestSwitchSequence seq;
  93. seq.count = 0;
  94. furiac_start(task_a, "task A", (void*)&seq);
  95. // TODO how to check that all child task ends?
  96. delay(10); // wait while task do its work
  97. seq.sequence[seq.count] = '\0';
  98. if(strcmp(seq.sequence, "ABA/") != 0) {
  99. printf("wrong sequence: %s\n", seq.sequence);
  100. return false;
  101. }
  102. return true;
  103. }