左手阿飞 发表于 2025-1-14 12:21

【Follow me第二季第3期】任务4:设计一个类似信号发生器功能的例程

本帖最后由 左手阿飞 于 2025-1-14 12:21 编辑

<p>最后扩展任务,设计一个类似信号发生器例程。</p>

<p>信号发生器需要有相应波形的原始波形数据。</p>

<p>在这个任务卡了很多天了,也参考了其他大佬的帖子,但是还是没搞定,做了一些二级菜单,波形出不来。</p>

<p>展示一下现有成果吧。</p>

<p>增加了一个一级菜单,</p>

<pre>
<code class="language-cpp">static st_menu_fn_tbl_t s_menu_items[] =
{
    {"Wave Generator"                         , wave_generator},

    {"Hello Information"                     , Hello_display_menu},
    {"Kit Information"                         , kis_display_menu},
    {"Web Server"                              , eth_emb_display_menu},
    {"Network Name Lookup"                     , eth_www_display_menu},
    {"Quad-SPI and Octo-SPI Speed Comparison", ext_display_menu},
    {"Cryptography and USB High speed (MSC)"   , enc_display_menu},

    {"Next Steps", ns_display_menu },
    {"", NULL }
};</code></pre>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>在菜单中加入选项。但是在增加波形,编译就通不过了。</p>

<pre>
<code class="language-cpp">#define WAVE_TRIANGLE 1
#define WAVE_SQUARE 2
#define WAVE_SINE    3

uint16_t amplitude_scale;
uint16_t period_scale;
uint16_t wavetype;

// Function to get user input for customization
bool customize_wave(uint16_t* amplitude_scale, uint16_t* period_scale) {
    char choice;
    sprintf(s_print_buffer, "Use default wave settings? (y/n): ");
    print_to_console((void*)s_print_buffer);
    choice = input_from_console();

    if (choice == 'n' || choice == 'N') {
      // Prompt for amplitude scaling factor
      sprintf(s_print_buffer, "Enter amplitude scaling factor (1-10): ");
      print_to_console((void*)s_print_buffer);
      // Assume input_from_console returns ASCII digits; convert to integer
      char amp_input = input_from_console();
      *amplitude_scale = (uint16_t)(amp_input - '0');
      if (*amplitude_scale &lt; 1 || *amplitude_scale &gt; 10) {
            *amplitude_scale = 1; // Default value if out of range
      }

      // Prompt for period scaling factor
      sprintf(s_print_buffer, "Enter period scaling factor (1-10): ");
      print_to_console((void*)s_print_buffer);
      char per_input = input_from_console();
      *period_scale = (uint16_t)(per_input - '0');
      if (*period_scale &lt; 1 || *period_scale &gt; 10) {
            *period_scale = 1; // Default value if out of range
      }

      return true; // Customized settings
    }

    // Use default settings
    *amplitude_scale = 1;
    *period_scale = 1;
    return false; // Default settings
}

test_fn wave_generator(void)   // Added
{
    int8_t c = -1;
    uint16_t buffer; // Increased buffer size to store wave type, amplitude, and period
    amplitude_scale = 1;
    period_scale = 1;

    // Clear the screen and move cursor to home position
    sprintf(s_print_buffer, "%s%s", gp_clear_screen, gp_cursor_home);
    print_to_console((void*)s_print_buffer);

    // Display the wave control menu
    sprintf(s_print_buffer,
            "Wave Control:\r\n"
            "1: Triangle Wave\r\n"
            "2: Square Wave\r\n"
            "3: Sine Wave\r\n"
            "r: Read from flash\r\n"
            "w: Write to flash\r\n"
            "space: Exit\r\n");
    print_to_console((void*)s_print_buffer);

    while (CONNECTION_ABORT_CRTL != c)
    {
      c = input_from_console();
      if ((MENU_EXIT_CRTL == c) || (CONNECTION_ABORT_CRTL == c))
      {
            break;
      }
      if (0 != c)
      {
            // Display the selected option
            sprintf(s_print_buffer, "Selected option: %c\r\n", c);
            print_to_console((void*)s_print_buffer);

            if ('1' == c) {
                wavetype = WAVE_TRIANGLE;          // Select Triangle Wave
            }
            else if ('2' == c) {
                wavetype = WAVE_SQUARE;            // Select Square Wave
            }
            else if ('3' == c) {
                wavetype = WAVE_SINE;            // Select Sine Wave
            }
            else if ('r' == c) {                  // Read saved parameters from flash
                readFromFlash(buffer);
                sprintf(s_print_buffer, "Read from buffer: Wave Type=%d, Amplitude Scale=%d, Period Scale=%d\r\n",
                        buffer, buffer, buffer);
                print_to_console((void*)s_print_buffer);
                wavetype = buffer;
                amplitude_scale = buffer;
                period_scale = buffer;
                continue; // Continue to next iteration
            }
            else if ('w' == c) {                  // Write current parameters to flash
                buffer = wavetype;
                buffer = amplitude_scale;
                buffer = period_scale;
                SaveWaveToFlash(buffer);
                sprintf(s_print_buffer, "Wave parameters saved to flash.\r\n");
                print_to_console((void*)s_print_buffer);
                continue; // Continue to next iteration
            }
            else {
                sprintf(s_print_buffer, "Invalid option selected.\r\n");
                print_to_console((void*)s_print_buffer);
                continue; // Continue to next iteration
            }

            // After selecting wave type, prompt for customization
            if (wavetype == WAVE_TRIANGLE || wavetype == WAVE_SQUARE || wavetype == WAVE_SINE) {
                bool is_custom = customize_wave(&amp;amplitude_scale, &amp;period_scale);
                if (is_custom) {
                  sprintf(s_print_buffer, "Custom settings applied: Amplitude Scale=%d, Period Scale=%d\r\n",
                            amplitude_scale, period_scale);
                }
                else {
                  sprintf(s_print_buffer, "Default settings applied: Amplitude Scale=1, Period Scale=1\r\n");
                }
                print_to_console((void*)s_print_buffer);
            }
      }
    }

    // Clear the display menu event bit
    xEventGroupClearBits(g_update_console_event, STATUS_DISPLAY_MENU_KIS);
    return (0);
}
</code></pre>

<p> &nbsp;</p>

Jacktang 发表于 2025-1-15 07:49

<p>波形出不来也无妨,思路有了</p>
页: [1]
查看完整版本: 【Follow me第二季第3期】任务4:设计一个类似信号发生器功能的例程