/*
 * Copyright (c) 2002, Adam Dunkels.
 * All rights reserved. 
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above
 *    copyright notice, this list of conditions and the following
 *    disclaimer in the documentation and/or other materials provided
 *    with the distribution. 
 * 3. The name of the author may not be used to endorse or promote
 *    products derived from this software without specific prior
 *    written permission.  
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
 *
 * This file is part of the Contiki desktop environment
 *
 * $Id: libconio.c,v 1.6 2004/09/12 20:24:55 adamdunkels Exp $
 *
 */

#include <string.h>
#include "libconio.h"

#include "lib/textmode/textmode.h"

static unsigned char cursx, cursy;
static unsigned char color;

/*-----------------------------------------------------------------------------------*/
unsigned char
wherex(void)
{
  return cursx;
}
/*-----------------------------------------------------------------------------------*/
unsigned char
wherey(void)
{
  return cursy;
}
/*-----------------------------------------------------------------------------------*/
void
clrscr(void)
{
  memset(vram, 0, LIBCONIO_SCREEN_WIDTH * LIBCONIO_SCREEN_HEIGHT);
  memset(vram_attr, 0, LIBCONIO_SCREEN_WIDTH * LIBCONIO_SCREEN_HEIGHT);
}
/*-----------------------------------------------------------------------------------*/
void
revers(unsigned char c)
{
	if (c != 0) color |= 16;
	else color &= ~16;
}
/*-----------------------------------------------------------------------------------*/
void
cputc(char c)
{
  ctk_arch_draw_char(c, cursx, cursy, 0, color);
  ++cursx;
}
/*-----------------------------------------------------------------------------------*/
void
cputs(char *str)
{
  cursx += print_at(cursx, cursy, color, str);
}
/*-----------------------------------------------------------------------------------*/
void
cclear(unsigned char length)
{
	memset((uint8_t*)vram + cursy * LIBCONIO_SCREEN_WIDTH + cursx, 0, length);
	memset((uint8_t*)vram_attr + cursy * LIBCONIO_SCREEN_WIDTH + cursx, color, length);
	cursx += length;
}
/*-----------------------------------------------------------------------------------*/
void
chline(unsigned char length)
{
	memset((uint8_t*)vram + cursy * LIBCONIO_SCREEN_WIDTH + cursx, 196, length);
	memset((uint8_t*)vram_attr + cursy * LIBCONIO_SCREEN_WIDTH + cursx, color, length);
	cursx += length;
}
/*-----------------------------------------------------------------------------------*/
void
cvline(unsigned char length)
{
  int i;
  for(i = 0; i < length; ++i) {
    vram_attr[cursy][cursx] = color;
    vram[cursy++][cursx] = 179;
  }
}
/*-----------------------------------------------------------------------------------*/
void
gotoxy(unsigned char x, unsigned char y)
{
  cursx = x;
  cursy = y;
}
/*-----------------------------------------------------------------------------------*/
void
cclearxy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  cclear(length);
}
/*-----------------------------------------------------------------------------------*/
void
chlinexy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  chline(length);
}
/*-----------------------------------------------------------------------------------*/
void
cvlinexy(unsigned char x, unsigned char y, unsigned char length)
{
  gotoxy(x, y);
  cvline(length);
}
/*-----------------------------------------------------------------------------------*/
void
cputsxy(unsigned char x, unsigned char y, char *str)
{
  gotoxy(x, y);
  cputs(str);
}
/*-----------------------------------------------------------------------------------*/
void
cputcxy(unsigned char x, unsigned char y, char c)
{
  gotoxy(x, y);
  cputc(c);
}
/*-----------------------------------------------------------------------------------*/
void
textcolor(unsigned char c)
{
  color &= 16;
  color |= c;
}
/*-----------------------------------------------------------------------------------*/
void
bgcolor(unsigned char c)
{

}
/*-----------------------------------------------------------------------------------*/
void
bordercolor(unsigned char c)
{

}
/*-----------------------------------------------------------------------------------*/
void
screensize(unsigned char *x, unsigned char *y)
{
  *x = LIBCONIO_SCREEN_WIDTH;
  *y = LIBCONIO_SCREEN_HEIGHT;
}
/*-----------------------------------------------------------------------------------*/
