2018-09-07 23:37:04 +00:00
|
|
|
local Generic = require("device/generic/device") -- <= look at this file!
|
2019-02-08 22:14:23 +00:00
|
|
|
local PluginShare = require("pluginshare")
|
2018-09-07 23:37:04 +00:00
|
|
|
local ffi = require("ffi")
|
2019-04-23 07:08:21 +00:00
|
|
|
local logger = require("logger")
|
2018-09-07 23:37:04 +00:00
|
|
|
|
|
|
|
local function yes() return true end
|
|
|
|
local function no() return false end
|
|
|
|
|
|
|
|
local SonyPRSTUX = Generic:new{
|
|
|
|
model = "Sony PRSTUX",
|
|
|
|
isSonyPRSTUX = yes,
|
|
|
|
hasKeys = yes,
|
2018-10-06 05:55:35 +00:00
|
|
|
hasOTAUpdates = yes,
|
2019-02-06 14:51:50 +00:00
|
|
|
hasWifiManager = yes,
|
2019-08-15 12:49:15 +00:00
|
|
|
canReboot = yes,
|
|
|
|
canPowerOff = yes,
|
2019-02-08 22:14:23 +00:00
|
|
|
usbPluggedIn = false,
|
2021-01-07 19:38:10 +00:00
|
|
|
home_dir = nil,
|
2018-09-07 23:37:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- sony's driver does not inform of ID, so we overwrite the TOUCH_MAJOR
|
|
|
|
-- event to fake an ID event. a width == 0 means the finger was lift.
|
|
|
|
-- after all events are received, we reset the counter
|
|
|
|
|
|
|
|
local next_touch_id = 0
|
|
|
|
local ABS_MT_TRACKING_ID = 57
|
|
|
|
local ABS_MT_TOUCH_MAJOR = 48
|
|
|
|
local EV_SYN = 0
|
|
|
|
local EV_ABS = 3
|
|
|
|
local SYN_REPORT = 0
|
|
|
|
local SYN_MT_REPORT = 2
|
|
|
|
local adjustTouchEvt = function(self, ev)
|
|
|
|
if ev.type == EV_ABS and ev.code == ABS_MT_TOUCH_MAJOR then
|
|
|
|
ev.code = ABS_MT_TRACKING_ID
|
|
|
|
if ev.value ~= 0 then
|
|
|
|
ev.value = next_touch_id
|
|
|
|
else
|
|
|
|
ev.value = -1
|
|
|
|
end
|
|
|
|
|
|
|
|
next_touch_id = next_touch_id + 1
|
|
|
|
|
|
|
|
logger.dbg('adjusted id: ', ev.value)
|
|
|
|
elseif ev.type == EV_SYN and ev.code == SYN_REPORT then
|
|
|
|
next_touch_id = 0
|
|
|
|
logger.dbg('reset id: ', ev.code, ev.value)
|
|
|
|
ev.code = SYN_MT_REPORT
|
|
|
|
elseif ev.type == EV_SYN and ev.code == SYN_MT_REPORT then
|
|
|
|
ev.code = SYN_REPORT
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:init()
|
|
|
|
self.screen = require("ffi/framebuffer_mxcfb"):new{device = self, debug = logger.dbg}
|
|
|
|
self.powerd = require("device/sony-prstux/powerd"):new{device = self}
|
|
|
|
self.input = require("device/input"):new{
|
|
|
|
device = self,
|
|
|
|
event_map = require("device/sony-prstux/event_map"),
|
|
|
|
}
|
|
|
|
|
|
|
|
self.input.open("/dev/input/event0") -- Keys
|
|
|
|
self.input.open("/dev/input/event1") -- touchscreen
|
|
|
|
self.input.open("/dev/input/event2") -- power button
|
2019-02-08 22:14:23 +00:00
|
|
|
self.input.open("fake_events") -- usb plug-in/out and charging/not-charging
|
2018-09-07 23:37:04 +00:00
|
|
|
self.input:registerEventAdjustHook(adjustTouchEvt)
|
|
|
|
|
|
|
|
local rotation_mode = self.screen.ORIENTATION_LANDSCAPE_ROTATED
|
|
|
|
self.screen.native_rotation_mode = rotation_mode
|
|
|
|
self.screen.cur_rotation_mode = rotation_mode
|
|
|
|
|
|
|
|
Generic.init(self)
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:supportsScreensaver() return true end
|
|
|
|
|
|
|
|
function SonyPRSTUX:setDateTime(year, month, day, hour, min, sec)
|
|
|
|
if hour == nil or min == nil then return true end
|
|
|
|
local command
|
|
|
|
if year and month and day then
|
|
|
|
command = string.format("date -s '%d-%d-%d %d:%d:%d'", year, month, day, hour, min, sec)
|
|
|
|
else
|
|
|
|
command = string.format("date -s '%d:%d'",hour, min)
|
|
|
|
end
|
|
|
|
if os.execute(command) == 0 then
|
|
|
|
os.execute('hwclock -u -w')
|
|
|
|
return true
|
|
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:intoScreenSaver()
|
|
|
|
local Screensaver = require("ui/screensaver")
|
|
|
|
if self.screen_saver_mode == false then
|
|
|
|
Screensaver:show()
|
|
|
|
end
|
|
|
|
self.powerd:beforeSuspend()
|
|
|
|
self.screen_saver_mode = true
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:outofScreenSaver()
|
|
|
|
if self.screen_saver_mode == true then
|
|
|
|
local Screensaver = require("ui/screensaver")
|
|
|
|
Screensaver:close()
|
|
|
|
local UIManager = require("ui/uimanager")
|
|
|
|
UIManager:nextTick(function() UIManager:setDirty("all", "full") end)
|
|
|
|
end
|
|
|
|
self.powerd:afterResume()
|
|
|
|
self.screen_saver_mode = false
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:suspend()
|
|
|
|
os.execute("./suspend.sh")
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:resume()
|
|
|
|
os.execute("./resume.sh")
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:powerOff()
|
|
|
|
os.execute("poweroff")
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:reboot()
|
|
|
|
os.execute("reboot")
|
|
|
|
end
|
|
|
|
|
2019-02-08 22:14:23 +00:00
|
|
|
function SonyPRSTUX:usbPlugIn()
|
|
|
|
self.usb_plugged_in = true
|
|
|
|
PluginShare.pause_auto_suspend = true
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:usbPlugOut()
|
|
|
|
self.usb_plugged_in = false
|
|
|
|
PluginShare.pause_auto_suspend = false
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:usbPluggedIn()
|
|
|
|
return self.usb_plugged_in
|
|
|
|
end
|
|
|
|
|
2018-09-07 23:37:04 +00:00
|
|
|
function SonyPRSTUX:initNetworkManager(NetworkMgr)
|
|
|
|
function NetworkMgr:turnOffWifi(complete_callback)
|
|
|
|
self:releaseIP()
|
|
|
|
os.execute("./set-wifi.sh off")
|
|
|
|
if complete_callback then
|
|
|
|
complete_callback()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function NetworkMgr:turnOnWifi(complete_callback)
|
|
|
|
os.execute("./set-wifi.sh on")
|
|
|
|
self:showNetworkMenu(complete_callback)
|
|
|
|
end
|
|
|
|
|
Various Wi-Fi QoL improvements (#6424)
* Revamped most actions that require an internet connection to a new/fixed backend that allows forwarding the initial action and running it automatically once connected. (i.e., it'll allow you to set "Action when Wi-Fi is off" to "turn_on", and whatch stuff connect and do what you wanted automatically without having to re-click anywhere instead of showing you a Wi-Fi prompt and then not doing anything without any other feedback).
* Speaking of, fixed the "turn_on" beforeWifi action to, well, actually work. It's no longer marked as experimental.
* Consistently use "Wi-Fi" everywhere.
* On Kobo/Cervantes/Sony, implemented a "Kill Wi-Fi connection when inactive" system that will automatically disconnect from Wi-Fi after sustained *network* inactivity (i.e., you can keep reading, it'll eventually turn off on its own). This should be smart and flexible enough not to murder Wi-Fi while you need it, while still not keeping it uselessly on and murdering your battery.
(i.e., enable that + turn Wi-Fi on when off and enjoy never having to bother about Wi-Fi ever again).
* Made sending `NetworkConnected` / `NetworkDisconnected` events consistent (they were only being sent... sometimes, which made relying on 'em somewhat problematic).
* restoreWifiAsync is now only run when really needed (i.e., we no longer stomp on an existing working connection just for the hell of it).
* We no longer attempt to kill a bogus non-existent Wi-Fi connection when going to suspend, we only do it when it's actually needed.
* Every method of enabling Wi-Fi will now properly tear down Wi-Fi on failure, instead of leaving it in an undefined state.
* Fixed an issue in the fancy crash screen on Kobo/reMarkable that could sometime lead to the log excerpt being missing.
* Worked-around a number of sneaky issues related to low-level Wi-Fi/DHCP/DNS handling on Kobo (see the lengthy comments [below](https://github.com/koreader/koreader/pull/6424#issuecomment-663881059) for details). Fix #6421
Incidentally, this should also fix the inconsistencies experienced re: Wi-Fi behavior in Nickel when toggling between KOReader and Nickel (use NM/KFMon, and run a current FW for best results).
* For developers, this involves various cleanups around NetworkMgr and NetworkListener. Documentation is in-line, above the concerned functions.
2020-07-27 01:39:06 +00:00
|
|
|
function NetworkMgr:getNetworkInterfaceName()
|
|
|
|
return "wlan0"
|
|
|
|
end
|
|
|
|
|
2018-09-07 23:37:04 +00:00
|
|
|
NetworkMgr:setWirelessBackend("wpa_supplicant", {ctrl_interface = "/var/run/wpa_supplicant/wlan0"})
|
|
|
|
|
|
|
|
function NetworkMgr:obtainIP()
|
|
|
|
self:releaseIP()
|
|
|
|
os.execute("dhclient wlan0")
|
|
|
|
end
|
|
|
|
|
|
|
|
function NetworkMgr:releaseIP()
|
|
|
|
logger.info("killing dhclient")
|
|
|
|
os.execute("dhclient -x wlan0")
|
|
|
|
end
|
|
|
|
|
|
|
|
function NetworkMgr:restoreWifiAsync()
|
|
|
|
-- os.execute("./restore-wifi-async.sh")
|
|
|
|
end
|
|
|
|
|
|
|
|
function NetworkMgr:isWifiOn()
|
|
|
|
return 0 == os.execute("wmiconfig -i wlan0 --wlan query | grep -q enabled")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
function SonyPRSTUX:getSoftwareVersion()
|
|
|
|
return ffi.string("PRSTUX")
|
|
|
|
end
|
|
|
|
|
|
|
|
function SonyPRSTUX:getDeviceModel()
|
|
|
|
return ffi.string("PRS-T2")
|
|
|
|
end
|
|
|
|
|
|
|
|
-- For Sony PRS-T2
|
|
|
|
local SonyPRSTUX_T2 = SonyPRSTUX:new{
|
|
|
|
isTouchDevice = yes,
|
|
|
|
hasKeys = yes,
|
|
|
|
hasFrontlight = no,
|
|
|
|
display_dpi = 166,
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.info('SoftwareVersion: ', SonyPRSTUX:getSoftwareVersion())
|
|
|
|
|
|
|
|
local codename = SonyPRSTUX:getDeviceModel()
|
|
|
|
|
|
|
|
if codename == "PRS-T2" then
|
|
|
|
return SonyPRSTUX_T2
|
|
|
|
else
|
|
|
|
error("unrecognized Sony PRSTUX model " .. codename)
|
|
|
|
end
|