Testsoftware for SC16IS740

Dependencies:   SC16IS740

Committer:
elelthvd
Date:
Thu Aug 13 15:50:31 2020 +0800
Revision:
2:bbcc894fe0d7
Parent:
0:320d96eb6974
Add lib SC16IS740

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elelthvd 0:320d96eb6974 1 /* Modified
elelthvd 0:320d96eb6974 2 COPY OF https://os.mbed.com/users/wim/code/mbed_SC16IS740//file/20d8ef79d787/main.cpp
elelthvd 0:320d96eb6974 3 */
elelthvd 0:320d96eb6974 4 #include "mbed.h"
elelthvd 0:320d96eb6974 5
elelthvd 0:320d96eb6974 6 #include "SC16IS740.h"
elelthvd 0:320d96eb6974 7
elelthvd 0:320d96eb6974 8
elelthvd 0:320d96eb6974 9 #if defined(TARGET_DISCO_F746NG)
elelthvd 0:320d96eb6974 10 // SPI for DISCO_F746NG board w/Mikro Adruino Click Shield
elelthvd 0:320d96eb6974 11 #define D_MOSI SPI_MOSI // D11
elelthvd 0:320d96eb6974 12 #define D_MISO SPI_MISO // D12
elelthvd 0:320d96eb6974 13 #define D_SCLK SPI_SCK // D13
elelthvd 0:320d96eb6974 14 #define D_CS D9 // PWM_OUT // MikroBUS 2
elelthvd 0:320d96eb6974 15 #define D_INTR D3 // PB_4 // MikroBUS 2
elelthvd 0:320d96eb6974 16 #define D_RST A2 // PF_9 // MikroBUS 2
elelthvd 0:320d96eb6974 17 // #define D_CS D10 // SPI_CS // MikroBUS 1
elelthvd 0:320d96eb6974 18 // #define D_INTR D2 // PG_6 // MikroBUS 1
elelthvd 0:320d96eb6974 19 // #define D_RST A3 // PF_8 // MikroBUS 1
elelthvd 0:320d96eb6974 20
elelthvd 0:320d96eb6974 21 // I2C for DISCO_F746NG (not used)
elelthvd 0:320d96eb6974 22 #define D_SCL A5 // PF_6
elelthvd 0:320d96eb6974 23 #define D_SDA A4 // PF_7
elelthvd 0:320d96eb6974 24 // #define D_SCL D15 // = PB_8 Manually Wired to A5
elelthvd 0:320d96eb6974 25 // #define D_SDA D14 // = PB_9 Manually Wired to A4
elelthvd 0:320d96eb6974 26
elelthvd 0:320d96eb6974 27 // Serial for DISCO_F746NG already defined.
elelthvd 0:320d96eb6974 28 // Optionally specify different pins for printing on UART other than the default console UART.
elelthvd 0:320d96eb6974 29 #define D_TX USBTX
elelthvd 0:320d96eb6974 30 #define D_RX USBRX
elelthvd 0:320d96eb6974 31
elelthvd 0:320d96eb6974 32 #endif
elelthvd 0:320d96eb6974 33
elelthvd 0:320d96eb6974 34 // Bizarre: If this line is above declaration SC16IS740_SPI serial_bridge,
elelthvd 0:320d96eb6974 35 // It does not blink ...
elelthvd 0:320d96eb6974 36 // But if this line is below declaration SC16IS740_SPI serial_bridge,
elelthvd 0:320d96eb6974 37 // Then serial_bridge stops working after a few chars!
elelthvd 0:320d96eb6974 38 DigitalOut heartbeatLED(LED1);
elelthvd 0:320d96eb6974 39
elelthvd 0:320d96eb6974 40 //SPI Version
elelthvd 0:320d96eb6974 41 SPI spi(D_MOSI, D_MISO, D_SCLK); //MOSI, MISO, SCK
elelthvd 0:320d96eb6974 42 // SC16IS740_SPI serial_bridge(&spi, D_CS);
elelthvd 0:320d96eb6974 43 SC16IS740_SPI serial_bridge(&spi, D_CS, D_RST); // version with Hardware Reset pin
elelthvd 0:320d96eb6974 44 //SC16IS752_SPI serial_bridge(&spi, D_CS, D_RST, SC16IS740::Channel_A); // Dual UART version with Hardware Reset pin
elelthvd 0:320d96eb6974 45 //SC16IS752_SPI serial_bridge(&spi, D_CS, D_RST, SC16IS740::Channel_B); // Dual UART version with Hardware Reset pin
elelthvd 0:320d96eb6974 46
elelthvd 0:320d96eb6974 47 // //I2C Version
elelthvd 0:320d96eb6974 48 // I2C i2c(D_SDA, D_SCL); //SDA, SCL
elelthvd 0:320d96eb6974 49 // //SC16IS740_I2C serial_bridge(&i2c, SC16IS740_DEFAULT_ADDR);
elelthvd 0:320d96eb6974 50 // //SC16IS740_I2C serial_bridge(&i2c, SC16IS740_DEFAULT_ADDR, D_RST);
elelthvd 0:320d96eb6974 51 // SC16IS752_I2C serial_bridge(&i2c, SC16IS740_DEFAULT_ADDR, D_RST, SC16IS740::Channel_A); // Dual UART version with Hardware Reset pin
elelthvd 0:320d96eb6974 52 // //SC16IS752_I2C serial_bridge(&i2c, SC16IS740_DEFAULT_ADDR, D_RST, SC16IS740::Channel_B); // Dual UART version with Hardware Reset pin
elelthvd 0:320d96eb6974 53
elelthvd 0:320d96eb6974 54
elelthvd 0:320d96eb6974 55
elelthvd 0:320d96eb6974 56 // Create a BufferedSerial object to be used by the system I/O retarget code.
elelthvd 0:320d96eb6974 57 static BufferedSerial pc(D_TX, D_RX, 9600);
elelthvd 0:320d96eb6974 58 // static BufferedSerial pc(D_TX, D_RX, 115200);
elelthvd 0:320d96eb6974 59 // Specify a custom FileHandle for the console.
elelthvd 0:320d96eb6974 60 FileHandle * mbed::mbed_override_console(int fd) {
elelthvd 0:320d96eb6974 61 return &pc;
elelthvd 0:320d96eb6974 62 }
elelthvd 0:320d96eb6974 63
elelthvd 0:320d96eb6974 64 void show_menu() {
elelthvd 0:320d96eb6974 65 printf("0: Exit\r\n");
elelthvd 0:320d96eb6974 66 printf("1: Show Menu\r\n");
elelthvd 0:320d96eb6974 67 printf("2: Init\r\n");
elelthvd 0:320d96eb6974 68 printf("3: IO Port Out\r\n");
elelthvd 0:320d96eb6974 69 printf("4: Transparant mode\r\n");
elelthvd 0:320d96eb6974 70 printf("5: Free bufferspace\r\n");
elelthvd 0:320d96eb6974 71 printf("6: Enable RTS/CTS\r\n");
elelthvd 0:320d96eb6974 72 printf("7: Disable RTS/CTS\r\n");
elelthvd 0:320d96eb6974 73 printf("8: Write block\r\n");
elelthvd 0:320d96eb6974 74 printf("9: Baudrate 9600\r\n");
elelthvd 0:320d96eb6974 75 printf("A: Baudrate 115200\r\n");
elelthvd 0:320d96eb6974 76 printf("B: Transparant mode with bufferdisplay\r\n");
elelthvd 0:320d96eb6974 77 printf("C: Test printf \r\n");
elelthvd 0:320d96eb6974 78 printf("D: Test connected\r\n");
elelthvd 0:320d96eb6974 79 printf("E: Clear screen\r\n");
elelthvd 0:320d96eb6974 80 printf("F: Funky ANSI\r\n");
elelthvd 0:320d96eb6974 81 printf("G: Heart Beat\r\n");
elelthvd 0:320d96eb6974 82 printf("\r\n");
elelthvd 0:320d96eb6974 83 }
elelthvd 0:320d96eb6974 84
elelthvd 0:320d96eb6974 85 // Local functions
elelthvd 0:320d96eb6974 86 void clear_screen() {
elelthvd 0:320d96eb6974 87 //ANSI Terminal Commands
elelthvd 0:320d96eb6974 88 printf("\x1B[2J");
elelthvd 0:320d96eb6974 89 printf("\x1B[H");
elelthvd 0:320d96eb6974 90 serial_bridge.writeString("\x1B[2J");
elelthvd 0:320d96eb6974 91 serial_bridge.writeString("\x1B[H");
elelthvd 0:320d96eb6974 92 }
elelthvd 0:320d96eb6974 93
elelthvd 0:320d96eb6974 94 void funky_ansi() {
elelthvd 0:320d96eb6974 95 int i, j, n;
elelthvd 0:320d96eb6974 96 for (i = 0; i < 11; i++) {
elelthvd 0:320d96eb6974 97 for (j = 0; j < 10; j++) {
elelthvd 0:320d96eb6974 98 n = 10*i + j;
elelthvd 0:320d96eb6974 99 if (n > 108) break;
elelthvd 0:320d96eb6974 100 serial_bridge.printf("\033[%dm %3d\033[m", n, n);
elelthvd 0:320d96eb6974 101 }
elelthvd 0:320d96eb6974 102 serial_bridge.printf("\r\n");
elelthvd 0:320d96eb6974 103 }
elelthvd 0:320d96eb6974 104 }
elelthvd 0:320d96eb6974 105
elelthvd 0:320d96eb6974 106 // Variables for Heartbeat and Status monitoring
elelthvd 0:320d96eb6974 107 Ticker heartbeat;
elelthvd 0:320d96eb6974 108 // Heartbeat
elelthvd 0:320d96eb6974 109 void heartbeat_beat() {
elelthvd 0:320d96eb6974 110 heartbeatLED = ! heartbeatLED;
elelthvd 0:320d96eb6974 111 }
elelthvd 0:320d96eb6974 112 void heartbeat_start() {
elelthvd 0:320d96eb6974 113 heartbeatLED = 1;
elelthvd 0:320d96eb6974 114 }
elelthvd 0:320d96eb6974 115 void heartbeat_stop() {
elelthvd 0:320d96eb6974 116 heartbeat.detach();
elelthvd 0:320d96eb6974 117 }
elelthvd 0:320d96eb6974 118 int main() {
elelthvd 0:320d96eb6974 119 bool running = true;
elelthvd 0:320d96eb6974 120 bool running_test = true;
elelthvd 0:320d96eb6974 121 char command, ch;
elelthvd 0:320d96eb6974 122 char * buffer;
elelthvd 0:320d96eb6974 123 int i = 0;
elelthvd 0:320d96eb6974 124 heartbeat_start();
elelthvd 0:320d96eb6974 125 heartbeat.attach(callback( &heartbeat_beat), 500ms);
elelthvd 0:320d96eb6974 126
elelthvd 0:320d96eb6974 127 #if defined(TARGET_DISCO_F746NG)
elelthvd 0:320d96eb6974 128 printf("\r\nHello World from DISCO_F746NG\r\n");
elelthvd 0:320d96eb6974 129 #endif
elelthvd 0:320d96eb6974 130 #if defined(TARGET_LPC1768)
elelthvd 0:320d96eb6974 131 printf("\r\nHello World from LPC1768\r\n");
elelthvd 0:320d96eb6974 132 #endif
elelthvd 0:320d96eb6974 133 #if defined(TARGET_KL25Z)
elelthvd 0:320d96eb6974 134 printf("\r\nHello World from KL25Z\r\n");
elelthvd 0:320d96eb6974 135 #endif
elelthvd 0:320d96eb6974 136 #if defined(TARGET_LPC812)
elelthvd 0:320d96eb6974 137 printf("\r\nHello World from LPC812\r\n");
elelthvd 0:320d96eb6974 138 #endif
elelthvd 0:320d96eb6974 139
elelthvd 0:320d96eb6974 140 // We need to enable flow control or we overflow buffers and
elelthvd 0:320d96eb6974 141 // lose data when used with the WiFly. Note that flow control
elelthvd 0:320d96eb6974 142 // needs to be enabled on the WiFly for this to work but it's
elelthvd 0:320d96eb6974 143 // possible to do that with flow control enabled here but not there.
elelthvd 0:320d96eb6974 144 // serial_bridge.set_flow_control(SC16IS740::RTSCTS);
elelthvd 0:320d96eb6974 145
elelthvd 0:320d96eb6974 146 // Not available of SC16IS740:
elelthvd 0:320d96eb6974 147 // serial_bridge.ioSetDirection(0xFF); // All outputs
elelthvd 0:320d96eb6974 148 // serial_bridge.ioSetState(0xFF); // All On
elelthvd 0:320d96eb6974 149
elelthvd 0:320d96eb6974 150 show_menu();
elelthvd 0:320d96eb6974 151
elelthvd 0:320d96eb6974 152 while (running) {
elelthvd 0:320d96eb6974 153 // heartbeat_beat();
elelthvd 0:320d96eb6974 154
elelthvd 0:320d96eb6974 155 if (pc.readable()) {
elelthvd 0:320d96eb6974 156 // pc.read( & command, 1);
elelthvd 0:320d96eb6974 157 command = getchar();
elelthvd 0:320d96eb6974 158
elelthvd 0:320d96eb6974 159 printf("command= %c \r\n", command);
elelthvd 0:320d96eb6974 160
elelthvd 0:320d96eb6974 161 switch (command) {
elelthvd 0:320d96eb6974 162 case '0':
elelthvd 0:320d96eb6974 163 printf("Done\r\n");
elelthvd 0:320d96eb6974 164 running = false;
elelthvd 0:320d96eb6974 165 break;
elelthvd 0:320d96eb6974 166
elelthvd 0:320d96eb6974 167 case '1':
elelthvd 0:320d96eb6974 168 show_menu();
elelthvd 0:320d96eb6974 169 break;
elelthvd 0:320d96eb6974 170
elelthvd 0:320d96eb6974 171 case '2':
elelthvd 0:320d96eb6974 172 printf("Hardware Reset\r\n");
elelthvd 0:320d96eb6974 173 serial_bridge.hwReset(); //test
elelthvd 0:320d96eb6974 174
elelthvd 0:320d96eb6974 175 printf("Init\r\n");
elelthvd 0:320d96eb6974 176 serial_bridge._init();
elelthvd 0:320d96eb6974 177 printf("Hardware Init done\r\n");
elelthvd 0:320d96eb6974 178 break;
elelthvd 0:320d96eb6974 179
elelthvd 0:320d96eb6974 180 case '3':
elelthvd 0:320d96eb6974 181 printf("IO Port Out\r\n");
elelthvd 0:320d96eb6974 182
elelthvd 0:320d96eb6974 183 i = 0;
elelthvd 0:320d96eb6974 184 while (!pc.readable()) {
elelthvd 0:320d96eb6974 185 serial_bridge.ioSetState(~i);
elelthvd 0:320d96eb6974 186 // serial_bridge.ioGetState() ; //test
elelthvd 0:320d96eb6974 187 thread_sleep_for(500);
elelthvd 0:320d96eb6974 188 printf("*");
elelthvd 0:320d96eb6974 189 i = (i + 1) & 0xFF;
elelthvd 0:320d96eb6974 190 }
elelthvd 0:320d96eb6974 191
elelthvd 0:320d96eb6974 192 pc.read( & ch, 1);
elelthvd 0:320d96eb6974 193 printf("IO Port Out Done\r\n");
elelthvd 0:320d96eb6974 194 break;
elelthvd 0:320d96eb6974 195
elelthvd 0:320d96eb6974 196 case '4':
elelthvd 0:320d96eb6974 197 printf("Transparant Mode, Enter '#' to quit...\r\n");
elelthvd 0:320d96eb6974 198
elelthvd 0:320d96eb6974 199 running_test = true;
elelthvd 0:320d96eb6974 200
elelthvd 0:320d96eb6974 201 while (running_test) {
elelthvd 0:320d96eb6974 202 // From SPI/I2C to serial
elelthvd 0:320d96eb6974 203 while (running_test && pc.readable()) {
elelthvd 0:320d96eb6974 204 // pc.read( & ch, 1);
elelthvd 0:320d96eb6974 205 ch = getchar();
elelthvd 0:320d96eb6974 206 running_test = (ch != '#');
elelthvd 0:320d96eb6974 207 serial_bridge.putc(ch);
elelthvd 0:320d96eb6974 208 }
elelthvd 0:320d96eb6974 209
elelthvd 0:320d96eb6974 210 // From Serial to SPI/I2C
elelthvd 0:320d96eb6974 211 while (running_test && serial_bridge.readable()) {
elelthvd 0:320d96eb6974 212 ch = serial_bridge.getc();
elelthvd 0:320d96eb6974 213 running_test = (ch != '#');
elelthvd 0:320d96eb6974 214 printf("%s", & ch);
elelthvd 0:320d96eb6974 215 }
elelthvd 0:320d96eb6974 216
elelthvd 0:320d96eb6974 217 }
elelthvd 0:320d96eb6974 218
elelthvd 0:320d96eb6974 219 printf("\r\nTransparant Mode done\r\n");
elelthvd 0:320d96eb6974 220 break;
elelthvd 0:320d96eb6974 221
elelthvd 0:320d96eb6974 222 case '5':
elelthvd 0:320d96eb6974 223 printf("Available for Reading = %3d (Free Space = %3d)\r\n", serial_bridge.readableCount(), SC16IS740_FIFO_RX - serial_bridge.readableCount());
elelthvd 0:320d96eb6974 224 printf("Available for Writing = %3d (Used Space = %3d)\r\n", serial_bridge.writableCount(), SC16IS740_FIFO_TX - serial_bridge.writableCount());
elelthvd 0:320d96eb6974 225 break;
elelthvd 0:320d96eb6974 226
elelthvd 0:320d96eb6974 227 case '6':
elelthvd 0:320d96eb6974 228 printf("Enable RTS/CTS\r\n");
elelthvd 0:320d96eb6974 229 serial_bridge.set_flow_control(SC16IS740::RTSCTS);
elelthvd 0:320d96eb6974 230 break;
elelthvd 0:320d96eb6974 231 case '7':
elelthvd 0:320d96eb6974 232 printf("Disable RTS/CTS\r\n");
elelthvd 0:320d96eb6974 233 serial_bridge.set_flow_control(SC16IS740::Disabled);
elelthvd 0:320d96eb6974 234 break;
elelthvd 0:320d96eb6974 235
elelthvd 0:320d96eb6974 236 case '8':
elelthvd 0:320d96eb6974 237 printf("Write block\r\n");
elelthvd 0:320d96eb6974 238 serial_bridge.writeString("Hello World from mbed and SC16IS740\r\n");
elelthvd 0:320d96eb6974 239 break;
elelthvd 0:320d96eb6974 240
elelthvd 0:320d96eb6974 241 case '9':
elelthvd 0:320d96eb6974 242 printf("Baudrate = 9600, Divisor = %d\r\n", (int) SC16IS740_BAUDRATE_DIVISOR(9600));
elelthvd 0:320d96eb6974 243 serial_bridge.baud(9600);
elelthvd 0:320d96eb6974 244 break;
elelthvd 0:320d96eb6974 245
elelthvd 0:320d96eb6974 246 case 'a':
elelthvd 0:320d96eb6974 247 case 'A':
elelthvd 0:320d96eb6974 248 printf("Baudrate = 115200, Divisor = %d\r\n", (int) SC16IS740_BAUDRATE_DIVISOR(115200));
elelthvd 0:320d96eb6974 249 serial_bridge.baud(115200);
elelthvd 0:320d96eb6974 250 break;
elelthvd 0:320d96eb6974 251
elelthvd 0:320d96eb6974 252 case 'b':
elelthvd 0:320d96eb6974 253 case 'B':
elelthvd 0:320d96eb6974 254 printf("Transparant Mode with buffer display, Enter '#' to quit...\r\n");
elelthvd 0:320d96eb6974 255
elelthvd 0:320d96eb6974 256 running_test = true;
elelthvd 0:320d96eb6974 257
elelthvd 0:320d96eb6974 258 while (running_test) {
elelthvd 0:320d96eb6974 259 // From SPI/I2C to serial
elelthvd 0:320d96eb6974 260 while (running_test && pc.readable()) {
elelthvd 0:320d96eb6974 261 // pc.read( & ch, 1);
elelthvd 0:320d96eb6974 262 ch = getchar();
elelthvd 0:320d96eb6974 263 running_test = (ch != '#');
elelthvd 0:320d96eb6974 264 serial_bridge.putc(ch);
elelthvd 0:320d96eb6974 265
elelthvd 0:320d96eb6974 266 // // Show buffers when character was entered
elelthvd 0:320d96eb6974 267 // printf("\r\n");
elelthvd 0:320d96eb6974 268 // printf("Available for Reading = %3d (Free Space = %3d)\r\n", serial_bridge.readableCount(), SC16IS740_FIFO_RX - serial_bridge.readableCount());
elelthvd 0:320d96eb6974 269 // printf("Available for Writing = %3d (Used Space = %3d)\r\n", serial_bridge.writableCount(), SC16IS740_FIFO_TX - serial_bridge.writableCount());
elelthvd 0:320d96eb6974 270 }
elelthvd 0:320d96eb6974 271
elelthvd 0:320d96eb6974 272 // From Serial to SPI/I2C
elelthvd 0:320d96eb6974 273 while (running_test && serial_bridge.readable()) {
elelthvd 0:320d96eb6974 274 ch = serial_bridge.getc();
elelthvd 0:320d96eb6974 275 running_test = (ch != '#');
elelthvd 0:320d96eb6974 276 putchar(ch);
elelthvd 0:320d96eb6974 277 // printf("%s", & ch);
elelthvd 0:320d96eb6974 278 }
elelthvd 0:320d96eb6974 279
elelthvd 0:320d96eb6974 280 }
elelthvd 0:320d96eb6974 281
elelthvd 0:320d96eb6974 282 printf("\r\nTransparant Mode done\r\n");
elelthvd 0:320d96eb6974 283 break;
elelthvd 0:320d96eb6974 284
elelthvd 0:320d96eb6974 285 case 'c':
elelthvd 0:320d96eb6974 286 case 'C':
elelthvd 0:320d96eb6974 287 printf("Test printf() \r\n");
elelthvd 0:320d96eb6974 288
elelthvd 0:320d96eb6974 289 serial_bridge.printf("Available for Reading = %3d (Free Space = %3d)\r\n", serial_bridge.readableCount(), SC16IS740_FIFO_RX - serial_bridge.readableCount());
elelthvd 0:320d96eb6974 290 serial_bridge.printf("Available for Writing = %3d (Used Space = %3d)\r\n", serial_bridge.writableCount(), SC16IS740_FIFO_TX - serial_bridge.writableCount());
elelthvd 0:320d96eb6974 291
elelthvd 0:320d96eb6974 292 printf("\r\nTest printf() done\r\n");
elelthvd 0:320d96eb6974 293 break;
elelthvd 0:320d96eb6974 294 case 'd':
elelthvd 0:320d96eb6974 295 case 'D':
elelthvd 0:320d96eb6974 296 printf("Test connected\r\n");
elelthvd 0:320d96eb6974 297 if (!serial_bridge.connected()) {
elelthvd 0:320d96eb6974 298 printf("Failed to detect UART bridge\r\n");
elelthvd 0:320d96eb6974 299 } else {
elelthvd 0:320d96eb6974 300 printf("Found UART bridge!\r\n");
elelthvd 0:320d96eb6974 301 }
elelthvd 0:320d96eb6974 302 break;
elelthvd 0:320d96eb6974 303 case 'e':
elelthvd 0:320d96eb6974 304 case 'E':
elelthvd 0:320d96eb6974 305 printf("Clear Screen\r\n");
elelthvd 0:320d96eb6974 306 clear_screen();
elelthvd 0:320d96eb6974 307 break;
elelthvd 0:320d96eb6974 308 case 'f':
elelthvd 0:320d96eb6974 309 case 'F':
elelthvd 0:320d96eb6974 310 printf("Funky ANSI\r\n");
elelthvd 0:320d96eb6974 311 funky_ansi();
elelthvd 0:320d96eb6974 312 break;
elelthvd 0:320d96eb6974 313 case 'g':
elelthvd 0:320d96eb6974 314 case 'G':
elelthvd 0:320d96eb6974 315 printf("Heart Beat\r\n");
elelthvd 0:320d96eb6974 316 // heartbeat_beat();
elelthvd 0:320d96eb6974 317 heartbeatLED = ! heartbeatLED;
elelthvd 0:320d96eb6974 318 break;
elelthvd 0:320d96eb6974 319 default:
elelthvd 0:320d96eb6974 320 break;
elelthvd 0:320d96eb6974 321
elelthvd 0:320d96eb6974 322 } //switch
elelthvd 0:320d96eb6974 323 } //if
elelthvd 0:320d96eb6974 324 } //while
elelthvd 0:320d96eb6974 325
elelthvd 0:320d96eb6974 326 printf("\nBye World!\n");
elelthvd 0:320d96eb6974 327 }