Merge pull request #12412 from s-hadinger/partition_manager_v0

Add Partition Manager v0 in Berry
This commit is contained in:
s-hadinger 2021-06-18 22:54:21 +02:00 committed by GitHub
commit 23970b4031
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 112 additions and 4 deletions

View File

@ -110,6 +110,15 @@ class Partition_info
end
# check if the parition is an OTA partition
# if yes, return OTA number (starting at 0)
# if no, return nil
def is_ota()
if self.type == 0 && (self.subtype >= 0x10 && self.subtype < 0x20)
return self.subtype - 0x10
end
end
def tostring()
import string
var type_s = ""
@ -418,14 +427,13 @@ end
partition.Partition = Partition
return partition
#Example
#-
#- Example
import partition
Partition = partition.Partition
# read
p = Partition()
p = partition.Partition()
print(p)
-#

View File

@ -0,0 +1,100 @@
#-------------------------------------------------------------
- Parser manager for ESP32
-
-------------------------------------------------------------#
import flash
import string
import partition
import webserver
class Partition_manager : Driver
def init()
end
# create a method for adding a button to the main menu
# the button 'Partition Manager' redirects to '/part_mgr?'
def web_add_button()
webserver.content_send(
"<form id=but_part_mgr style='display: block;' action='part_mgr' method='get'><button>Partition Manager</button></form>")
end
#
# Show a single OTA Partition
#
def page_show_partition(slot, active)
webserver.content_send("<fieldset><legend><b>&nbsp;" + slot.label)
if active
webserver.content_send(" (active)")
end
webserver.content_send("</b></legend>")
webserver.content_send(string.format("<p><b>Start: </b>0x<b>%03x</b> 000</p>", slot.start / 0x1000))
webserver.content_send(string.format("<p><b>Size: </b>%i KB</p>", slot.size / 1024))
webserver.content_send("<p></p></fieldset><p></p>")
end
#
# Show a single OTA Partition
#
def page_show_spiffs(slot, free_mem)
webserver.content_send("<fieldset><legend><b>&nbsp;" + slot.label)
webserver.content_send("</b></legend>")
webserver.content_send(string.format("<p><b>Start: </b>0x<b>%03x</b> 000</p>", slot.start / 0x1000))
webserver.content_send(string.format("<p><b>Size: </b>%i KB</p>", slot.size / 1024))
if free_mem != nil
webserver.content_send(string.format("<p><b>Unallocated: </b>%i KB</p>", free_mem / 1024))
end
webserver.content_send("<p></p></fieldset><p></p>")
end
def page_show_partitions()
var p = partition.Partition()
# display ota partitions
for slot: p.slots
# is the slot app?
var ota_num = slot.is_ota()
if ota_num != nil
# we have an OTA partition
self.page_show_partition(slot, ota_num == p.otadata.active_otadata)
elif slot.type == 1 && slot.subtype == 130
var flash_size = tasmota.memory()['flash'] * 1024
var used_size = (slot.start + slot.size)
self.page_show_spiffs(slot, slot == p.slots[-1] ? flash_size - used_size : nil)
end
end
end
#- this method displays the web page -#
def page_part_mgr()
if !webserver.check_privileged_access() return nil end
webserver.content_start("Partition Manager") #- title of the web page -#
webserver.content_send_style() #- send standard Tasmota styles -#
webserver.content_send("<p><b>Esp32 Partition Manager</b></p><p></p>") #- send any html -#
self.page_show_partitions()
webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -#
webserver.content_stop() #- end of web page -#
end
#- this is called at Tasmota start-up, as soon as Wifi/Eth is up and web server running -#
def web_add_handler()
#- we need to register a closure, not just a function, that captures the current instance -#
webserver.on("/part_mgr", / -> self.page_part_mgr())
end
end
#- create and register driver in Tasmota -#
partition_manager = Partition_manager()
tasmota.add_driver(partition_manager)
## to be removed if put in 'autoexec.bat'
partition_manager.web_add_handler()