Login

Subversion Repositories NedoOS

Rev

Rev 1932 | Rev 2041 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <oscalls.h>
#include <osfs.h>
#include <intrz80.h>
#include <terminal.c>
#define RBR_THR 0xF8EF
#define IER 0xF9EF
#define IIR_FCR 0xFAEF
#define LCR 0xFBEF
#define MCR 0xFCEF
#define LSR 0xFDEF
#define MSR 0xFEEF
#define SR 0xFFEF

unsigned char key;
unsigned char buffer[8500] = "";
int bufferPos;
int endPos;
int curpos;
int oldpos;

void delay(unsigned long counter)
{
  unsigned long start, finish;
  counter = counter / 20;
  if (counter < 1)
  {
    counter = 1;
  }
  start = time();
  finish = start + counter;

  while (start < finish)
  {
    start = time();
  }
}

void uart_init(unsigned char divisor)
{
  output(MCR, 0x00);        // Disable input
  output(IIR_FCR, 0x87);    // Enable fifo 8 level, and clear it
  output(LCR, 0x83);        // 8n1, DLAB=1
  output(RBR_THR, divisor); // 115200 (divider 1-115200, 3 - 38400)
  output(IER, 0x00);        // (divider 0). Divider is 16 bit, so we get (#0002 divider)
  output(LCR, 0x03);        // 8n1, DLAB=0
  output(IER, 0x00);        // Disable int
}

void uart_write(unsigned char data)
{
  while ((input(LSR) & 32) >> 5 == 0)
  {
  }
  output(RBR_THR, data);
}

void uart_flashrts(void)
{
  disable_interrupt();
  output(MCR, 2);
  output(MCR, 0);
  enable_interrupt();
}

unsigned char uart_hasByte(void)
{
  unsigned char queue;
  queue = input(LSR);
  queue = queue & 1;
  return queue;
}

unsigned char uart_read(void)
{
  unsigned char data;
  data = input(RBR_THR);
  return data;
}

void getdata(void)
{
  unsigned char readbyte;
  uart_flashrts();
  while (uart_hasByte() != 0)
  {
    uart_flashrts();
    readbyte = uart_read();
    buffer[bufferPos] = readbyte;
    bufferPos++;
  }
  if (bufferPos > 8191)
  {
    endPos = bufferPos;
    bufferPos = 0;
  }
}

void renderWin(void)
{
  for (curpos = oldpos; curpos < bufferPos; curpos++)
  {
    putchar(buffer[curpos]);
  }
  oldpos = curpos;
}

void sendcommand(char commandline[])
{
  int pos = 0;
  while (commandline[pos] != '\0')
  {
    uart_write(commandline[pos]);
    pos++;
  }
  uart_write('\r');
  uart_write('\n');
  delay(100);
}

void saveBuff(void)
{
  int len;
  unsigned long size;
  FILE *fp1;
  unsigned char crlf[2] = {13, 10};
  fp1 = OS_OPENHANDLE("buffer.log", 0x80);
  if (((int)fp1) & 0xff)
  {
    puts("Open buffer.log error");
    puts("Creating buffer.log file");
    fp1 = OS_CREATEHANDLE("buffer.log", 0x80);
    if (((int)fp1) & 0xff)
    {
      puts("Create buffer.log error");
      return;
    }
    OS_CLOSEHANDLE(fp1);
    fp1 = OS_OPENHANDLE("buffer.log", 0x80);
    if (((int)fp1) & 0xff)
    {
      puts("Open buffer.log error");
      return;
    }
  }
  size = OS_GETFILESIZE(fp1);
  len = curpos;
  OS_SEEKHANDLE(fp1, size);
  OS_WRITEHANDLE(crlf, fp1, 2);
  OS_WRITEHANDLE("********************************************************************************", fp1, 80);
  OS_WRITEHANDLE(crlf, fp1, 2);
  OS_WRITEHANDLE(buffer, fp1, len);
  OS_CLOSEHANDLE(fp1);
  puts("buffer.log saved.");
}

void flushbuf(void)
{
  while (uart_hasByte() != 0)
  {
    uart_read();
  }
}

void testQueue(void)
{
  unsigned char cmd[6000];
  sendcommand("AT+CIPMUX=0\0");
  sendcommand("AT+CIPSERVER=0\0");
  sendcommand("AT+CIPDINFO=0\0");
  sendcommand("AT+CIPRECVMODE=1\0");
  sendcommand("AT+CIPSTART=\"TCP\",\"ti6.nedopc.com\",80\0");
  delay(1000);
  strcpy(cmd, "AT+CIPSEND=");
  strcat(cmd, "132\0");
  sendcommand(cmd);
  sendcommand("GET /attachments/pages/your_game6_160.png HTTP/1.1\r\nHost: ti6.nedopc.com\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE5.01; NedoOS)\r\n\0");
  delay(1000);
  sendcommand("AT+CIPRECVDATA=5000\0");
}
C_task main(void)
{
  unsigned char cmd[256];
  unsigned char cmdpos;
  os_initstdio();
  BOX(1, 1, 80, 25, 40);
  AT(1, 1);
  ATRIB(92);
  puts("EVO UART TESTER. SEND AND RECEIVE BYTES.");
  uart_init(1);
  puts("Uart inited @ 115200\r\n");
  delay(250);
  cmd[0] = '\0';
  cmdpos = 0;
  while (1)
  {
    unsigned char count;
    getdata();
    renderWin();
    key = _low_level_get();
    if (key != 0)
    {
      // printf("key = %u   ", key);
      switch (key)
      {
      case 177:
        uart_init(1);
        puts("Uart inited @ 115200");
        key = 0;
        break;

      case 178:
        uart_init(2);
        puts("Uart inited @ 57600");
        key = 0;
        break;

      case 179:
        uart_init(3);
        puts("Uart inited @ 38400");
        key = 0;
        break;

      case 180:
        uart_init(4);
        puts("Uart inited @ 28800");
        key = 0;
        break;

      case 181:
        uart_init(6);
        puts("Uart inited @ 19200");
        key = 0;
        break;

      case 182:
        uart_init(8);
        puts("Uart inited @ 14400");
        key = 0;
        break;

      case 183:
        uart_init(12);
        puts("Uart inited @ 9600");
        key = 0;
        break;

      case 184:
        uart_init(24);
        puts("Uart inited @ 4800");
        key = 0;
        break;

      case 185:
        uart_init(48);
        puts("Uart inited @ 2400");
        key = 0;
        break;

      case 176:
        uart_init(96);
        puts("Uart inited @ 1200");
        key = 0;
        break;

      case 13:
        cmd[cmdpos] = '\0';
        sendcommand(cmd);
        cmdpos = 0;
        cmd[cmdpos] = '\0';
        putchar('\r');
        putchar('\n');
        key = 0;
        break;

      case 19:
        saveBuff();
        key = 0;
        break;

      case 27:
        exit(0);

      case 8:
        if (cmdpos != 0)
        {
          cmdpos--;
          cmd[cmdpos] = '\0';
          putchar('\r');
          for (count = 0; count < cmdpos + 1; count++)
          {
            putchar(' ');
          }
          putchar('\r');
          count = 0;
          while (cmd[count] != '\0')
          {
            putchar(cmd[count]);
            count++;
          }
        }
        key = 0;
        break;

      case 246: // +
        sendcommand("AT+GMR\0");
        key = 0;
        break;

      case 247: // -
        key = 0;
        break;

      case 28: // home
        testQueue();
        key = 0;
        break;
      }
    }

    if (key != 0)
    {
      cmd[cmdpos] = key;
      cmdpos++;
      putchar(key);
    }
  }
  return 0;
}