Dozingfiretruck 5 лет назад
Родитель
Сommit
76937222d7

+ 73 - 37
bsp/air640w/demo/61.u8g2/main.lua

@@ -5,8 +5,7 @@
 
 local sys = require("sys")
 
---[[ 注意,使用u8g2需将 LuatOS\bsp\air640w\rtt\applications\dfs_lfs2.c
-第78处修改为小文件系统,因为全汉字字库占用极大空间,否则将无法使用 ]]
+--[[ 注意:如需使用u8g2的全中文字库需将 luat_base.h中26行#define USE_U8G2_WQY12_T_GB2312 打开]]
 
 -- 项目信息,预留
 VERSION = "1.0.0"
@@ -16,54 +15,91 @@ PRODUCT_KEY = "1234567890"
 local TAG = "main"
 local last_temp_data = "0"
 
-----------------------------------------------------------------------
--- 对接SSD1306, 当前显示一行就好了
-function display_str(str,x,y)
-    u8g2.SetFont("u8g2_font_ncenB08_tr")
-    u8g2.ClearBuffer()
-    u8g2.DrawUTF8(str, x, y)
-    u8g2.SendBuffer()
-end
-
-function display_chinese(str,x,y)
-    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
-    u8g2.ClearBuffer()
-    u8g2.DrawUTF8(str, x, y)
-    u8g2.SendBuffer()
-end
-
 -- 初始化显示屏
 log.info(TAG, "init ssd1306")
 u8g2.begin("ssd1306")
 u8g2.SetFontMode(1)
-display_chinese("启动中",1,10)
+u8g2.ClearBuffer()
+u8g2.SetFont("u8g2_font_ncenB08_tr")
+u8g2.DrawUTF8("U8g2+LuatOS", 32, 22)
+u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+u8g2.DrawUTF8("中文测试", 40, 38)
+u8g2.SendBuffer()
 
 -- 联网主流程
 sys.taskInit(function()
-    log.info("u8g2.getWidth",u8g2.GetDisplayWidth())
-    log.info("u8g2.getHeight",u8g2.GetDisplayHeight())
-    u8g2.DrawLine(0,60,128,60)
-    u8g2.DrawCircle(60,30,8,15)
-    u8g2.DrawDisc(90,30,8,15)
-    u8g2.DrawEllipse(60,50,4,6,15)
-    u8g2.DrawFilledEllipse(90,50,4,6,15)
-
-    u8g2.DrawBox(10,25,4,5)
-    u8g2.DrawFrame(10,40,4,5)
-    u8g2.DrawRBox(20,25,4,6,2)
-    u8g2.DrawRFrame(40,40,4,6,2)
+    sys.wait(2000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("屏幕宽度", 20, 24)
+    u8g2.DrawUTF8("屏幕高度", 20, 42)
+    u8g2.SetFont("u8g2_font_ncenB08_tr")
+    u8g2.DrawUTF8(":"..u8g2.GetDisplayWidth(), 72, 24)
+    u8g2.DrawUTF8(":"..u8g2.GetDisplayHeight(), 72, 42)
+    u8g2.SendBuffer()
 
-    u8g2.SetFont("u8g2_font_unifont_t_symbols")
-    u8g2.DrawGlyph( 112, 56, 0x2603 )
+    sys.wait(2000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("画线测试:", 30, 24)
+    for i = 0, 128, 8 do
+        u8g2.DrawLine(0,40,i,40)
+        u8g2.DrawLine(0,60,i,60)
+        u8g2.SendBuffer()
+    end
+
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("画圆测试:", 30, 24)
+    u8g2.DrawCircle(30,50,10,15)
+    u8g2.DrawDisc(90,50,10,15)
+    u8g2.SendBuffer()
 
-    u8g2.DrawTriangle(90,5, 27,12, 5,32)
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("椭圆测试:", 30, 24)
+    u8g2.DrawEllipse(30,50,6,10,15)
+    u8g2.DrawFilledEllipse(90,50,6,10,15)
+    u8g2.SendBuffer()
 
-    u8g2.SetBitmapMode(0)
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("方框测试:", 30, 24)
+    u8g2.DrawBox(30,40,30,24)
+    u8g2.DrawFrame(90,40,30,24)
+    u8g2.SendBuffer()
 
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("圆角方框:", 30, 24)
+    u8g2.DrawRBox(30,40,30,24,8)
+    u8g2.DrawRFrame(90,40,30,24,8)
     u8g2.SendBuffer()
-    --u8g2.clear()
+
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("符号测试:", 30, 24)
+    u8g2.DrawUTF8("显示雪人", 30, 38)
+    u8g2.SetFont("u8g2_font_unifont_t_symbols")
+    u8g2.DrawGlyph( 50, 60, 0x2603 )
+    u8g2.SendBuffer()
+
+    sys.wait(1000)
+    u8g2.ClearBuffer()
+    u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
+    u8g2.DrawUTF8("三角测试:", 30, 24)
+    u8g2.DrawTriangle(30,60, 60,30, 90,60)
+    u8g2.SendBuffer()
+
+    sys.wait(3000)
+    u8g2.close()
     while true do
-        sys.wait(500)
+        sys.wait(1000)
     end
 end)
 

+ 5 - 5
bsp/air640w/rtt/applications/dfs_lfs2.c

@@ -1,5 +1,6 @@
 #include <rtdevice.h>
 #include <rtthread.h>
+#include <luat_base.h>
 
 #ifdef BSP_USING_WM_LIBRARIES
 
@@ -71,16 +72,15 @@ static struct rt_mutex _lfs_lock;
 #define lfs_dfs_lock()          rt_mutex_take(&_lfs_lock, RT_WAITING_FOREVER);
 #define lfs_dfs_unlock()        rt_mutex_release(&_lfs_lock);
 
-#if 1
-#define W600_FS_ADDR (0x00B0000)
-#define W600_FS_BCOUNT (64)
-#else
 // if enable chinese font in luat_lib_u8g2.c, use a smaller filesystem
+#if defined USE_U8G2_WQY12_T_GB2312
 #define W600_FS_ADDR (0x00D0000)
 #define W600_FS_BCOUNT (44)
+#else
+#define W600_FS_ADDR (0x00B0000)
+#define W600_FS_BCOUNT (64)
 #endif
 
-
 // Read a region in a block. Negative error codes are propogated
 // to the user.
 static int _lfs_flash_read(const struct lfs_config* c, lfs_block_t block, lfs_off_t off, void* buffer, lfs_size_t size)

+ 374 - 0
bsp/air640w/userdoc/u8g2_api.md

@@ -0,0 +1,374 @@
+***u8g2显示屏初始化***
+
+*@api u8g2.begin("ssd1306")*
+
+*@string 配置信息*
+
+*@return int 正常初始化1,已经初始化过2,内存不够3,初始化失败返回4*
+
+*@usage*
+
+*-- 初始化i2c1的ssd1306*
+
+*u8g2.begin("ssd1306")*
+
+
+
+***关闭显示屏***
+
+*@api u8g2.close()* 
+
+*@usage*
+
+*-- 关闭disp,再次使用disp相关API的话,需要重新初始化*
+
+*u8g2.close()*
+
+
+
+**清屏**
+
+*@api u8g2.ClearBuffer() 清除内存帧缓冲区中的所有像素。*
+
+*@usage*
+
+*u8g2.ClearBuffer()*
+
+
+
+**数据更新到屏幕**
+
+*@api u8g2.SendBuffer() 将存储器帧缓冲区的内容发送到显示器。*
+
+*@usage*
+
+*u8g2.SendBuffer()*
+
+
+
+**在显示屏上画一段文字**
+
+*@api u8g2.DrawUTF8(str, x, y)* *在显示屏上画一段文字,要调用u8g2.SendBuffer()才会更新到屏幕*
+
+*@string 文件内容*
+
+*@int 横坐标*
+
+*@int 竖坐标*
+
+*@usage*
+
+*u8g2.DrawUTF8("wifi is ready", 10, 20)*
+
+
+
+***设置字体模式***
+
+*@api u8g2.SetFontMode(mode)*
+
+*@int mode字体模式,启用(1)或禁用(0)透明模式*
+
+*@usage*
+
+*u8g2.SetFontMode(1)*
+
+
+
+***设置字体***
+
+*@api u8g2.SetFont(font)*
+
+*@string font, "u8g2_font_ncenB08_tr"为纯英文8x8字节,"u8g2_font_wqy12_t_gb2312"为12x12全中文,"u8g2_font_unifont_t_symbols"为符号.*
+
+*@usage*
+
+*-- 设置为中文字体,对之后的drawStr有效,使用中文字体需在luat_base.h开启#define USE_U8G2_WQY12_T_GB2312*
+
+*u8g2.setFont("u8g2_font_wqy12_t_gb2312")*
+
+
+
+***获取显示屏高度***
+
+*@api u8g2.GetDisplayHeight()*
+
+*@return int 显示屏高度*
+
+*@usage*
+
+u8g2.GetDisplayHeight()
+
+
+
+***获取显示屏宽度***
+
+*@api u8g2.GetDisplayWidth()*
+
+*@return int 显示屏宽度*
+
+*@usage*
+
+u8g2.GetDisplayWidth()
+
+
+
+***在两点之间画一条线.***
+
+*@api u8g2.DrawLine(x0,y0,x1,y1)*
+
+*@int 第一个点的X位置.*
+
+*@int 第一个点的Y位置.*
+
+*@int 第二个点的X位置.*
+
+*@int 第二个点的Y位置.*
+
+*@usage*
+
+*u8g2.DrawLine(20, 5, 5, 32)*
+
+
+
+***在x,y位置画一个半径为rad的空心圆.***
+
+*@api u8g2.DrawCircle(x0,y0,rad,opt)*
+
+*@int 圆心位置*
+
+*@int 圆心位置*
+
+*@int 圆半径.*
+
+*@int 选择圆的部分或全部.*
+
+*右上: 0x01*
+
+*左上: 0x02*
+
+*左下: 0x04*
+
+*右下: 0x08*
+
+*完整圆: (0x01|0x02|0x04|0x08)*
+
+*@usage*
+
+*u8g2.DrawCircle(60,30,8,15)*
+
+
+
+***在x,y位置画一个半径为rad的实心圆.***
+
+*@api u8g2.DrawDisc(x0,y0,rad,opt)*
+
+*@int 圆心位置*
+
+*@int 圆心位置*
+
+*@int 圆半径.*
+
+*@int 选择圆的部分或全部.*
+
+*右上: 0x01*
+
+*左上: 0x02*
+
+*左下: 0x04*
+
+*右下: 0x08*
+
+*完整圆: (0x01|0x02|0x04|0x08)*
+
+*@usage*
+
+*u8g2.DrawDisc(60,30,8,15)*
+
+
+
+***在x,y位置画一个半径为rad的空心椭圆.***
+
+*@api u8g2.DrawEllipse(x0,y0,rx,ry,opt)*
+
+*@int 圆心位置*
+
+*@int 圆心位置*
+
+*@int 椭圆大小*
+
+*@int 椭圆大小*
+
+*@int 选择圆的部分或全部.*
+
+*右上: 0x01*
+
+*左上: 0x02*
+
+*左下: 0x04*
+
+*右下: 0x08*
+
+*完整圆: (0x01|0x02|0x04|0x08)*
+
+*@usage*
+
+*u8g2.DrawEllipse(60,30,8,15)*
+
+
+
+***在x,y位置画一个半径为rad的实心椭圆.***
+
+*@api u8g2.DrawFilledEllipse(x0,y0,rx,ry,opt)*
+
+*@int 圆心位置*
+
+*@int 圆心位置*
+
+*@int 椭圆大小*
+
+*@int 椭圆大小*
+
+*@int 选择圆的部分或全部.*
+
+*右上: 0x01*
+
+*左上: 0x02*
+
+*左下: 0x04*
+
+*右下: 0x08*
+
+*完整圆: (0x01|0x02|0x04|0x08)*
+
+*@usage*
+
+*u8g2.DrawFilledEllipse(60,30,8,15)*
+
+
+
+***从x / y位置(左上边缘)开始绘制一个框(填充的框).***
+
+*@api u8g2.DrawBox(x,y,w,h)*
+
+*@int 左上边缘的X位置*
+
+*@int 左上边缘的Y位置*
+
+*@int 盒子的宽度*
+
+*@int 盒子的高度*
+
+*@usage*
+
+*u8g2.DrawBox(3,7,25,15)*
+
+
+
+***从x / y位置(左上边缘)开始绘制一个框(空框).***
+
+*@api u8g2.DrawFrame(x,y,w,h)*
+
+*@int 左上边缘的X位置*
+
+*@int 左上边缘的Y位置*
+
+*@int 盒子的宽度*
+
+*@int 盒子的高度*
+
+*@usage*
+
+*u8g2.DrawFrame(3,7,25,15)*
+
+
+
+***绘制一个从x / y位置(左上边缘)开始具有圆形边缘的填充框/框架.***
+
+*@api u8g2.DrawRBox(x,y,w,h,r)*
+
+*@int 左上边缘的X位置*
+
+*@int 左上边缘的Y位置*
+
+*@int 盒子的宽度*
+
+*@int 盒子的高度*
+
+*@int 四个边缘的半径*
+
+*@usage*
+
+*u8g2.DrawRBox(3,7,25,15)*
+
+
+
+***绘制一个从x / y位置(左上边缘)开始具有圆形边缘的空框/框架.***
+
+*@api u8g2.DrawRFrame(x,y,w,h,r)*
+
+*@int 左上边缘的X位置*
+
+*@int 左上边缘的Y位置*
+
+*@int 盒子的宽度*
+
+*@int 盒子的高度*
+
+*@int 四个边缘的半径*
+
+*@usage*
+
+*u8g2.DrawRFrame(3,7,25,15)*
+
+
+
+***绘制一个图形字符。字符放置在指定的像素位置x和y.***
+
+*@api u8g2.DrawGlyph(x,y,encoding)*
+
+*@int 字符在显示屏上的位置*
+
+*@int 字符在显示屏上的位置*
+
+*@int 字符的Unicode值*
+
+*@usage*
+
+*u8g2.SetFont(u8g2_font_unifont_t_symbols)*
+
+*u8g2.DrawGlyph(5, 20, 0x2603)  -- dec 9731/hex 2603 Snowman* 
+
+
+
+***绘制一个三角形(实心多边形).***
+
+*@api u8g2.DrawTriangle(x0,y0,x1,y1,x2,y2)*
+
+*@int 点0X位置*
+
+*@int 点0Y位置*
+
+*@int 点1X位置*
+
+*@int 点1Y位置*
+
+*@int 点2X位置*
+
+*@int 点2Y位置*
+
+*@usage*
+
+*u8g2.DrawTriangle(20,5, 27,50, 5,32)*
+
+
+
+***定义位图函数是否将写入背景色***
+
+*@api u8g2.SetBitmapMode(mode)*
+
+*@int mode字体模式,启用(1)或禁用(0)透明模式*
+
+*@usage*
+
+*u8g2.SetBitmapMode(1)*
+

+ 2 - 0
luat/include/luat_base.h

@@ -23,6 +23,8 @@
 #include "string.h"
 //-------------------------------
 
+#define USE_U8G2_WQY12_T_GB2312      //enable u8g2 chinese font
+
 //lua_State * luat_get_state();
 /**
  * LuatOS主入口函数, 从这里开始就交由LuatOS控制了.

+ 216 - 8
luat/modules/luat_lib_u8g2.c

@@ -23,6 +23,15 @@ static uint8_t i2c_id;
 static uint8_t i2c_addr = 0x3C;
 //static uint8_t spi_id;
 
+/*
+u8g2显示屏初始化
+@api u8g2.begin("ssd1306")
+@string 配置信息
+@return int 正常初始化1,已经初始化过2,内存不够3,初始化失败返回4
+@usage
+-- 初始化i2c1的ssd1306
+u8g2.begin("ssd1306")
+*/
 static int l_u8g2_begin(lua_State *L) {
     if (u8g2 != NULL) {
         LLOGW("disp is aready inited");
@@ -137,6 +146,13 @@ static int l_u8g2_begin(lua_State *L) {
     return 1;
 }
 
+/*
+关闭显示屏
+@api u8g2.close() 
+@usage
+-- 关闭disp,再次使用disp相关API的话,需要重新初始化
+u8g2.close()
+*/
 static int l_u8g2_close(lua_State *L) {
     if (u8g2_lua_ref != 0) {
         lua_geti(L, LUA_REGISTRYINDEX, u8g2_lua_ref);
@@ -150,18 +166,41 @@ static int l_u8g2_close(lua_State *L) {
     return 0;
 }
 
+/*
+清屏
+@api u8g2.ClearBuffer() 清除内存帧缓冲区中的所有像素。
+@usage
+-- 清屏
+u8g2.ClearBuffer()
+*/
 static int l_u8g2_ClearBuffer(lua_State *L) {
     if (u8g2 == NULL) return 0;
     u8g2_ClearBuffer(u8g2);
     return 0;
 }
 
+/*
+将数据更新到屏幕
+@api u8g2.SendBuffer() 将存储器帧缓冲区的内容发送到显示器。
+@usage
+-- 把显示数据更新到屏幕
+u8g2.SendBuffer()
+*/
 static int l_u8g2_SendBuffer(lua_State *L) {
     if (u8g2 == NULL) return 0;
     u8g2_SendBuffer(u8g2);
     return 0;
 }
 
+/*
+在显示屏上画一段文字
+@api u8g2.DrawUTF8(str, x, y) 在显示屏上画一段文字,要调用u8g2.SendBuffer()才会更新到屏幕
+@string 文件内容
+@int 横坐标
+@int 竖坐标
+@usage
+u8g2.DrawUTF8("wifi is ready", 10, 20)
+*/
 static int l_u8g2_DrawUTF8(lua_State *L) {
     if (u8g2 == NULL) {
         LLOGW("disp not init yet!!!");
@@ -178,10 +217,13 @@ static int l_u8g2_DrawUTF8(lua_State *L) {
     return 0;
 }
 
-#if defined USE_CHINESE_WQY12_FONT
-#include "u8g2_wqy.h"
-#endif
-
+/*
+设置字体模式
+@api u8g2.SetFontMode(mode)
+@int mode字体模式,启用(1)或禁用(0)透明模式
+@usage
+u8g2.SetFontMode(1)
+*/
 static int l_u8g2_SetFontMode(lua_State *L){
     if (u8g2 == NULL) return 0;
     int font_mode = luaL_checkinteger(L, 1);
@@ -192,25 +234,33 @@ static int l_u8g2_SetFontMode(lua_State *L){
     lua_pushboolean(L, 1);
     return 1;
 }
+
+/*
+设置字体
+@api u8g2.SetFont(font)
+@string font, "u8g2_font_ncenB08_tr"为纯英文8x8字节,"u8g2_font_wqy12_t_gb2312"为12x12全中文,"u8g2_font_unifont_t_symbols"为符号.
+@usage
+-- 设置为中文字体,对之后的drawStr有效,使用中文字体需在luat_base.h开启#define USE_U8G2_WQY12_T_GB2312
+u8g2.setFont("u8g2_font_wqy12_t_gb2312")
+*/
 static int l_u8g2_SetFont(lua_State *L) {
     if (u8g2 == NULL) {
         LLOGI("disp not init yet!!!");
         lua_pushboolean(L, 0);
         return 1;
     }
-
     size_t len;
-    size_t x, y;
     const char* font = luaL_checklstring(L, 1, &len);
-
     if (strcmp("u8g2_font_ncenB08_tr", font) == 0) {
         u8g2_SetFont(u8g2, u8g2_font_ncenB08_tr);
         lua_pushboolean(L, 1);
         }
+#if defined USE_U8G2_WQY12_T_GB2312
     else if (strcmp("u8g2_font_wqy12_t_gb2312", font) == 0) {
         u8g2_SetFont(u8g2, u8g2_font_wqy12_t_gb2312);
         lua_pushboolean(L, 1);
     }
+#endif
     else if (strcmp("u8g2_font_unifont_t_symbols", font) == 0) {
         u8g2_SetFont(u8g2, u8g2_font_unifont_t_symbols);
         lua_pushboolean(L, 1);
@@ -220,83 +270,241 @@ static int l_u8g2_SetFont(lua_State *L) {
     return 1;
 }
 
+/*
+获取显示屏高度
+@api u8g2.GetDisplayHeight()
+@return int 显示屏高度
+@usage
+u8g2.GetDisplayHeight()
+*/
 static int l_u8g2_GetDisplayHeight(lua_State *L){
     if (u8g2 == NULL) return 0;
     lua_pushinteger(L, u8g2_GetDisplayHeight(u8g2));
     return 1;
 }
 
+/*
+获取显示屏宽度
+@api u8g2.GetDisplayWidth()
+@return int 显示屏宽度
+@usage
+u8g2.GetDisplayWidth()
+*/
 static int l_u8g2_GetDisplayWidth(lua_State *L){
     if (u8g2 == NULL) return 0;
     lua_pushinteger(L, u8g2_GetDisplayWidth(u8g2));
     return 1;
 }
 
+/*
+在两点之间画一条线.
+@api u8g2.DrawLine(x0,y0,x1,y1)
+@int 第一个点的X位置.
+@int 第一个点的Y位置.
+@int 第二个点的X位置.
+@int 第二个点的Y位置.
+@usage
+u8g2.DrawLine(20, 5, 5, 32)
+*/
 static int l_u8g2_DrawLine(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawLine(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4));
     return 1;
 }
 
+/*
+在x,y位置画一个半径为rad的空心圆.
+@api u8g2.DrawCircle(x0,y0,rad,opt)
+@int 圆心位置
+@int 圆心位置
+@int 圆半径.
+@int 选择圆的部分或全部.
+右上: 0x01
+左上:  0x02
+左下: 0x04
+右下:  0x08
+完整圆: (0x01|0x02|0x04|0x08)
+@usage
+u8g2.DrawCircle(60,30,8,15)
+*/
 static int l_u8g2_DrawCircle(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawCircle(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4));
     return 1;
 }
 
-
+/*
+在x,y位置画一个半径为rad的实心圆.
+@api u8g2.DrawDisc(x0,y0,rad,opt)
+@int 圆心位置
+@int 圆心位置
+@int 圆半径.
+@int 选择圆的部分或全部.
+右上: 0x01
+左上:  0x02
+左下: 0x04
+右下:  0x08
+完整圆: (0x01|0x02|0x04|0x08)
+@usage
+u8g2.DrawDisc(60,30,8,15)
+*/
 static int l_u8g2_DrawDisc(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawDisc(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4));
     return 1;
 }
 
+/*
+在x,y位置画一个半径为rad的空心椭圆.
+@api u8g2.DrawEllipse(x0,y0,rx,ry,opt)
+@int 圆心位置
+@int 圆心位置
+@int 椭圆大小
+@int 椭圆大小
+@int 选择圆的部分或全部.
+右上: 0x01
+左上:  0x02
+左下: 0x04
+右下:  0x08
+完整圆: (0x01|0x02|0x04|0x08)
+@usage
+u8g2.DrawEllipse(60,30,8,15)
+*/
 static int l_u8g2_DrawEllipse(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawEllipse(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4),luaL_checkinteger(L, 5));
     return 1;
 }
 
+/*
+在x,y位置画一个半径为rad的实心椭圆.
+@api u8g2.DrawFilledEllipse(x0,y0,rx,ry,opt)
+@int 圆心位置
+@int 圆心位置
+@int 椭圆大小
+@int 椭圆大小
+@int 选择圆的部分或全部.
+右上: 0x01
+左上:  0x02
+左下: 0x04
+右下:  0x08
+完整圆: (0x01|0x02|0x04|0x08)
+@usage
+u8g2.DrawFilledEllipse(60,30,8,15)
+*/
 static int l_u8g2_DrawFilledEllipse(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawFilledEllipse(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4),luaL_checkinteger(L, 5));
     return 1;
 }
 
+/*
+从x / y位置(左上边缘)开始绘制一个框(填充的框).
+@api u8g2.DrawBox(x,y,w,h)
+@int 左上边缘的X位置
+@int 左上边缘的Y位置
+@int 盒子的宽度
+@int 盒子的高度
+@usage
+u8g2.DrawBox(3,7,25,15)
+*/
 static int l_u8g2_DrawBox(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawBox(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4));
     return 1;
 }
 
+/*
+从x / y位置(左上边缘)开始绘制一个框(空框).
+@api u8g2.DrawFrame(x,y,w,h)
+@int 左上边缘的X位置
+@int 左上边缘的Y位置
+@int 盒子的宽度
+@int 盒子的高度
+@usage
+u8g2.DrawFrame(3,7,25,15)
+*/
 static int l_u8g2_DrawFrame(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawFrame(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4));
     return 1;
 }
+
+/*
+绘制一个从x / y位置(左上边缘)开始具有圆形边缘的填充框/框架.
+@api u8g2.DrawRBox(x,y,w,h,r)
+@int 左上边缘的X位置
+@int 左上边缘的Y位置
+@int 盒子的宽度
+@int 盒子的高度
+@int 四个边缘的半径
+@usage
+u8g2.DrawRBox(3,7,25,15)
+*/
 static int l_u8g2_DrawRBox(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawRBox(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4),luaL_checkinteger(L, 5));
     return 1;
 }
+
+/*
+绘制一个从x / y位置(左上边缘)开始具有圆形边缘的空框/框架.
+@api u8g2.DrawRFrame(x,y,w,h,r)
+@int 左上边缘的X位置
+@int 左上边缘的Y位置
+@int 盒子的宽度
+@int 盒子的高度
+@int 四个边缘的半径
+@usage
+u8g2.DrawRFrame(3,7,25,15)
+*/
 static int l_u8g2_DrawRFrame(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawRFrame(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4),luaL_checkinteger(L, 5));
     return 1;
 }
 
+/*
+绘制一个图形字符。字符放置在指定的像素位置x和y.
+@api u8g2.DrawGlyph(x,y,encoding)
+@int 字符在显示屏上的位置
+@int 字符在显示屏上的位置
+@int 字符的Unicode值
+@usage
+u8g2.SetFont(u8g2_font_unifont_t_symbols)
+u8g2.DrawGlyph(5, 20, 0x2603)	-- dec 9731/hex 2603 Snowman 
+*/
 static int l_u8g2_DrawGlyph(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawGlyph(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3));
     return 1;
 }
 
+/*
+绘制一个三角形(实心多边形).
+@api u8g2.DrawTriangle(x0,y0,x1,y1,x2,y2)
+@int 点0X位置
+@int 点0Y位置
+@int 点1X位置
+@int 点1Y位置
+@int 点2X位置
+@int 点2Y位置
+@usage
+u8g2.DrawTriangle(20,5, 27,50, 5,32)
+*/
 static int l_u8g2_DrawTriangle(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_DrawTriangle(u8g2,luaL_checkinteger(L, 1),luaL_checkinteger(L, 2),luaL_checkinteger(L, 3),luaL_checkinteger(L, 4),luaL_checkinteger(L, 5),luaL_checkinteger(L, 6));
     return 1;
 }
 
+/*
+定义位图函数是否将写入背景色
+@api u8g2.SetBitmapMode(mode)
+@int mode字体模式,启用(1)或禁用(0)透明模式
+@usage
+u8g2.SetBitmapMode(1)
+*/
 static int l_u8g2_SetBitmapMode(lua_State *L){
     if (u8g2 == NULL) return 0;
     u8g2_SetBitmapMode(u8g2,luaL_checkinteger(L, 1));