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; }
/* * 文件写函数,包括要写的地址以及要写的长度 * 例: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"); }