Signal Generator

Dependencies:   IniManager RA8875 Watchdog mbed-rtos mbed

Fork of speaker_demo_Analog by jim hamblen

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?

UserRevisionLine numberNew 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