 /********************************************************************************
*********************************************************************************
*Projeto:	TCgertec
*Arquivo:	images.c
*Descrição:	Responsável por enviar a lista de imagens (TC505) e montar as imagens (TC504)
*Data da Criação:	01/06/2006

*Revisão:	1.0
*Data:		01/06/2006
*Modificações:

**********************************************************************************
**********************************************************************************

Funções e procedimentos utilizados no arquivo

int extractfnlp(char *str, char *filename, int *loop, int *pause)
void SendImageList(int ID)
int SendImage(int ID, char *file)

********************************************************************************/

/*-------------------------------------------------------------------------------
			INCLUDES
-------------------------------------------------------------------------------*/
 
 #include <stdio.h>
 #include <string.h>
 #include "images.h" // Contém os tipos de dados
 
 /********************************************************************************
>>>> extractfnlp(char *str, char *filename, int *loop, int *pause) <<<<
---------------------------------------------------------------------------------
*Função:	int extractfnlp(char *str, char *filename, int *loop, int *pause)
*Descrição:	Função que pega informações da string retirada do arquivo images.txt

*Entrada:	String completa
*Saída:		filemane: string com o nome do arquivo
		loop: pega o loop de imagens
		pause: pega o tempo de exibição da imagem

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/
 
int extractfnlp(char *str, char *filename, int *loop, int *pause)
{
	char temp[256];
	int ci;
	int ti;
	char car[2];
	char *ptr;

	strcpy(filename,str);
	ptr=strchr(filename,'|');
	if (ptr==NULL) 
		return 0;
	*ptr=0;
	ptr++;

	strcpy(temp,ptr);
	ptr=strchr(temp,'|');
	if (ptr==NULL)
		return 0;
	*ptr=0;
	ptr++;
	*loop=atoi(temp);

	strcpy(temp,ptr);
	ptr=strchr(temp,'|');
	if (ptr==NULL)
		return 0;
	*ptr=0;
	ptr++;
	*pause=atoi(temp);

	return 1;
}

/********************************************************************************
>>>> SendImageList(int ID) <<<<
---------------------------------------------------------------------------------
*Função:	unsigned short ConvertCor(char *cor)
*Descrição:	Monta a lista de imagens e envia para o terminal (TC505)

*Entrada:	ID do terminal que receberá as imagens
*Saída:		Nenhuma

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/

void SendImageList(int ID)
{
	char fn[256];
	char str[256];
	char temp[256];
	int loop;
	int pause;
	int cj;
	FILE *fp;

	int imgn;

	fp = fopen(".//images//images.txt","rt");//abre o arquivo da lista de propagandas
	if (fp == NULL)
		return;

	SendImageFromFile(ID,".//images//upd.bmp",128,64,8,0,0,0xfe); //Envia uma imagem para o terminal mostrando a atualização
	SendImageFromFile(ID,NULL,0,0,0,0xff,0,0);  //envia RESET das imagens

	imgn=1;
	while(fgets(str,sizeof(str),fp)!=NULL)
	{
		if (extractfnlp(str,fn,&loop,&pause)) //requisita as informações para o loop
		{
			sprintf(temp,".//images//%s",fn);
			SendImageFromFile(ID,temp,128,64,8,imgn,loop,pause); // envia a imagem para o terminal
		}
		imgn++;
	}
	fclose(fp);

	SendImageFromFile(ID,".//images//upd.bmp",128,64,8,0,0,0x00);
}

/********************************************************************************
>>>> SendImage(int ID, char *file) <<<<
---------------------------------------------------------------------------------
*Função:	int SendImage(int ID, char *file)
*Descrição:	Lê o arquivo BMP e manda a paleta de cores e a imagem para o terminal (TC504)

*Entrada:	file String com o nome do arquivo
		ID: ID do terminal que receberá a imagem
*Saída:		0-Erro
		1-Imagem enviada

*Data da Criação:	01/06/2006
*Modificações:

*Obs:

********************************************************************************/

int SendImage(int ID, char *file)
{
	FILE *img;
	BMFileheader header;
	int ci,index =0;
	
	char palBuff[1025];
	char Imagem[76800]; //Variável que receberá os dados da imagem
	char Paleta [768]; // Variável que receberá a paleta de cores
	
	int pos;
	
	unsigned char divbit;
	unsigned int numcolors;
	unsigned int palbytes = 4;
	
	if ((img = fopen(file,"r")) == NULL) // abre o arquivo de imagem
		return 0;
	else
	{
		fread(&header,sizeof(BMFileheader),1,img); //Lê o cabeçalho
		
		if (header.Type != 0x4D42) //Verifica se é um arquivo BMP
		{
			fclose(img);
			return 0;
		}
		switch(header.BitCount)
		{
			case 1: numcolors = 2; divbit = 3; break;
			case 4: numcolors = 16; divbit = 1; break;
			case 8: case 0: numcolors = 256; divbit = 0; break;
			case 24: numcolors = 24; divbit = 0; break;
			default: numcolors = 256; divbit = 0; header.BitCount = 8; break;
		}
		if (numcolors != 24)
		{
			fread(palBuff,numcolors*palbytes,1,img);//Lê a paleta de cores do arquivo
			
			//Monta a paleta de cores no formato necessário para o terminal TC504
			for (index=0;index<256;index++)
			{
				Paleta[(index*3)] = palBuff[(index*palbytes)+2]; //Red
				Paleta[(index*3)+1] = palBuff[(index*palbytes)+1]; //Green
				Paleta[(index*3)+2] = palBuff[index*palbytes]; //Blue
			}
			
			fseek(img,header.OffBits,SEEK_SET); //Vai até o inicio dos dados da imagem
			
			pos = 76800-320;
			
			//Monta os dados da imagem (é necessário inverter os dados dos arquivos BMP)
			for ( index=0 ; index<header.Height ; index++ )
			{
				fread(&Imagem[pos],320,1,img);
				pos -= 320;
			}
			SendImage_504(ID,Paleta,Imagem); // Imagem e paleta enviados para o terminal
			fclose(img);//fechando o arquivo de imagem
			return 1;
		}
	}
}
