Exemple #1
0
void cmd_ctrl_save(uint_least8_t interface, uint_least32_t baudrate, uint_least8_t address, uint_least8_t clock, uint_least8_t power, uint_least8_t byteorder, uint_least16_t fgcolor, uint_least16_t bgcolor)
{
  SETTINGS s;

#ifdef TP_SUPPORT
  CAL_MATRIX *tp;
  tp = tp_getmatrix();
  s.tp.a = tp->a;
  s.tp.b = tp->b;
  s.tp.c = tp->c;
  s.tp.d = tp->d;
  s.tp.e = tp->e;
  s.tp.f = tp->f;
  s.tp.div = tp->div;
#endif

  s.bgcolor   = bgcolor;
  s.fgcolor   = fgcolor; 
  s.byteorder = byteorder;
  s.address   = address;
  s.baudrate  = baudrate;
  s.interface = interface;
  s.power     = power;
  s.sysclock  = clock;
  s.magic     = 0xDEADBEEFUL;

  iap_write((uint32_t*)&s, (sizeof(s)/4), (uint32_t*)global_buffer); //size in 32bit words

  return;
}
Exemple #2
0
/* 
 * 文件写函数,包括要写的地址以及要写的长度
 * 例:fs_write(0x5000, 20, "1234567"); 向0x5000地址写入20字节的数据,内容为"1234567"
 */
void fs_write(unsigned char *name)
{
	xdata unsigned int reve_buf_len = 0;
	xdata unsigned char select_cmd = 0;
	xdata unsigned int pos_mod[2] = 0;
	xdata unsigned char pos_number = 0, i = 0;
	xdata unsigned int file_ptr = 0;
	xdata unsigned int file_number = 0;
	
	/* 获得要删除文件的地址 */
	if(file_ptr = find_file(fs_struct_ptr, name, 1))
	{
		/* 如果是个文件夹,退出 */
		if(iap_read(file_ptr) & 0x02)
		{
			printf("It is a floder\r\n");
			return;
		}
	}
	else
	{
		printf("No such file\r\n");
		return;
	}
	
	/* 如果文件里面已经有了内容,那么就不编辑 */
	if(find_file(file_ptr, "*", 1))
	{
		printf("There are texts in this file, please delete this file and create a new\r\n");
		return;
	}	
	
	while(1)
	{
		while(1)
		{				
			write_buff[reve_buf_len] = uart_reve_byte();	//接收到一个字符并存取到接收缓冲区里面
			if(write_buff[reve_buf_len] == 0) 			//如果没有接收到字串,继续查询
			{
				task_delay(2);							//延时两个任务周期,以便其他任务继续执行
				TF1 = 1;	//立马产生一个中断
			}
			else
				break;
		}

		if(reve_buf_len >= 500)	//由于每一个块要进行标记,所以要少2个字节,又要避免字符判断超限,干脆再减少2个字节
		{			
			printf("\r\nToo much words\r\n");		//用户输入的字符数量过多
			printf("Please save it now\r\n");
			goto wait_write_quit;		
		}	
		else
		{
			if(write_buff[reve_buf_len] == 0x1B)		//接收到ESC按键
			{
				write_buff[reve_buf_len] = '\0';
wait_write_quit:
				write_buff[reve_buf_len + 1] = '\0';
				printf("\r\n");
				while(1)
				{
					select_cmd = uart_wait_byte();
					putchar(select_cmd);
					if(select_cmd == 'w')
					{
//						printf(write_buff);
						goto write_buff2eeprom;	//如果是写入的话就跳到写入的程序入口
					}
					else if(select_cmd == 'q')
					{
						printf("you quit\r\n");
						return;
					}
					else
					{
						printf("\b \b");	//一直发送退格写空再退格,形成符合我们认知的退格
					}
				}
			}
			else if(write_buff[reve_buf_len] == '\b')	  	//接收到退格符
			{
				if(reve_buf_len > 0)
				{
					reve_buf_len --;
					printf("\b \b");
				}
			}
			else if(write_buff[reve_buf_len] == '\r')	  	//接收到换行符
			{
				printf("\r\n");
				reve_buf_len ++;
				write_buff[reve_buf_len] = '\n';
				reve_buf_len ++;
			}
			else
			{
				uart_send_byte(write_buff[reve_buf_len]);	//将刚刚接收到的一个字节并且发送给串口软件显示
				reve_buf_len ++;							//字串索引值加1
			}			
		}
	}

write_buff2eeprom:
ENTER_CRITICAL;	//需要长时间执行的程序要先进入临界段
	if(pos_number = alloc(reve_buf_len, pos_mod))
	{
		/* 跳过所有不需要设置的 */
		file_ptr = file_ptr + FS_FLAG_SIZE + FS_NAME_SIZE + FS_SIZE_SIZE + FS_PREV_SIZE + FS_NEXT_SIZE;
		
		/* 查找空的node节点 */
		for(i = 0; i < FS_NODE_SIZE; i += 2)
		{
			if(iap_read(file_ptr + i) == 0xFF)
			{
				for(file_number = 0; file_number < pos_number; file_number ++)
				{
					iap_write(file_ptr + i + file_number * 2, pos_mod[file_number] % 256);		//先写低地址
					iap_write(file_ptr + i + 1 + file_number * 2, pos_mod[file_number] / 256);	//再写高地址
					/* 打印文件在内存当中的位置 */
					putchar(((pos_mod[file_number]) >> 12) + 48);
					putchar((((pos_mod[file_number]) >> 8) & 0x0F) + 48);
					putchar((((pos_mod[file_number]) >> 4) & 0x0F) + 48);
					putchar((((pos_mod[file_number]) >> 0) & 0x0F) + 48);
				}
				break;	//写完退出
			}
		}

		i = pos_number; file_number = 0;
		while(i)
		{
			iap_write((pos_mod[pos_number-i])++, 0x00);
			iap_write((pos_mod[pos_number-i])++, 0x00);
			while(write_buff[file_number])
			{
				if(file_number > 508) 	//事实上不可能大于508
				{
					break;
				}
				iap_write((pos_mod[pos_number-i])++, write_buff[file_number]);
				file_number ++;
			}
			iap_write((pos_mod[pos_number-i])++, 0x00);	//文件的结尾写入空字符,代表文件的结束
			i --; 	//写入块数量减一
		}
		printf("\r\n");
	}