<table id="dg_equal" class="table-datagrid"></table> 设置可以编辑
时间: 2023-07-06 18:30:01 浏览: 49
要使表格 `#dg_equal` 可以编辑,需要确保以下几点:
1. 引入 EasyUI 的相关库文件,例如 `jquery.easyui.min.js` 和 `jquery.easyui.min.css`。
2. 引入 EasyUI 的编辑器插件,例如 `jquery.edatagrid.js`。
3. 在表格属性中添加 `editable: true`,例如:
```html
<table id="dg_equal" class="table-datagrid" editable="true"></table>
```
然后,在 JavaScript 中初始化表格,并启用编辑模式,例如:
```javascript
$('#dg_equal').edatagrid({
url: 'get_data.php',
saveUrl: 'save_data.php',
updateUrl: 'update_data.php',
destroyUrl: 'delete_data.php',
columns: [[
{field:'id',title:'ID',width:100,hidden:true},
{field:'name',title:'Name',width:100},
{field:'age',title:'Age',width:100,align:'right'}
]]
});
```
这样就可以将表格 `#dg_equal` 设置为可编辑状态了。
相关问题
void button_handler(struct Button* handle) { uint8_t read_gpio_level = handle->hal_button_Level(handle->button_id); //ticks counter working.. if((handle->state) > 0) handle->ticks++; /*------------button debounce handle---------------*/ if(read_gpio_level != handle->button_level) { //not equal to prev one //continue read 3 times same new level change if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) { handle->button_level = read_gpio_level; handle->debounce_cnt = 0; } } else { //leved not change ,counter reset. handle->debounce_cnt = 0; } /*-----------------State machine-------------------*/ switch (handle->state) { case 0: if(handle->button_level == handle->active_level) { //start press down handle->event = (uint8_t)PRESS_DOWN; EVENT_CB(PRESS_DOWN); handle->ticks = 0; handle->repeat = 1; handle->state = 1; } else { handle->event = (uint8_t)NONE_PRESS; } break; case 1: if(handle->button_level != handle->active_level) { //released press up handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); handle->ticks = 0; handle->state = 2; } else if(handle->ticks > LONG_TICKS) { handle->event = (uint8_t)LONG_PRESS_START; EVENT_CB(LONG_PRESS_START); handle->state = 5; } break; case 2: if(handle->button_level == handle->active_level) { //press down again handle->event = (uint8_t)PRESS_DOWN; EVENT_CB(PRESS_DOWN); handle->repeat++; EVENT_CB(PRESS_REPEAT); // repeat hit handle->ticks = 0; handle->state = 3; } else if(handle->ticks > SHORT_TICKS) { //released timeout if(handle->repeat == 1) { handle->event = (uint8_t)SINGLE_CLICK; EVENT_CB(SINGLE_CLICK); } else if(handle->repeat == 2) { handle->event = (uint8_t)DOUBLe_CLICK; EVENT_CB(DOUBLe_CLICK); // repeat hit } handle->state = 0; } break; case 3: if(handle->button_level != handle->active_level) { //released press up handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); if(handle->ticks < SHORT_TICKS) { handle->ticks = 0; handle->state = 2; //repeat press } else { handle->state = 0; } }else if(handle->ticks > SHORT_TICKS){ // long press up handle->state = 0; } break; case 5: if(handle->button_level == handle->active_level) { //continue hold trigger handle->event = (uint8_t)LONG_PRESS_HOLD; EVENT_CB(LONG_PRESS_HOLD); } else { //releasd handle->event = (uint8_t)PRESS_UP; EVENT_CB(PRESS_UP); handle->state = 0; //reset } break; default: handle->state = 0; //reset break; } }帮我详细注释这段代码
这段代码是一个按键处理函数,主要用于处理按键的状态和事件。下面是对代码的详细注释:
```c
void button_handler(struct Button* handle) {
// 读取按键GPIO端口的电平值
uint8_t read_gpio_level = handle->hal_button_Level(handle->button_id);
// 计数器开始工作
if((handle->state) > 0) handle->ticks++;
/*------------按键消抖处理---------------*/
if(read_gpio_level != handle->button_level) { //如果读到的电平值不同于之前的
//连续读取3次相同的电平值
if(++(handle->debounce_cnt) >= DEBOUNCE_TICKS) {
handle->button_level = read_gpio_level; //更新电平值
handle->debounce_cnt = 0; //重置消抖计数器
}
} else { //如果电平值没有变化,重置消抖计数器
handle->debounce_cnt = 0;
}
/*-----------------状态机处理-------------------*/
switch (handle->state) {
case 0: //初始状态
if(handle->button_level == handle->active_level) { //按键按下
handle->event = (uint8_t)PRESS_DOWN; //设置按键事件
EVENT_CB(PRESS_DOWN); //触发事件回调函数
handle->ticks = 0; //重置计数器
handle->repeat = 1; //重置按键重复次数
handle->state = 1; //进入下一个状态
} else {
handle->event = (uint8_t)NONE_PRESS; //没有按键按下
}
break;
case 1: //按键按下状态
if(handle->button_level != handle->active_level) { //按键松开
handle->event = (uint8_t)PRESS_UP; //设置按键事件
EVENT_CB(PRESS_UP); //触发事件回调函数
handle->ticks = 0; //重置计数器
handle->state = 2; //进入下一个状态
} else if(handle->ticks > LONG_TICKS) { //按键按下超过长按时间
handle->event = (uint8_t)LONG_PRESS_START; //设置按键事件
EVENT_CB(LONG_PRESS_START); //触发事件回调函数
handle->state = 5; //进入下一个状态
}
break;
case 2: //单次按键按下后的状态
if(handle->button_level == handle->active_level) { //按键再次按下
handle->event = (uint8_t)PRESS_DOWN; //设置按键事件
EVENT_CB(PRESS_DOWN); //触发事件回调函数
handle->repeat++; //增加按键重复次数
EVENT_CB(PRESS_REPEAT); //触发按键重复事件回调函数
handle->ticks = 0; //重置计数器
handle->state = 3; //进入下一个状态
} else if(handle->ticks > SHORT_TICKS) { //按键松开超过短按时间
if(handle->repeat == 1) { //单击事件
handle->event = (uint8_t)SINGLE_CLICK; //设置按键事件
EVENT_CB(SINGLE_CLICK); //触发事件回调函数
} else if(handle->repeat == 2) { //双击事件
handle->event = (uint8_t)DOUBLE_CLICK; //设置按键事件
EVENT_CB(DOUBLE_CLICK); //触发事件回调函数
}
handle->state = 0; //回到初始状态
}
break;
case 3: //按键重复状态
if(handle->button_level != handle->active_level) { //按键松开
handle->event = (uint8_t)PRESS_UP; //设置按键事件
EVENT_CB(PRESS_UP); //触发事件回调函数
if(handle->ticks < SHORT_TICKS) { //按键松开时间小于短按时间
handle->ticks = 0; //重置计数器
handle->state = 2; //回到单次按键按下后的状态
} else { //按键松开时间大于等于短按时间
handle->state = 0; //回到初始状态
}
} else if(handle->ticks > SHORT_TICKS){ //按键按下时间大于短按时间
handle->state = 0; //回到初始状态
}
break;
case 5: //长按状态
if(handle->button_level == handle->active_level) { //按键继续按下
handle->event = (uint8_t)LONG_PRESS_HOLD; //设置按键事件
EVENT_CB(LONG_PRESS_HOLD); //触发事件回调函数
} else { //按键松开
handle->event = (uint8_t)PRESS_UP; //设置按键事件
EVENT_CB(PRESS_UP); //触发事件回调函数
handle->state = 0; //回到初始状态
}
break;
default: //其他状态,回到初始状态
handle->state = 0;
break;
}
}
```
改进以下代码,使机器人的运动轨迹为一个半径为3的圆clear; close all; clc %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % diff_vel p2p Motion Control 两轮差速任意姿态到达目标点 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% input 输入 % Goal -----------目标位姿 % r --------------驱动轮半径(m) % l --------------轮间距,两驱动轮中心间距(m) % InitPos --------初始位姿 % goal_rad -------目标半径(m) % lin_vel_lim ----速度限幅(m/s) % lin_acc_lim ----加速度限幅(m/s^2) % ang_vel_lim ----角速度限幅(rad/s) % ang_acc_lim ----角加速度限幅(rad/s^2) % ctrl_fre -------控制频率(hz) % max_sim_time ---最大仿真时长(s) %% output 输出 % lin_vel --------车体线速度(m/s) % ang_vel --------车体角速度(rad/s)(右手定则) % theta ----------姿态角(rad) % v_l ------------左轮转动线速度(m/s) % v_r ------------右轮转动线速度(m/s) % phiL -----------左轮正方向转动角速度,记反转速度为负值(rad/s) % phiR -----------右轮正方向转动角速度,记反转速度为负值(rad/s) %% 位姿信息 % Pos = [x, y ,theta] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 仿真开始 InitPos = [1, 0, 0]; Goal = [5,4,0]; r = 0.15; l = 0.4; goal_rad = 0.05; ctrl_fre = 100; max_sim_time = 100; lin_vel_lim = 1.2; lin_acc_lim = lin_vel_lim/2; ang_vel_lim = 1.5; ang_acc_lim = 0.8; sim('diff_vel_motion_ctrl_system.slx'); PlotTracking; %画图
可以将机器人运动的目标点改为固定的圆周上的点,以实现运动轨迹为一个半径为3的圆。具体步骤如下:
1. 定义一个固定圆心为(0,0)、半径为3的圆,假设圆心角为theta。
2. 每次仿真时,将机器人的目标点设置为圆上的点(x,y),其中x=3*cos(theta)、y=3*sin(theta)。
3. 每次仿真时,将theta增加一个固定值delta_theta,使机器人沿着圆周运动。
修改后的代码如下:
clear;
close all;
clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% diff_vel p2p Motion Control 两轮差速任意姿态到达目标点
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% input 输入
% Goal -----------目标位姿
% r --------------驱动轮半径(m)
% l --------------轮间距,两驱动轮中心间距(m)
% InitPos --------初始位姿
% goal_rad -------目标半径(m)
% lin_vel_lim ----速度限幅(m/s)
% lin_acc_lim ----加速度限幅(m/s^2)
% ang_vel_lim ----角速度限幅(rad/s)
% ang_acc_lim ----角加速度限幅(rad/s^2)
% ctrl_fre -------控制频率(hz)
% max_sim_time ---最大仿真时长(s)
%% output 输出
% lin_vel --------车体线速度(m/s)
% ang_vel --------车体角速度(rad/s)(右手定则)
% theta ----------姿态角(rad)
% v_l ------------左轮转动线速度(m/s)
% v_r ------------右轮转动线速度(m/s)
% phiL -----------左轮正方向转动角速度,记反转速度为负值(rad/s)
% phiR -----------右轮正方向转动角速度,记反转速度为负值(rad/s)
%% 位姿信息
% Pos = [x, y ,theta]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 仿真开始
InitPos = [1, 0, 0];
r = 0.15;
l = 0.4;
goal_rad = 0.05;
ctrl_fre = 100;
max_sim_time = 100;
lin_vel_lim = 1.2;
lin_acc_lim = lin_vel_lim/2;
ang_vel_lim = 1.5;
ang_acc_lim = 0.8;
delta_theta = pi/100; % 每次增加的圆心角
sim_time = 0;
theta = 0;
while sim_time < max_sim_time
sim('diff_vel_motion_ctrl_system.slx');
PlotTracking;
theta = theta + delta_theta;
sim_time = sim_time + 1/ctrl_fre;
Goal = [3*cos(theta), 3*sin(theta), 0];
end
% 画图
function PlotTracking
hold on;
plot(Goal(1), Goal(2), 'ro', 'LineWidth', 2);
plot(Position(:,1), Position(:,2), 'b-', 'LineWidth', 2);
axis equal;
xlabel('x (m)');
ylabel('y (m)');
title('Robot Tracking');
drawnow;
end