Signal Generator
Dependencies: IniManager RA8875 Watchdog mbed-rtos mbed
Fork of speaker_demo_Analog by
main.cpp@1:dd07e1deec6c, 2017-01-13 (annotated)
- Committer:
- WiredHome
- Date:
- Fri Jan 13 12:33:37 2017 +0000
- Revision:
- 1:dd07e1deec6c
- Parent:
- 0:1c8118ee4106
- Child:
- 2:8f71b71fce1b
Added settings screen, started revising the scope layout
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WiredHome | 1:dd07e1deec6c | 1 | |
4180_1 | 0:1c8118ee4106 | 2 | #include "mbed.h" |
WiredHome | 1:dd07e1deec6c | 3 | #include "SignalGenDisplay.h" |
WiredHome | 1:dd07e1deec6c | 4 | #include "RA8875.h" |
WiredHome | 1:dd07e1deec6c | 5 | #include "Watchdog.h" // ver 2 |
WiredHome | 1:dd07e1deec6c | 6 | #include "IniManager.h" // v19 |
WiredHome | 1:dd07e1deec6c | 7 | |
WiredHome | 1:dd07e1deec6c | 8 | const char * PROG_MANF = "Smartware Computing"; |
WiredHome | 1:dd07e1deec6c | 9 | const char * PROG_NAME = "Signal Generator"; |
WiredHome | 1:dd07e1deec6c | 10 | const char * PROG_VERS = "0.01"; |
WiredHome | 1:dd07e1deec6c | 11 | const char * BUILD_DATE = __DATE__ " " __TIME__; |
WiredHome | 1:dd07e1deec6c | 12 | |
WiredHome | 1:dd07e1deec6c | 13 | RA8875 lcd(p5,p6,p7,p12, NC, "tft"); // SPI:{MOSI,MISO,SCK,/ChipSelect,/reset}, name |
WiredHome | 1:dd07e1deec6c | 14 | INI ini; |
WiredHome | 1:dd07e1deec6c | 15 | SignalGenerator g_signal(p18); |
WiredHome | 1:dd07e1deec6c | 16 | |
WiredHome | 1:dd07e1deec6c | 17 | SignalGenDisplay ui(&lcd, &g_signal, PROG_NAME, PROG_MANF, PROG_VERS, BUILD_DATE); |
WiredHome | 1:dd07e1deec6c | 18 | |
WiredHome | 1:dd07e1deec6c | 19 | RawSerial pc(USBTX, USBRX); |
WiredHome | 1:dd07e1deec6c | 20 | LocalFileSystem local("local"); |
WiredHome | 1:dd07e1deec6c | 21 | Watchdog wd; |
WiredHome | 1:dd07e1deec6c | 22 | |
WiredHome | 1:dd07e1deec6c | 23 | /* CPU Available indicator |
WiredHome | 1:dd07e1deec6c | 24 | */ |
WiredHome | 1:dd07e1deec6c | 25 | DigitalOut g_availableLed(LED1); //<! Led used to indicate the program is alive |
WiredHome | 1:dd07e1deec6c | 26 | void AvailableLedIndicator(); //<! Ticker callback |
WiredHome | 1:dd07e1deec6c | 27 | Ticker g_available; |
WiredHome | 1:dd07e1deec6c | 28 | |
WiredHome | 1:dd07e1deec6c | 29 | /* SignalGenerator usage |
WiredHome | 1:dd07e1deec6c | 30 | */ |
WiredHome | 1:dd07e1deec6c | 31 | void SynchronousUserInput(); //<! Ticker callback |
WiredHome | 1:dd07e1deec6c | 32 | Ticker g_synchronousUserInput; |
WiredHome | 1:dd07e1deec6c | 33 | |
WiredHome | 1:dd07e1deec6c | 34 | |
4180_1 | 0:1c8118ee4106 | 35 | |
WiredHome | 1:dd07e1deec6c | 36 | // Calibrate the resistive touch screen, and store the data on the |
WiredHome | 1:dd07e1deec6c | 37 | // local file system. |
WiredHome | 1:dd07e1deec6c | 38 | // |
WiredHome | 1:dd07e1deec6c | 39 | void CalibrateTS(void) |
4180_1 | 0:1c8118ee4106 | 40 | { |
WiredHome | 1:dd07e1deec6c | 41 | FILE * fh; |
WiredHome | 1:dd07e1deec6c | 42 | tpMatrix_t matrix; |
WiredHome | 1:dd07e1deec6c | 43 | RetCode_t r; |
WiredHome | 1:dd07e1deec6c | 44 | Timer testperiod; |
WiredHome | 1:dd07e1deec6c | 45 | |
WiredHome | 1:dd07e1deec6c | 46 | r = lcd.TouchPanelCalibrate("Calibrate the touch panel", &matrix); |
WiredHome | 1:dd07e1deec6c | 47 | if (r == noerror) { |
WiredHome | 1:dd07e1deec6c | 48 | fh = fopen("/local/tpcal.cfg", "wb"); |
WiredHome | 1:dd07e1deec6c | 49 | if (fh) { |
WiredHome | 1:dd07e1deec6c | 50 | fwrite(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 1:dd07e1deec6c | 51 | fclose(fh); |
WiredHome | 1:dd07e1deec6c | 52 | printf(" tp cal written.\r\n"); |
WiredHome | 1:dd07e1deec6c | 53 | lcd.cls(); |
WiredHome | 1:dd07e1deec6c | 54 | } else { |
WiredHome | 1:dd07e1deec6c | 55 | printf(" couldn't open tpcal file.\r\n"); |
WiredHome | 1:dd07e1deec6c | 56 | } |
WiredHome | 1:dd07e1deec6c | 57 | } else { |
WiredHome | 1:dd07e1deec6c | 58 | printf("error return: %d\r\n", r); |
WiredHome | 1:dd07e1deec6c | 59 | } |
WiredHome | 1:dd07e1deec6c | 60 | lcd.cls(); |
WiredHome | 1:dd07e1deec6c | 61 | } |
WiredHome | 1:dd07e1deec6c | 62 | |
WiredHome | 1:dd07e1deec6c | 63 | // Try to load a previous resistive touch screen calibration from storage. If it |
WiredHome | 1:dd07e1deec6c | 64 | // doesn't exist, activate the touch screen calibration process. |
WiredHome | 1:dd07e1deec6c | 65 | // |
WiredHome | 1:dd07e1deec6c | 66 | void InitTS(void) |
WiredHome | 1:dd07e1deec6c | 67 | { |
WiredHome | 1:dd07e1deec6c | 68 | FILE * fh; |
WiredHome | 1:dd07e1deec6c | 69 | tpMatrix_t matrix; |
WiredHome | 1:dd07e1deec6c | 70 | |
WiredHome | 1:dd07e1deec6c | 71 | fh = fopen("/local/tpcal.cfg", "rb"); |
WiredHome | 1:dd07e1deec6c | 72 | if (fh) { |
WiredHome | 1:dd07e1deec6c | 73 | fread(&matrix, sizeof(tpMatrix_t), 1, fh); |
WiredHome | 1:dd07e1deec6c | 74 | fclose(fh); |
WiredHome | 1:dd07e1deec6c | 75 | lcd.TouchPanelSetMatrix(&matrix); |
WiredHome | 1:dd07e1deec6c | 76 | printf(" tp cal loaded.\r\n"); |
WiredHome | 1:dd07e1deec6c | 77 | } else { |
WiredHome | 1:dd07e1deec6c | 78 | CalibrateTS(); |
4180_1 | 0:1c8118ee4106 | 79 | } |
4180_1 | 0:1c8118ee4106 | 80 | } |
WiredHome | 1:dd07e1deec6c | 81 | |
WiredHome | 1:dd07e1deec6c | 82 | |
WiredHome | 1:dd07e1deec6c | 83 | |
WiredHome | 1:dd07e1deec6c | 84 | /* Program Entry Point |
WiredHome | 1:dd07e1deec6c | 85 | */ |
WiredHome | 1:dd07e1deec6c | 86 | int main() { |
WiredHome | 1:dd07e1deec6c | 87 | pc.baud(460800); |
WiredHome | 1:dd07e1deec6c | 88 | pc.printf("\r\n%s %s\r\n", PROG_NAME, BUILD_DATE); |
WiredHome | 1:dd07e1deec6c | 89 | |
WiredHome | 1:dd07e1deec6c | 90 | if (wd.WatchdogCausedReset()) { |
WiredHome | 1:dd07e1deec6c | 91 | pc.printf("**** Watchdog Event caused reset ****\r\n"); |
WiredHome | 1:dd07e1deec6c | 92 | } |
WiredHome | 1:dd07e1deec6c | 93 | // Set very long timeout because the <PrintScreen> function is incredibly slow with local filesystem... |
WiredHome | 1:dd07e1deec6c | 94 | // wd.Configure(120.0); // This is forever for real-time embedded, but for a casual network appliance... |
WiredHome | 1:dd07e1deec6c | 95 | ini.SetFile("/local/SigGen.ini", 2); |
WiredHome | 1:dd07e1deec6c | 96 | |
WiredHome | 1:dd07e1deec6c | 97 | // Bring the LCD online |
WiredHome | 1:dd07e1deec6c | 98 | lcd.frequency(2000000); |
WiredHome | 1:dd07e1deec6c | 99 | lcd.init(480,272,16, true, true, true); |
WiredHome | 1:dd07e1deec6c | 100 | lcd.TouchPanelInit(); |
WiredHome | 1:dd07e1deec6c | 101 | int bl = ini.ReadLongInt("Settings", "Backlight", 80); |
WiredHome | 1:dd07e1deec6c | 102 | lcd.Backlight_u8(bl); |
WiredHome | 1:dd07e1deec6c | 103 | InitTS(); |
WiredHome | 1:dd07e1deec6c | 104 | |
WiredHome | 1:dd07e1deec6c | 105 | // Bring the signal generator online |
WiredHome | 1:dd07e1deec6c | 106 | ui.Init(); |
WiredHome | 1:dd07e1deec6c | 107 | |
WiredHome | 1:dd07e1deec6c | 108 | //volatile SignalGenerator::SignalGeneratorType _choice; //<! User selects the desired signal type |
WiredHome | 1:dd07e1deec6c | 109 | //volatile int frequency; //<! Signal frequency |
WiredHome | 1:dd07e1deec6c | 110 | |
WiredHome | 1:dd07e1deec6c | 111 | wait(1); // Needed after startup |
WiredHome | 1:dd07e1deec6c | 112 | |
WiredHome | 1:dd07e1deec6c | 113 | // Launch available indicator |
WiredHome | 1:dd07e1deec6c | 114 | g_availableLed = 1; |
WiredHome | 1:dd07e1deec6c | 115 | g_available.attach(&AvailableLedIndicator, 2.0); // Never detached |
WiredHome | 1:dd07e1deec6c | 116 | |
WiredHome | 1:dd07e1deec6c | 117 | ui.ShowMenu(); |
WiredHome | 1:dd07e1deec6c | 118 | // Start infinite loop |
WiredHome | 1:dd07e1deec6c | 119 | while(true) |
WiredHome | 1:dd07e1deec6c | 120 | { |
WiredHome | 1:dd07e1deec6c | 121 | // wd.Service(); |
WiredHome | 1:dd07e1deec6c | 122 | if (pc.readable()) { |
WiredHome | 1:dd07e1deec6c | 123 | int c = pc.getc(); |
WiredHome | 1:dd07e1deec6c | 124 | ui.Poll(c); |
WiredHome | 1:dd07e1deec6c | 125 | } else { |
WiredHome | 1:dd07e1deec6c | 126 | ui.Poll(); |
WiredHome | 1:dd07e1deec6c | 127 | } |
WiredHome | 1:dd07e1deec6c | 128 | #if 0 |
WiredHome | 1:dd07e1deec6c | 129 | // Acquire settings |
WiredHome | 1:dd07e1deec6c | 130 | //_choice = DisplaySignalGeneratorTestMenuAndGetChoice(); |
WiredHome | 1:dd07e1deec6c | 131 | printf("\r\nEnter signal frequency (< 1MHz/# of samples): "); |
WiredHome | 1:dd07e1deec6c | 132 | scanf("%d", &frequency); |
WiredHome | 1:dd07e1deec6c | 133 | |
WiredHome | 1:dd07e1deec6c | 134 | // Prepare the signal |
WiredHome | 1:dd07e1deec6c | 135 | g_signal.SetSignalFrequency(_choice, frequency); |
WiredHome | 1:dd07e1deec6c | 136 | |
WiredHome | 1:dd07e1deec6c | 137 | // Launch execution |
WiredHome | 1:dd07e1deec6c | 138 | if (g_signal.BeginRunAsync() == -1) { |
WiredHome | 1:dd07e1deec6c | 139 | // Synchronous mode |
WiredHome | 1:dd07e1deec6c | 140 | g_synchronousUserInput.attach(&SynchronousUserInput, 0.005); // 5ms |
WiredHome | 1:dd07e1deec6c | 141 | g_signal.Run(); // Never stopped |
WiredHome | 1:dd07e1deec6c | 142 | printf("\r\nSignal Generator terminated\r\n"); |
WiredHome | 1:dd07e1deec6c | 143 | g_synchronousUserInput.detach(); |
WiredHome | 1:dd07e1deec6c | 144 | } else { |
WiredHome | 1:dd07e1deec6c | 145 | // Asynchronous mode |
WiredHome | 1:dd07e1deec6c | 146 | printf("\r\n\r\nPress 'q' to terminate\r\n"); |
WiredHome | 1:dd07e1deec6c | 147 | while (getchar() != 'q'); |
WiredHome | 1:dd07e1deec6c | 148 | g_signal.EndRunAsync(); |
WiredHome | 1:dd07e1deec6c | 149 | } |
WiredHome | 1:dd07e1deec6c | 150 | #endif |
WiredHome | 1:dd07e1deec6c | 151 | } // End of 'while' statement |
WiredHome | 1:dd07e1deec6c | 152 | } // End of main program |
WiredHome | 1:dd07e1deec6c | 153 | |
WiredHome | 1:dd07e1deec6c | 154 | /** Callbak used by CPU availabe ticker to indicate the program is alive |
WiredHome | 1:dd07e1deec6c | 155 | */ |
WiredHome | 1:dd07e1deec6c | 156 | void AvailableLedIndicator() { |
WiredHome | 1:dd07e1deec6c | 157 | g_availableLed != g_availableLed; |
WiredHome | 1:dd07e1deec6c | 158 | } // End of function AvailableLedIndicator |
WiredHome | 1:dd07e1deec6c | 159 | |
WiredHome | 1:dd07e1deec6c | 160 | /** Callbak used when SignalLibrary is used in synchronous mode (Run() method) |
WiredHome | 1:dd07e1deec6c | 161 | */ |
WiredHome | 1:dd07e1deec6c | 162 | void SynchronousUserInput() { |
WiredHome | 1:dd07e1deec6c | 163 | if (pc.readable()) { |
WiredHome | 1:dd07e1deec6c | 164 | g_signal.Stop(); |
WiredHome | 1:dd07e1deec6c | 165 | getchar(); |
WiredHome | 1:dd07e1deec6c | 166 | } |
WiredHome | 1:dd07e1deec6c | 167 | } // End of function SynchronousUserInput |
WiredHome | 1:dd07e1deec6c | 168 |