在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

新鮮出爐!LuatOS墨水屏+ESP32C3開發板,自制在線電紙書

合宙LuatOS ? 2022-07-19 17:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上周合宙發布了一款1.54寸墨水屏開發板,售價僅為16.8元,又掀起一陣搶購熱旋風

由于墨水屏的特性,無需背光,在光線照射下觀感和紙張印刷效果類似,很適合用來做電紙書。再配合可以使用Wi-Fi的合宙ESP32C3開發板,我們就可以用LuatOS驅動這塊墨水屏來做一個在線電紙書了。

5df15bc8-06bf-11ed-9ade-dac502259ad0.gif

- LuatOS在線電紙書 -

接下來,讓我們一起看看制作LuatOS在線電紙書的要點吧!

1

基礎準備工作


本文電紙書示例主要硬件采用合宙LuatOS墨水屏開發板+ESP32C3開發板,軟件建議使用合宙Luatools進行操作。

1.1 合宙LuatOS墨水屏開發板一塊:

1.54寸黑白雙色墨水屏,分辨率200*200,板載升壓電路,僅需正常3.3V供電即可驅動。使?LuatOS固件中的eink庫,可以?便快捷地驅動屏幕。

點擊圖片鏈接了解更多:

5e0566d6-06bf-11ed-9ade-dac502259ad0.png

1.2 合宙ESP32C3開發板一塊:

目前合宙ESP32C3開發板分為兩版:經典款和簡約款。須注意的是簡約款無串口芯片,從Type-C口連接的話沒法用LuatIDE調試,需使用Luatools進行燒錄。

點擊圖片鏈接了解更多:

5e2b710a-06bf-11ed-9ade-dac502259ad0.png

1.3 接線示意:

合宙LuatOS墨水屏開發板接口兼容合宙LuatOS全系列MCU開發板,對應接口對插即可。

5e6a0dde-06bf-11ed-9ade-dac502259ad0.jpg

2

編寫在線電紙書


5e7fef28-06bf-11ed-9ade-dac502259ad0.gif

2.1 解鎖GPIO11

由于墨水屏的BUSY引腳連接到了ESP32C3的GPIO11,但是ESP32C3的GPIO11(VDD_SPI)默認功能是給Flash供電,默認情況下無法當作GPIO使用,我們可以使用外部3.3V給Flash供電,把GPIO11釋放出來使用。

具體步驟詳見【ESP32C3解鎖使用IO11】:https://gitee.com/dreamcmi/LuatOS-ESP32/blob/master/doc/VDD_SPI_AS_GPIO.md

2.2 界面及交互設計

使用開發板上的BOOT鍵(GPIO9)作為功能按鍵:

單擊:下一個
雙擊:上一個
長按:進入/退出

選擇12號中文字體作為顯示字體;開機后顯示圖書列表界面,圖書列表一頁顯示11項,選中的圖書高亮顯示,長按功能鍵進入圖書閱讀界面,閱讀界面顯示內容為11行*12列,最下面一行顯示當前的閱讀進度,在閱讀界面長按功能鍵退回到圖書列表界面。

2.3 搭建在線電紙書后臺服務

后臺服務主要提供以下兩個HTTP接口供客戶端調用:

5fb47a8a-06bf-11ed-9ade-dac502259ad0.png

當前墨水屏使用12號中文字體的情況下,一頁顯示11行*12列,后臺會根據需求分頁返回給客戶端。

后臺源代碼詳見【電紙書后臺源碼】:

https://github.com/JeremyHash/EinkBook-LuatOS/blob/master/Server/main.go

2.4 封裝必要模塊

在線電紙書需要Wi-Fi連接和發起HTTP請求兩個基本需求,這部分代碼比較多,封裝成兩個函數:

創建Wi-Fi連接


手機橫屏/上下滑動查看完整代碼:

function wifiConnect.connect(ssid, passwd)

local waitRes, data

if wlan.init() ~= 0 then

log.error(tag .. ".init", "ERROR")

return false

end

if wlan.setMode(wlan.STATION) ~= 0 then

log.error(tag .. ".setMode", "ERROR")

return false

end

if USE_SMARTCONFIG == true then

if wlan.smartconfig() ~= 0 then

log.error(tag .. ".connect", "ERROR")

return false

end

waitRes, data = sys.waitUntil("WLAN_STA_CONNECTED", 180 * 10000)

log.info("WLAN_STA_CONNECTED", waitRes, data)

if waitRes ~= true then

log.error(tag .. ".wlan ERROR")

return false

end

waitRes, data = sys.waitUntil("IP_READY", 10000)

if waitRes ~= true then

log.error(tag .. ".wlan ERROR")

return false

end

log.info("IP_READY", waitRes, data)

return true

end

if wlan.connect(ssid, passwd) ~= 0 then

log.error(tag .. ".connect", "ERROR")

return false

end

waitRes, data = sys.waitUntil("WLAN_STA_CONNECTED", 10000)

if waitRes ~= true then

log.error(tag .. ".wlan ERROR")

return false

end

log.info("WLAN_STA_CONNECTED", waitRes, data)

waitRes, data = sys.waitUntil("IP_READY", 10000)

if waitRes ~= true then

log.error(tag .. ".wlan ERROR")

return false

end

log.info("IP_READY", waitRes, data)

return true

end

發起HTTP請求


手機橫屏/上下滑動查看完整代碼:

local methodTable = {

GET = esphttp.GET,

POST = esphttp.POST,

PUT = esphttp.PUT,

DELETE = esphttp.DELETE

}

function httpLib.request(method, url, head)

local responseCode = 0

local httpc = esphttp.init(methodTable[method], url)

if httpc == nil then

esphttp.cleanup(httpc)

return false, responseCode, "create httpClient error"

end

if head ~= nil then

for k, v in pairs(head) do

esphttp.set_header(httpc, k, v)

end

end

local ok, err = esphttp.perform(httpc, true)

if ok then

local response = ""

while 1 do

local result, c, ret, data = sys.waitUntil("ESPHTTP_EVT", 20000)

-- log.info("ESPHTTP_EVT", result, c, ret, data)

if result == false then

esphttp.cleanup(httpc)

return false, responseCode, "wait for http response timeout"

end

if c == httpc then

if esphttp.is_done(httpc, ret) then

esphttp.cleanup(httpc)

return true, esphttp.status_code(httpc), response

end

if ret == esphttp.EVENT_ON_DATA then

response = response .. data

end

end

end

else

esphttp.cleanup(httpc)

return false, responseCode, "perform httpClient error " .. err

end

end

2.5 封裝必要模塊編寫電紙書代碼

下面開始電紙書部分的邏輯代碼,主要分為初始化FDB、初始化墨水屏、文字函數、圖書列表及內容函數、網絡及按鍵功能等幾個部分:

初始化FDB


assert(fdb.kvdb_init("env", "onchip_flash") == true, tag .. ".kvdb_init ERROR")

初始化墨水屏


由于我們使用的是ESP32C3,連接的SPI通道id為2,初始化成功之后需要設置墨水屏的大小,然后將墨水屏完整的黑白刷新一次來清除之前顯示內容的殘留,再設置我們要使用的12號中文字體。

代碼如下:

-- 局刷模式

eink.setup(1, 2, 11, 10, 6, 7)

-- 設置分辨率200*200

eink.setWin(200, 200, 0)

-- 全刷一次屏幕防止之前的顯示內容殘留

eink.clear(0, true)

eink.show(0, 0)

eink.clear(1, true)

eink.show(0, 0)

eink.setFont(eink.font_opposansm12_chinese)

封裝墨水屏顯示文字函數


function einkShowStr(x, y, str, colored, clear, show)

-- 每20次刷屏就全刷一次防止顯示殘留

if einkPrintTime > 20 then

einkPrintTime = 0

eink.rect(0, 0, 200, 200, 0, 1)

eink.show(0, 0, true)

eink.rect(0, 0, 200, 200, 1, 1)

eink.show(0, 0, true)

end

if clear == true then

eink.clear()

end

eink.print(x, y, str, colored)

if show == true then

einkPrintTime = einkPrintTime + 1

eink.show(0, 0, true)

end

end

封裝渲染圖書列表和圖書內容函數


手機橫屏/上下滑動查看完整代碼:

function showBookList(index)

local firstIndex

for k, v in pairs(onlineBooksShowTableTmp[1]) do

firstIndex = v["index"]

end

-- 當要高亮的圖書索引超過了當前的列表,擴充當前列表

if index > firstIndex + 10 then

onlineBooksShowTableTmp = getTableSlice(onlineBooksShowTable, index - 10, index)

end

if index < firstIndex then

onlineBooksShowTableTmp = getTableSlice(onlineBooksShowTable, index, index + 10)

end

einkShowStr(0, 16, "圖書列表", 0, true)

local ifShow = false

local len = getTableLen(onlineBooksTable)

local showLen = getTableLen(onlineBooksShowTableTmp)

if len == 0 then

einkShowStr(0, 32, "暫無在線圖書", 0, false, true)

return

end

local i = 1

for k, v in pairs(onlineBooksShowTableTmp) do

for name, info in pairs(v) do

local bookName = string.split(name, ".")[1]

local bookSize = tonumber(info["size"]) / 1024 / 1024

if i == showLen then

ifShow = true

end

if info["index"] == index then

eink.rect(0, 16 * i, 200, 16 * (i + 1), 0, 1, nil, ifShow)

einkShowStr(0, 16 * (i + 1), bookName .. " " .. string.format("%.2f", bookSize) .. "MB", 1,

nil, ifShow)

else

einkShowStr(0, 16 * (i + 1), bookName .. " " .. string.format("%.2f", bookSize) .. "MB", 0,

nil, ifShow)

end

i = i + 1

end

end

end

function showBook(bookName, bookUrl, page)

sys.taskInit(function()

waitHttpTask = true

for i = 1, 3 do

local result, code, data = httpLib.request("GET", bookUrl .. "/" .. page)

log.info("SHOWBOOK", result, code)

if result == false or code == -1 or code == 0 then

log.error("SHOWBOOK", "獲取圖書內容失敗 ", data)

else

local bookLines = json.decode(data)

for k, v in pairs(bookLines) do

if k == 1 then

einkShowStr(0, 16 * k, v, 0, true, false)

elseif k == #bookLines then

einkShowStr(0, 16 * k, v, 0, false, false)

else

einkShowStr(0, 16 * k, v, 0, false, false)

end

end

-- 最后一行渲染讀書進度

einkShowStr(60, 16 * 12 + 2, page .. "/" .. onlineBooksTable[bookName]["pages"], 0, false, true)

break

end

end

waitHttpTask = false

end)

end

連接網絡并獲取圖書列表


需要提前創建幾個函數,用來處理下面獲取到的圖書列表數據。

手機橫屏/上下滑動查看完整代碼:

-- 獲取table的切片并作為一個新的table返回

function getTableSlice(intable, startIndex, endIndex)

local outTable = {}

for i = startIndex, endIndex do

table.insert(outTable, intable[i])

end

return outTable

end

-- 通過#獲取table長度不靠譜,所以需要這個函數

function getTableLen(t)

local count = 0

for _, _ in pairs(t) do

count = count + 1

end

return count

end

-- 需要將獲取到的圖書列表格式化符合我們下面的需求

function formatOnlineBooksTable(inTable)

local outTable = {}

local i = 1

for k, v in pairs(inTable) do

v["index"] = i

table.insert(outTable, {

[k] = v

})

i = i + 1

end

return outTable

end

```

調用之前封裝的WiFi連接函數,將獲取到的圖書列表解析并顯示

代碼如下:

for i = 1, 5 do

local result, code, data = httpLib.request("GET",serverAdress .. "getBooks")

if result == false or code == -1 or code == 0 then

log.error(tag, "獲取圖書列表失敗 ", data)

if i == 5 then

einkShowStr(0, 16, "連接圖書服務器失敗 正在重啟", 0,true, true)

rtos.reboot()

end

else

onlineBooksTable = json.decode(data)

onlineBooksTableLen = getTableLen(onlineBooksTable)

onlineBooksShowTable = formatOnlineBooksTable(onlineBooksTable)

onlineBooksShowTableTmp = getTableSlic(onlineBooksShowTable, 1, 11)

-- 渲染圖書列表,索引從1開始

showBookList(1)

btnSetup(9, 1000, btnShortHandle, btnLongHandle, btnDoublehandle)

break

end

sys.wait(1000)

end

初始化功能鍵并編寫對應的按鍵處理


初始化BOOT/GPIO9為功能鍵,在對應的按鍵事件處理函數中,調用之前封裝好的渲染圖書列表或渲染圖書內容的函數。

手機橫屏/上下滑動查看完整代碼:

-- 短按處理函數

function btnShortHandle()

-- 如果當前http請求未完成則直接返回

if waitHttpTask == true then

waitDoubleClick = false

return

end

-- 如果當前頁面在圖書列表,短按會高亮下一本書

if PAGE == "LIST" then

if einkBooksIndex == onlineBooksTableLen then

einkBooksIndex = 1

else

einkBooksIndex = einkBooksIndex + 1

end

showBookList(einkBooksIndex)

-- 如果當前頁面在圖書閱讀頁面,短按進入下一頁

else

local i = 1

local bookName = nil

for k, v in pairs(onlineBooksTable) do

if i == einkBooksIndex then

bookName = k

end

i = i + 1

end

local thisBookPages = tonumber(onlineBooksTable[bookName]["pages"])

-- 如果當前頁已是最后一頁,直接返回

if thisBookPages == gpage then

waitDoubleClick = false

return

end

gpage = gpage + 1

-- 渲染下一頁

showBook(bookName, serverAdress .. string.urlEncode(bookName), gpage)

log.info(bookName, gpage)

-- 把新的閱讀記錄存入fdb

fdb.kv_set(bookName, gpage)

end

waitDoubleClick = false

end

-- 長按處理函數

function btnLongHandle()

if waitHttpTask == true then

return

end

-- 如果當前在列表頁進入內容閱讀頁

if PAGE == "LIST" then

PAGE = "BOOK"

local i = 1

local bookName = nil

for k, v in pairs(onlineBooksTable) do

if i == einkBooksIndex then

bookName = k

end

i = i + 1

end

local pageCache = fdb.kv_get(bookName)

log.info(bookName, pageCache)

if pageCache == nil then

gpage = 1

showBook(bookName, serverAdress .. string.urlEncode(bookName), gpage)

else

gpage = pageCache

showBook(bookName, serverAdress .. string.urlEncode(bookName), pageCache)

end

-- 如果當前在內容頁進入列表頁

elseif PAGE == "BOOK" then

PAGE = "LIST"

showBookList(einkBooksIndex)

end

end

-- 雙擊處理函數

function btnDoublehandle()

if waitHttpTask == true then

return

end

-- 若果當前在列表頁,高亮上一項

if PAGE == "LIST" then

if einkBooksIndex == 1 then

einkBooksIndex = onlineBooksTableLen

else

einkBooksIndex = einkBooksIndex - 1

end

showBookList(einkBooksIndex)

-- 如果當前在內容頁,讀取上一頁內容

else

-- 如果已是第一頁直接返回

if gpage == 1 then

return

end

gpage = gpage - 1

local i = 1

local bookName = nil

for k, v in pairs(onlineBooksTable) do

if i == einkBooksIndex then

bookName = k

end

i = i + 1

end

log.info(bookName, gpage)

fdb.kv_set(bookName, gpage)

showBook(bookName, serverAdress .. string.urlEncode(bookName), gpage)

end

end

-- 按鍵中斷處理函數

function btnHandle(val)

if val == 0 then

-- 按下時在等待雙擊狀態時,停止短按事件函數的定時器,并觸發雙擊

if waitDoubleClick == true then

sys.timerStop(gShortCb)

gDoubleCb()

waitDoubleClick = false

return

end

-- 啟動一個定時器觸發長按處理函數

sys.timerStart(longTimerCb, gPressTime)

gBtnStatus = "PRESSED"

else

-- 停止長按處理函數的定時器

sys.timerStop(longTimerCb)

-- 如果當前狀態為短按下,開啟一個定時器來觸發短按處理函數

if gBtnStatus == "PRESSED" then

sys.timerStart(gShortCb, 500)

waitDoubleClick = true

gBtnStatus = "IDLE"

-- 如果當前狀態以為長按處理函數執行完成,改變狀態為IDLE并返回

elseif gBtnStatus == "LONGPRESSED" then

gBtnStatus = "IDLE"

end

end

end

-- 初始化按鍵函數

function btnSetup(gpioNumber, pressTime, shortCb, longCb, doubleCb)

gpio.setup(gpioNumber, btnHandle, gpio.PULLUP)

gPressTime = pressTime

gShortCb = shortCb

gLongCb = longCb

gDoubleCb = doubleCb

end

-- 初始化GPIO9為上拉中斷模式,并注冊短按/長按/雙擊的處理函數

btnSetup(9, 1000, btnShortHandle, btnLongHandle, btnDoublehandle)

2.6相關資料鏈接

完整項目代碼:

https://github.com/JeremyHash/EinkBook-LuatOS

燒錄教程

https://wiki.luatos.com/boardGuide/flash.html

墨水屏開發板資料:
https://wiki.luatos.com/peripherals/eink_1.54/index.html

ESP32C3開發板資料:
https://wiki.luatos.com/chips/esp32c3/index.html

好了,今天就分享到這里
以上內容你學會了嗎
自己制作一款電紙書愉快玩耍吧

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電紙書
    +關注

    關注

    0

    文章

    26

    瀏覽量

    9778
  • 開發板
    +關注

    關注

    25

    文章

    5659

    瀏覽量

    104290
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    ESP32-P4 C5開發板燒錄小智全流程!速看!

    沒錯,你沒有看錯!我們帶著WT99P4C5-S1開發板燒錄小智全流程走來了!開發板搭載樂鑫科技ESP32-P4和ESP32-C5芯片,代碼完
    的頭像 發表于 07-04 18:03 ?254次閱讀
    <b class='flag-5'>ESP32</b>-P4 <b class='flag-5'>C</b>5<b class='flag-5'>開發板</b>燒錄小智全流程!速看!

    ESP32-S3開發板燒錄小智AI系統全流程指南

    在AI語音交互領域不斷發展的今天,開發者們對于功能強大、開源靈活的開發板需求日益增長。今天,我們就來詳細了解一下ESP32AgentDevKit燒錄小智的全流程,這款搭載樂鑫科技ESP32-S
    的頭像 發表于 06-16 18:01 ?1141次閱讀
    <b class='flag-5'>ESP32-S3</b><b class='flag-5'>開發板</b>燒錄小智AI系統全流程指南

    ESP32-C3開發板全面支持小智AI!燒錄實戰指南來了!

    本文將詳細解析基于樂鑫ESP32-C3芯片的ZXAIEC43開發板燒錄“小智”AI語音系統的全流程。該方案代碼完全開源,支持深度定制開發,適用于智能玩具、潮玩手辦及智能家居控制等多元場景。開發
    的頭像 發表于 06-13 18:01 ?744次閱讀
    <b class='flag-5'>ESP32-C3</b><b class='flag-5'>開發板</b>全面支持小智AI!燒錄實戰指南來了!

    基于ESP32C3的智能小車設計

    你有沒有想過,從零開始親手制作一輛堅固耐用的遙控越野車?今天,小編就帶你走進一個融合機械、電子與物聯網的精彩DIY項目——一款由 Seeed Studio XIAO ESP32C3 強力驅動的 3D打印4x4 RC漫游車!
    的頭像 發表于 06-04 11:11 ?743次閱讀
    基于<b class='flag-5'>ESP32C3</b>的智能小車設計

    用AI人臉識別開發板BW21-CBV-Kit驅動墨水

    試著用BW21-CBV-Kit點亮2.9寸墨水開發板例程非常豐富,在arduino上開發的話上手超級容易。
    的頭像 發表于 03-04 18:24 ?1091次閱讀
    用AI人臉識別<b class='flag-5'>開發板</b>BW21-CBV-Kit驅動<b class='flag-5'>墨水</b><b class='flag-5'>屏</b>

    正點原子ESP32S3系列開發板全面支持小智AI

    可能大家覺得AI離我們很遠,但是小智AI可以把這個距離拉得很近。正點原子ESP32S3系列開發板全面支持小智AI,助力AI硬件發展。 ESP32S3開發板
    發表于 02-14 17:01

    原來ESP32竟可《一“芯”兩用》既做人體檢測傳感器也做Wi-Fi數據傳輸

    如何使用ESP32來做人體檢測傳感器,對我來說還是挺新鮮的事兒,對你來說是否有也一樣呢?接下來我會重點來展開說說如何通過ESP32來實現,這里我用的的是ESP32C3模組;0、前言之前
    的頭像 發表于 12-18 18:12 ?3828次閱讀
    原來<b class='flag-5'>ESP32</b>竟可《一“芯”兩用》既做人體檢測傳感器也做Wi-Fi數據傳輸

    ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術規格

    電子發燒友網站提供《ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術規格.pdf》資料免費下載
    發表于 12-07 15:30 ?11次下載

    【AI技術支持】ESP32C3 開發板在Linux環境下,進行JTAG 調試演示

    啟明云端/01JTAG調試工具本教程主要演示ESP32C3開發板在linux環境下,通過vscode的ESP-IDF插件使用JTAG調試工具。ESP32C3不但內置了USB-JTAG,
    的頭像 發表于 10-17 08:01 ?3388次閱讀
    【AI技術支持】<b class='flag-5'>ESP32C3</b> <b class='flag-5'>開發板</b>在Linux環境下,進行JTAG 調試演示

    在rt-thread bsp里esp32c3里編譯出的bin文件燒到esp32開發板上運行提示chipid不對,為什么?

    在rt-thread bsp里esp32c3里編譯出的bin文件燒到esp32開發板上 運行提示chipid不對,是否有方法修改能支持esp32 系列的
    發表于 09-27 10:01

    esp32c3內置USB-Serial-JTAG的使用

    1、介紹一句話:esp32-c3內置了兩個開發利器usb-serial和usb-jtag,只需要一條數據線即可進行程序燒錄、在線調試、日志輸出,大大方便了開發者;以下來自官方數據手冊介
    的頭像 發表于 08-08 08:11 ?6037次閱讀
    <b class='flag-5'>esp32c3</b>內置USB-Serial-JTAG的使用

    導入ESP32C3的項目時,報這個提示Select a Kit for xxxx,請問應該選擇什么?

    導入ESP32C3的項目時,報這個提示Select a Kit for xxxx,請問應該選擇什么? 使用的ESP-IDF 5.2.2版本的插件
    發表于 07-22 06:06

    ESP32C3可以使用ESP-SkaiNet或者ESP-ADF開發離線語言識別嗎?

    ESP32C3可以使用ESP-SkaiNet或者ESP-ADF開發離線語言識別嗎?
    發表于 07-19 07:43

    使用ESP32C3的SoftAP例程,為啥手機和電腦都搜不到AP呢?

    版本是5.02,使用StationDemo可以連接這個AP,但是用手機筆記本搜不到,一般是原因啊 開發板用的是ESP32-C3-MINI-1ESP32-C3-DevkitM-1 v1.0,硬件上加了32.768K晶振,其它沒動 軟件純DEMO工程沒有動
    發表于 07-19 07:13

    esp32c3 OTA鏡像錯誤的原因?

    使用的是esp32c3參考的例程是 native_ota_example 錯誤日志如下 2024-07-03 09:41:17 E (24704) esp_ota_ops: OTA image
    發表于 07-19 06:50
    主站蜘蛛池模板: 模特精品视频一区 | 夜夜操狠狠操 | 天天爽天天狼久久久综合 | 女人本色高清在线观看wwwwww国产 | 禁漫羞羞a漫入口 | 777黄色片 | 国产一级特黄生活片 | 亚洲人成电影 | 人人爽天天爽夜夜爽曰 | 久久澡| 国产亚洲欧洲人人网 | 天堂成人| 午夜精品久久久久久影视riav | 国产欧美日韩综合精品一区二区 | 乱e伦有声小说 | 二级特黄绝大片免费视频大片 | 成人做视频免费 | 亚洲成人在线免费观看 | 色天使在线观看 | 69久久夜色精品国产69 | 丁香六月色婷婷综合网 | 午夜久| 综合五月婷婷 | 高h污快穿文汁水四溅 | 国产精品成人免费观看 | 婷婷丁香五月中文字幕 | 欧美另类自拍 | 亚洲 欧美 精品专区 极品 | 久久婷婷综合五月一区二区 | 欧美性淫爽www视频播放 | 色婷婷激婷婷深爱五月小说 | 亚1州区2区三区4区产品 | 性a爱片免费视频性 | 激情婷婷综合 | 国产成人精品曰本亚洲77美色 | 女69porin18| 免费的色网站 | 亚洲一级毛片免观看 | 日韩天天操 | www.久久在线 | 天天做夜夜操 |