Перейти к содержимому

logic

Пользователи
  • Публикации

    287
  • Зарегистрирован

  • Посещение

  • Победитель дней

    13

Сообщения, опубликованные пользователем logic


  1. В 16.05.2022 в 14:11, KeyTwoZero сказал:

    Приветствую вас. Этот пост я пишу, чтобы рассказать вам о своей разработке для мода OpenComputers:

     

    BetterBIOS

     

     

    Main.png

     

    Это специальная прошивка BIOS для EEPROM, позволяющая выбирать любое из подключенных устройств для загрузки.

    Для этого используется пользовательский псевдографический интерфейс, который поддерживается для всех уровней видеокарт и экранов (То есть интерфейс будет даже на видеокарте и/или экране первого уровня, при чём с обрезанными адресами, чтобы уместить имя устройства в экран).

     

    Selection.png

     

    Так же, в этой прошивке есть своя система отображения ошибок, показывающая весь "traceback" за исключением не нужных пунктов внутри самой прошивки. Это будет очень полезно для разработчиков собственных операционных систем, ведь данная прошивка подскажет места, в которых возникла ошибка, в то время как стандартная прошивка молчит как партизан.

     

    Error.png

     

    Если доступных для загрузки устройств больше, чем одно - то при включении компьютера, пользователю предлагается выбрать одно из них.

    Если такое устройство только одно - загрузка начнётся незамедлительно.

    Подключение устройств для загрузки происходит динамически, "на лету", прямо во время выбора устройства.

    То же самое с экранами и видеокартами.

    Так же, данная прошивка имеет приоритеты на выбор экрана: первым делом она пытается подключить тот экран, у которого есть клавиатуры поблизости. Если таковых не имеется - использует любой другой.

    Видеокарту прошивка использует максимального уровня.

     

    Прошивка защищена от критических сбоев при резком извлечении устройств, пока программа работает с файлами на них.

    Это делает данную прошивку практически не убиваемой, и позволяет избегать любых несчастных случаев при работе с компьютером.

    Я просто параноик, иначе сделать не мог...

     

    Данная прошивка поддерживает стандартную операционную систему OpenOS, для работы которой требуются функции computer.setBootAddress и computer.getBootAddress. Если вы хотите использовать данную прошивку, но не хотите мусорить в глобальных переменных этими рудиментами - просто вырежьте эти функции, сделать это несложно, ниже будут ссылки на исходники.

     

    Несмотря на весь этот функционал и продуманность, в минимизированном виде данная прошивка помещается на EEPROM, стандартная ёмкость которого - 4096 символов.

     

    Вы можете изучить исходный код данной прошивки, и использовать некоторые приёмы оттуда для своих проектов.

    К сожалению, код не очень хорошо читаемый, но это обусловлено тем, что я писал заранее с расчётом на то, что подробный код будет минимизирован, а минимизаторов кода недостаточно, нужно ещё и грамотно написать код.

     

    Исходный код:

    https://codeberg.org/KeyTwoZero/BetterBIOS/src/branch/main

    (Я ещё делал репозиторий на GitHub, но чёт я его забросил... Мне он не нравится)

     

    Спасибо за внимание. Если у вас есть какие-то идеи, как можно улучшить или ухудшить данную прошивку - пишите здесь, или как-нибудь вычислите меня, постараюсь подумать, и может быть, даже обновлю код, сделав его лучше для вас.

    круто, мне нравиться, вот только хотелось бы выбрать диск один раз и чтоб выбор не постаянно появлялся, а еще хотелось бы разные звуки на подключения и удаления файловрй системмы(ну это я уже так, придераюсь), а чтобы решить проблемму с свободным местом, можеш юзать софтину bpacker(да простят меня админы за упаменания левого софта в чужой теме)

    • Спасибо 1

  2. В 05.06.2020 в 23:35, BrightYC сказал:

    Решил написать свой мультизагрузчик. Возможно, он похож на тот, что поставляется с комплектом MineOS, так что в целом является неплохой заменой стандартного биоса. 

     

    Установка:

     

    Для OpenOS, просто запустите эту команду:

    
    wget -f https://raw.githubusercontent.com/BrightYC/Cyan/master/installer.lua /tmp/installer.lua && /tmp/installer.lua

    Для MineOS же есть приложение в местном AppMarket, под названием Cyan BIOS. Там тоже довольно элементарно.

     

    Исходники лежат тут: https://github.com/BrightYC/Cyan

     

    Что он может?

    • Возможность загрузки/доступа к загрузчику по "белому" списку
    • Lua-интерпретатор
    • Возможность подключения компонентов "на лету"
    • Возможность отформатировать/переименовать файловую систему
    • Загрузка по интернету
       

    Доступ по белому списку:

    Ограничивает возможность управления биосом (на программном уровне), так же, если установить require user input, биос будет ждать нажатие от пользователя в белом списке.


    Shell:


    Позволяет выполнять некий код "на лету". Имплементированы следующие функции:

    • print(...)
    • proxy(componentName: string): component proxy or nil
    • sleep([timeout: number])

    Демонстрация:
     

      Показать содержимое

    WWiX2tQ.png

    pnFC0cO.png

    6QXw6LX.png

    Yi7v2n2.png


    P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.

    вот еще бажочек, текст немного сдвинут вверх и влево, что сильно бросается в глаза на t2 тире


  3. В 25.06.2022 в 20:48, BrightYC сказал:

    потому что код писался специально чтоб лучше сжимался....

     

    В 05.06.2020 в 23:35, BrightYC сказал:

    Решил написать свой мультизагрузчик. Возможно, он похож на тот, что поставляется с комплектом MineOS, так что в целом является неплохой заменой стандартного биоса. 

     

    Установка:

     

    Для OpenOS, просто запустите эту команду:

    
    wget -f https://raw.githubusercontent.com/BrightYC/Cyan/master/installer.lua /tmp/installer.lua && /tmp/installer.lua

    Для MineOS же есть приложение в местном AppMarket, под названием Cyan BIOS. Там тоже довольно элементарно.

     

    Исходники лежат тут: https://github.com/BrightYC/Cyan

     

    Что он может?

    • Возможность загрузки/доступа к загрузчику по "белому" списку
    • Lua-интерпретатор
    • Возможность подключения компонентов "на лету"
    • Возможность отформатировать/переименовать файловую систему
    • Загрузка по интернету
       

    Доступ по белому списку:

    Ограничивает возможность управления биосом (на программном уровне), так же, если установить require user input, биос будет ждать нажатие от пользователя в белом списке.


    Shell:


    Позволяет выполнять некий код "на лету". Имплементированы следующие функции:

    • print(...)
    • proxy(componentName: string): component proxy or nil
    • sleep([timeout: number])

    Демонстрация:
     

      Показать содержимое

    WWiX2tQ.png

    pnFC0cO.png

    6QXw6LX.png

    Yi7v2n2.png


    P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.

    вот еще один баг, ты не откатываешь изменения внесенные в палитру, на третях мониторах ты потеряешь пару оттенков серого что в целом нестрашно, и если бы ты не поддерживал мониторы второго уровня это не было бы так серьезно, но так как в коде у тебя есть упоминания планшетов, я могу с уверенностью сказать что биос создавался для использования в том числе и на мониторах второго уровня, а так последствия от такой смены палитры довольно серьезные, и многие gui программы могут сильно исказиться, так как в палитре просто не будет нужных цветов


  4. В 05.06.2020 в 23:35, BrightYC сказал:

    Решил написать свой мультизагрузчик. Возможно, он похож на тот, что поставляется с комплектом MineOS, так что в целом является неплохой заменой стандартного биоса. 

     

    Установка:

     

    Для OpenOS, просто запустите эту команду:

    
    wget -f https://raw.githubusercontent.com/BrightYC/Cyan/master/installer.lua /tmp/installer.lua && /tmp/installer.lua

    Для MineOS же есть приложение в местном AppMarket, под названием Cyan BIOS. Там тоже довольно элементарно.

     

    Исходники лежат тут: https://github.com/BrightYC/Cyan

     

    Что он может?

    • Возможность загрузки/доступа к загрузчику по "белому" списку
    • Lua-интерпретатор
    • Возможность подключения компонентов "на лету"
    • Возможность отформатировать/переименовать файловую систему
    • Загрузка по интернету
       

    Доступ по белому списку:

    Ограничивает возможность управления биосом (на программном уровне), так же, если установить require user input, биос будет ждать нажатие от пользователя в белом списке.


    Shell:


    Позволяет выполнять некий код "на лету". Имплементированы следующие функции:

    • print(...)
    • proxy(componentName: string): component proxy or nil
    • sleep([timeout: number])

    Демонстрация:
     

      Показать содержимое

    WWiX2tQ.png

    pnFC0cO.png

    6QXw6LX.png

    Yi7v2n2.png


    P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.

    небольшой бажок в установщике для openOS, если загрузиться с lua bios сменить чип и попытаться поставить этот биос вылетит ошибка(хотя чип и прошьётся, не не примениться read only, не напишет seccess, и не предложит reboot), так как ты использовал метод computer.getBootAddress который нежелательно использовать после загрузки компьютера(мое субъективное мнения), это ошибка актуальная для смены lua bios/micro bios/и самого Cyan Bios а так же для всех биосов где computer.getBootAddress просто алиас к eeprom.getData, однако например при загрузке через smart efi и последующий смены чипа с попыткой прошивки Cyan Bios ошибки не последует так как так computer.getBootAddress там реализован иначе, сделай такой код: local bootaddress = fs.get("/").address if computer.getBootAddress then local ok, result = pcall(computer.getBootAddress) if result then bootaddress = result end end eeprom.setData(bootaddress), и проблема исчезнет


  5. В 24.06.2022 в 22:34, Bumer_32 сказал:

    понятно? ты серьёзно?

    тебе сложно написать 1 строку что это не обязательно?

     

     

    я ток ничерта не понял

    там 2 способа установки 1) на чистый диск, 2) на готового робота в OpenOS причем так чтобы OpenOS тоже работала, первый перепрошивки eeprom не требует сгодиться обычный lua bios второй требует


  6. 1 час назад, eu_tomat сказал:

    А какая фраза из твоей инструкции по установке сообщает о том, что прошивка EEPROM является необязательной операцией?

     

    ну.... я думал это и так понятно

    • В шоке 2

  7. 31 минуту назад, eu_tomat сказал:

    @rootmaster А для чего процесс установки сделан таким сложным? Эта OS имеет не настолько богатый функционал, чтобы ради её установки совершать так много действий.

     

    Идеальный процесс установки OS мне видится таким:

    1. Вставляем в компьютер интернет-плату, а в дисковод вставляем дискету с OpenOS.

    2. Включаем компьютер и дожидаемся появления приглашения командной строки.

    3. Вводим команду:

    wget -f https://.../installTopOS.lua /tmp/installTopOS.lua && /tmp/installTopOS.lua

    А дальше программа уже сама должна прошить EEPROM, найти жёсткий диск (предложить выбрать из нескольких найденных) и докачать необходимые файлы. Примерно так и сделано в MineOS, в которую ты регулярно кидаешь камни.

     

    Разные операционные системы в Майнкрафте и так-то не особо полезны в сравнении с копалками или фермами, и поэтому игрокам требуется серьёзная мотивация, чтобы хотя бы один раз запустить очередную OS. Зато простой процесс установки заметно снижает этот барьер: игроки могут установить OS даже без серьёзной мотивации, на минимальном любопытстве.

    вставляешь диск в комп переходишь туда кода он смонтирован и водишь одну команду ВСЕ


  8. 30 минут назад, eu_tomat сказал:

    @rootmaster А для чего процесс установки сделан таким сложным? Эта OS имеет не настолько богатый функционал, чтобы ради её установки совершать так много действий.

     

    Идеальный процесс установки OS мне видится таким:

    1. Вставляем в компьютер интернет-плату, а в дисковод вставляем дискету с OpenOS.

    2. Включаем компьютер и дожидаемся появления приглашения командной строки.

    3. Вводим команду:

    wget -f https://.../installTopOS.lua /tmp/installTopOS.lua && /tmp/installTopOS.lua

    А дальше программа уже сама должна прошить EEPROM, найти жёсткий диск (предложить выбрать из нескольких найденных) и докачать необходимые файлы. Примерно так и сделано в MineOS, в которую ты регулярно кидаешь камни.

     

    Разные операционные системы в Майнкрафте и так-то не особо полезны в сравнении с копалками или фермами, и поэтому игрокам требуется серьёзная мотивация, чтобы хотя бы один раз запустить очередную OS. Зато простой процесс установки заметно снижает этот барьер: игроки могут установить OS даже без серьёзной мотивации, на минимальном любопытстве.

    лол шить eeprom необязательно, это чтобы сделать dualboot roboOS и openOS


  9. В 15.06.2022 в 18:21, Fingercomp сказал:
    Здесь заявляется, что пароли хэшируются. Хотя это определённо прогресс по сравнению с плейнтекстом, мне кажется, готовую хэш-функцию в силу религиозных убеждений ты юзать побоялся и сделал свою. Можешь ли тогда выложить не избитую минификатором используемую тобой функцию хэширования? Кроме того, солишь ли ты пароль перед хэшированием?

    нет пароль не солю хотя стоило бы но вот  30 байт свободного места которых даже не хватило на переключения архитектуры так не считают, а hesh функцию можеш посмотреть в исходнике https://raw.githubusercontent.com/igorkll/topBiosV5/main/microBios.lua


  10. В 15.06.2022 в 17:41, ProgramCrafter сказал:

    Is it time to analyze code?

      Скрыть содержимое
    
    
    biosname="microBios"
    statusAllow=1;
    local b=function()error("no bootable medium found",0)end;
    do
      local type,c,d=type,true,computer.getDeviceInfo()
      local function e(f)
        local g,h,i,j,k=126,1671,7124,"",{}
        for l=1,#f do table.insert(k,f:byte(l))end;
        for l=1,#f do
          local m,n,o=f:byte(l-1),f:byte(l+1),f:byte(l)
          if not m then m=f:byte(#f)end;
          if not n then n=f:byte(1)end;
          local p=m*g+n*h+o*i;p=p+l*h;p=p*(i-(#f-l))
          for q,r in ipairs(k)do p=p+r-l*q*(g-h)end;
          p=math.abs(p)p=p%256;j=j..string.char(p)
          if#j==16 then
            local s=j:byte(1)g=g+s;h=h*s;i=i*s;j=j:sub(2,#j)
          end
        end;
        while#j<16 do j=string.char(math.abs(i+h*#j)%256)..j end;
        return j
      end;
      local function t(u)return component.proxy(component.list(u)()or"*")end;
      local v=t("eeprom")
      local function w(f,x)
        local y,z,l={},1,1;
        while 1 do
          if l>#f then break end;
          local s=f:sub(l,#x+l-1)
          if not y[z]then y[z]=""end;
          if s==x then z=z+1;l=l+#x else y[z]=y[z]..f:sub(l,l)l=l+1 end
        end;
        if f:sub(#f-(#x-1),#f)==x then table.insert(y,"")end;
        return y
      end;
      local function A(B)
        return w(v.getData(),"\n")[B]or""
      end;
      local function C(B,D)
        if A(B)==D then return end;
        if D:find("\n")then error("\\n char")end;
        local y=w(v.getData(),"\n")
        for l=B,1,-1 do
          if not y[l]then y[l]=""end
        end;
        y[B]=D;
        v.setData(table.concat(y,"\n"))
      end;
      local function E(F)
        local G,H,I;
        for J in component.list(F)do
          I=tonumber(d[J].width)
          if component.type(F)=="screen"then
            if#component.invoke(J,"getKeyboards")>0 then I=I+10 end
          end;
          if not H or I>H then G,H=J,I end
        end;
        return G
      end;
      local function K(L,M)
        local N=computer.uptime()
        while computer.uptime()-N<L do M()end
      end;
      local O,P,Q,R=t("internet"),component.proxy(E("gpu")or""),a,{}
      if P then
        Q=A(2)
        if component.type(Q)~="screen"then Q=E("screen")
          if Q then C(2,Q)end
        end;
        if Q then R=component.invoke(Q,"getKeyboards")P.bind(Q)end
      end;
      local function S(T)
        return function()return T end
      end;
      computer.getBootGpu=S(P and P.address)
      computer.getBootFile=function()return A(3)end;
      computer.getBootScreen=S(Q)
      computer.getBootAddress=function()return A(1)end;
      function computer.setBootFile(U)C(3,U)end;
      function computer.setBootScreen(Q)C(2,Q)end;
      function computer.setBootAddress(J)C(1,J)end;
      local V=computer.shutdown;
      function computer.shutdown(W)
        if type(W)=="string"then C(6,W)end;V(W)
      end;
      local function X(J)
        for l,p in ipairs(R)do
          if p==J then return 1 end
        end
      end;
      local function Y(J)
        local Z=component.proxy(J)
        return Z.getLabel()and Z.address:sub(1,4)..":"..Z.getLabel()or Z.address:sub(1,4)
      end;
      local function _(a0)
        local a1,a2,a3,a4=O.request(a0),""
        if a1 then
          while 1 do
            a3,a4=a1.read(math.huge)
            if a3 then a2=a2 ..a3 else
              a1.close()
              if a4 then return a,a4 else return a2 end
            end
          end
        else return a,"Unvalid Address"
        end
      end;
      local a5,a6,a7,a8;
      local function a9()
        if not Q then return end;
        local aa={[8]={0xf0f0f0,0x1e1e1e,0x2d2d2d,0x3c3c3c,0x4b4b4b,0x5a5a5a,0x696969,0x787878,0x878787,0x969696,0xa5a5a5,0xb4b4b4,0xc3c3c3,0xd2d2d2,0xe1e1e1,0},[4]={0xffffff,0xffcc33,0xcc66cc,0x6699ff,0xffff33,0x33cc33,0xff6699,0x333333,0xcccccc,0x336699,0x9933cc,0x333399,0x663300,3368448,0xff3333,0}}aa=aa[a5]
        if aa then a8=c;
          for l,p in ipairs(aa)do P.setPaletteColor(l-1,p)end
        end
      end;
      if Q then
        a5=math.floor(P.getDepth())
        a6,a7=P.getResolution()
        a9()
        if a8 then P.setPaletteColor(1,0x7B68EE)P.setPaletteColor(2,0x1E90FF)P.setPaletteColor(3,0x6B8E23)P.setPaletteColor(4,0x8B0000)P.setPaletteColor(5,0xDAA520)P.setPaletteColor(6,0)P.setPaletteColor(7,0xFFFFFF)
        end
      end;
      local function ab(f,ac,ad)
        P.set((ac or 0)+math.floor(a6/2-(#f-1)/2+0.5),ad or math.floor(a7/2+0.5),f)
      end;
      local function ae()
        P.setBackground(0)P.setForeground(0xFFFFFF)P.fill(1,1,a6,a7," ")
      end;
      local function af(f,ag,L,ah,ai)
        if not Q then if ah then error(ah,0)end;return end;
        ae()
        P.setForeground(ag or 1,not ai and a8)
        ab(f)
        if L==c then
          ab("Press Enter To Continue",a,math.floor(a7/2+0.5)+1)
          while 1 do
            local aj={computer.pullSignal()}
            if aj[1]=="key_down"and X(aj[2])and aj[4]==28 then break end
          end
        elseif L then
          K(L,function()computer.pullSignal(0)end)
        end;
        return 1
      end;
      _G.status=function(f)af(f,0xFFFFFF,a,a,1)end;
      local function ak(f,al)
        local am=""
        local function an()
          af(f..": "..(al and string.rep("*",#am)or am).."_",5)
        end;
        an()
        while 1 do
          local aj={computer.pullSignal()}
          if X(aj[2])then
            if aj[1]=="key_down"then
              if aj[4]==28 then
                return am
              elseif aj[3]>=32 and aj[3]<=126 then
                am=am..string.char(aj[3])an()
              elseif aj[4]==14 then
                if#am>0 then am=am:sub(1,#am-1)an()end
              elseif aj[4]==46 then
                break
              end
            elseif aj[1]=="clipboard"then
              am=am..aj[3]an()
              if am:byte(#am)==13 then return am end
            end
          end
        end
      end;
      local function ao(ap,aq,ar)
        local as,at,au={},{},ar or 1;
        function as.a(...)
          table.insert(at,{...})
        end;
        local function av()
          ae()
          P.setForeground(aq,a8)
          ab(ap,a,a7//3)
          local m,o,n=at[au-1],at[au],at[au+1]
          P.setBackground(0)
          if m then
            P.setForeground(m[2],a8)ab(m[1],-a6//3,a7//3*2)
          end;
          if n then
            P.setForeground(n[2],a8)ab(n[1],a6//3,a7//3*2)
          end;
          P.setBackground(o[2],a8)P.setForeground(0)ab(o[1],a,a7//3*2)
        end;
        function as.l()
          av()
          while 1 do
            local aj={computer.pullSignal()}
            if aj[1]=="key_down"and X(aj[2])then
              if aj[4]==28 then
                if not at[au][3]then break end;
                local aw=at[au][3]()
                if aw then return aw end;
                av()
              elseif aj[4]==205 then
                if au<#at then au=au+1;av()end
              elseif aj[4]==203 then
                if au>1 then au=au-1;av()end
              end
            end
          end
        end;
        return as
      end;
      local ax=A(6)C(6,"")
      local function ay(J)
        local Z=component.proxy(J)
        if Z.exists("/boot/kernel/pipes")then return"/boot/kernel/pipes"
        elseif Q then
          if Z.exists("/OS.lua")then return"/OS.lua"
          elseif Z.exists("/init.lua")then return"/init.lua"
          end
        else
          if Z.exists("/init.lua")then return"/init.lua"
          elseif Z.exists("/OS.lua")then return"/OS.lua"
          end
        end
      end;
      local function az()
        af("Please Wait",5)
      end;
      local function aA()
        if A(4)==""then return 1 end;
        while 1 do
          local aB=ak("Enter Password",1)
          if not aB then break end;
          if e(aB)==A(4)then return 1 end
        end
      end;
      local function aC()
        if A(5)==""and not aA()then V()end;
        local aD=ao("micro bios",2)
        aD.a("Back",4)
        aD.a("Reboot",4,function()V(1)end)
        aD.a("Shutdown",4,V)
        if O then
          aD.a("Url Boot",3,function()
              local a0=ak("Url")
              if a0 then
                local a2,ah=_(a0)
                if a2 then
                  local M,ah=load(a2,"=urlboot")
                  if M then
                    a9()
                    local aE,ah=pcall(M)
                    if not aE then af(ah or"unknown error",0xFFFFFF,c,a,1)end
                  else af(ah,4,c)
                  end
                else af(ah,4,c)end
              end
            end)
        end;
        aD.a("Password",5,function()
            if aA()then
              local aD=ao("Password",3)
              aD.a("Set Password",5,function()
                  local aF=ak("Enter New Password",1)
                  if aF and aF~=""and aF==ak("Confirm New Password",1)then az()C(4,e(aF))end
                end)
              aD.a("Set Password Mode",5,function()
                  local aD=ao("Select Mode",2)
                  aD.a("Menu",5,function()az()C(5,"")end)
                  aD.a("Boot",5,function()az()C(5,"1")end)
                  aD.a("Disable",5,function()az()C(5,"2")end)
                  aD.a("Back",4)aD.l()
                end)
              aD.a("Clear Password",5,function()
                  az()C(4,"")C(5,"")
                end)
              aD.a("Back",4)
              aD.l()
            end
          end)
        for J in component.list("filesystem")do
          local ap=Y(J)
          aD.a(ap,1,function()
              local aD=ao("Drive "..ap,2)
              local Z=component.proxy(J)
              local aG={"/init.lua","/OS.lua"}
              for l=2,1,-1 do
                if not Z.exists(aG[l])then table.remove(aG,l)end
              end;
              local aH="/boot/kernel/"
              for aI,U in ipairs(Z.list(aH)or{})do
                table.insert(aG,aH..U)
              end;
              if#aG>0 then
                aD.a("boot",1,function()
                    local U=ay(J)
                    if U then az()C(1,J)C(3,U)return 1 end;
                    af("Boot File Is Not Found",a,c)
                  end)
              end;
              local function aJ(U)
                if component.invoke(J,"exists",U)then
                  aD.a(U,1,function()az()C(1,J)C(3,U)return 1 end)
                end
              end;
              for l,p in ipairs(aG)do aJ(p)end;
              aD.a("Back",4)
              return aD.l()
            end)
        end;
        aD.l()
      end;
      if ax~="fast"and A(5)=="1"and(not Q or not aA())then V()end;
      if Q then
        if ax=="bios"then
          aC()
        elseif ax~="fast"and#R>0 and af("Press Alt To Open The Bios Menu")then
          K(1,function()
              local aj={computer.pullSignal(0.1)}
              if aj[1]=="key_down"and X(aj[2])and aj[4]==56 then aC()end
            end)
        end
      end;
      local aK,U=A(1),A(3)
      local aL=component.proxy(aK)
      if not aL or not aL.exists(U)then
        af("Search For A Bootable Filesystem")
        U=a;
        if aL then U=ay(aK)end;
        if not U then
          for aM in component.list("filesystem")do
            local aN=ay(aM)
            if aN then aK=aM;U=aN;break end
          end
        end;
        if U then
          az()C(1,aK)C(3,U)
          aL=component.proxy(aK)
        else
          af("Bootable Filesystem Is Not Found",a,c,1)V()
        end
      end;
      if Q then a9()end;
      af("Boot To Drive "..Y(aK).." To File "..U,0xFFFFFF,a,a,1)
      local U,am=assert(aL.open(U,"rb")),""
      while 1 do
        local aB=aL.read(U,math.huge)
        if not aB then break end;
        am=am..aB
      end;
      aL.close(U)
      if U=="/OS.lua"then
        v.getData=function()return aK end
      end;
      b=load(am,"=init")
    end;
    b()

     

     

    исходник же в репозитории есть, зачем?


  11. изначально разрабатывалась под eeprom от сюда и фичи boot to external os и много плохого кода

    ос была портирована на скорую руку так что извините и зарепортире если работы вдруг окажется нестабильной

    о любых бага просьба репортить в тему

     

    yAlPxbz.png

     

    функционал

    • установка привата на робота (ака useradd)
    • настройка автозагрузки
    • установка одной из 2 предустановленных тем
    • скачивания программ по url
    • показ документации к программам
    • перемежения/копирования/переименования программ
    • запуск программ

     

    установка ос на диск

    • установка с робота: перейдите в тему мода для openOS() и откройте dev устоновшик, и устоновите им micro bios, затем введите на роботе команду:
      mkdir /boot/kernel; wget https://raw.githubusercontent.com/igorkll/roboOS/main/source.lua /boot/kernel/roboOS -f

      затем переключите ос, для этого при загрузке micro bios нажмите alt найтите диск робота и выберите /boot/kernel/roboOS

    • установка с компьютера: устоновите диск будушего и разобраного робота в компьютер перейдите туда куда ом смонтирован (обычьно /mnt/xxx (где xxx первые три буквы uuid диска)) а зачем введите команду 
      wget https://raw.githubusercontent.com/igorkll/roboOS/main/source.lua init.lua

     

    пример программы для данной ос(круговая копалка)

    local robot = component.proxy(component.list("robot")())
    
    if gui then
        gui.status("to exit press ctrl+c")
    end
    
    local sides = {
        bottom = 0,
        top = 1,
        back = 2,
        front = 3,
        right = 4,
        left = 5,
        unknown = 6,
    
        down = 0,
        up = 1,
        north = 2,
        south = 3,
        west = 4,
        east = 5,
    
        negy = 0,
        posy = 1,
        negz = 2,
        posz = 3,
        negx = 4,
        posx = 5,
    
        forward = 3
    }
    
    local damegeWait = 0.5
    
    -----------------------------------------------
    
    local function interrupt(time)
        local e = {computer.pullSignal(time or 0.1)}
        if e[1] == "key_down" and e[3] == 3 and e[4] == 46 then
            error("terminated", 0)
        end
    end
    
    local function delay(time)
        local inTime = computer.uptime()
        while computer.uptime() - inTime < time do
            interrupt(time - (computer.uptime() - inTime))
        end
    end
    
    local oldInterruptTime = computer.uptime()
    local function interruptTimer()
        if computer.uptime() - oldInterruptTime > 1 then
            interrupt()
            oldInterruptTime = computer.uptime()
        end
    end
    
    -----------------------------------------------
    
    local function wait(event)
        while not event() do
            interruptTimer()
        end
    end
    
    local function move(side, swing, dmg)
        while true do
            interruptTimer()
            local detectOk, detectOut, detectType = pcall(robot.detect, side)
            if not detectOk or not detectOut then
                if robot.move(side) then break end
            else
                if swing and (dmg or detectType ~= "entity") then
                    robot.swing(side)
                    if damegeWait and detectType == "entity" then delay(damegeWait) end
                end
            end
        end
    end
    
    local function swing(side, dmg)
        local swingCount, detectOut, detectType = 0, nil, nil
        while true do
            interruptTimer()
            swingCount = swingCount + 1
            detectOut, detectType = robot.detect(side)
            if detectType == "liquid" or detectType == "air" then
                break
            elseif detectType == "entity" then
                if not dmg then break end
                if not robot.swing(side) then break end
                delay(damegeWait)
                if swingCount >= 16 then break end
            else
                if not robot.swing(side) then break end
                if swingCount >= 4 then break end
            end
        end
    end
    
    local function waitEntity(side)
        while select(2, robot.detect(side)) == "entity" do interruptTimer() end
    end
    
    -----------------------------------------------
    
    local size = 1
    while true do
        for i = 1, 2 do
            for i2 = 1, size do
                swing(sides.up, true)
                swing(sides.down, true)
                move(sides.forward, true, true)
            end
            robot.turn(false)
        end
        size = size + 1
    end

    демо программа демонстрирующая работу gui

     

    local docs = {[0] = "TUT OSNOVNA DOCA A UNICODE NE PODDERHITICA POTOMU CHE EKONOMIL BYTES FOR EEPROM"}
    local strs = {}
    local funcs = {}
    
    table.insert(strs, "null")
    table.insert(docs, "null menu point")
    table.insert(funcs, false)
    
    table.insert(strs, "yesno")
    table.insert(docs, "yesno gui element")
    table.insert(funcs, function()
        if gui.yesno("shutdown?") then
            computer.shutdown()
        end
    end)
    
    table.insert(strs, "yesno")
    table.insert(docs, "yesno gui element")
    table.insert(funcs, function()
        if gui.yesno("shutdown?") then
            computer.shutdown()
        end
    end)
    
    table.insert(strs, "read")
    table.insert(docs, "input")
    table.insert(funcs, function()
        local data = gui.read("press ctrl+c to cancel")
        if data then
            gui.warn("msg: " .. data)
        end
    end)
    
    for i = 100, 2000, 100 do
        table.insert(strs, tostring(i))
        table.insert(docs, "test doc for menu point "    .. tostring(i))
        table.insert(funcs, function()
            computer.beep(i, 0.1)
        end)
    end
    
    gui.setData("gui test", docs, strs)
    
    local num, scroll = 1, 0
    while true do
        num, scroll = gui.menu(num, scroll)
        if funcs[num] then
            funcs[num]()
        else
            gui.warn("is null menu point")
        end
    end

     

    документация для пользователей

    • программы могут располагаться на любых дисках и дискетах, автозагрузка привязывается к конкретному диску и ссылается на конкретный файл а ссылка лежит на диск с установленной автозагрузкой в /roboOS/autorun.cfg
    • настройки ос храниться в /roboOS/settings.cfg на системном диске
    • такая система позволяет легко поставить на робота одну автозагрузочную программу а на дискету другую, причем информация о том какая программа автозагрузочная лежит на диске а не в системе, PS если хотите создать автозагрузочную дискету то создайте на ней файл /roboOS/autorun.cfg а в нем ссылка не файл на этой же дискете, например /roboOS/programs/karer/main.lua
    • каждая программа имеет свою папку в /roboOS/programs там должен находиться файл main.lua а так же может находиться файл doc.txt с небольшим описаниям обратите внимания что при скачивании программы по url будет скачан только файл main.lua однако при входе вы сможете скачать все необходимые файлы
    • в программу первым аргументом передаться табличка с некими данными о этой программе а конкретнее имеет в себе 2 ключа fs proxy файловой системы от куда произошёл запуск программы и file с путем до главного файла этой программы
    • по у автозагрузки приоритет на внешние диски
    • при запуске автозагрузочного файла у вас есть секунда на то чтобы отменить запуск и сразу попасть в меню для этого необходимо нажать alt
    • Нравится 1

  12. В 05.06.2020 в 23:35, BrightYC сказал:

    Решил написать свой мультизагрузчик. Возможно, он похож на тот, что поставляется с комплектом MineOS, так что в целом является неплохой заменой стандартного биоса. 

     

    Установка:

     

    Для OpenOS, просто запустите эту команду:

    
    wget -f https://raw.githubusercontent.com/BrightYC/Cyan/master/installer.lua /tmp/installer.lua && /tmp/installer.lua

    Для MineOS же есть приложение в местном AppMarket, под названием Cyan BIOS. Там тоже довольно элементарно.

     

    Исходники лежат тут: https://github.com/BrightYC/Cyan

     

    Что он может?

    • Возможность загрузки/доступа к загрузчику по "белому" списку
    • Lua-интерпретатор
    • Возможность подключения компонентов "на лету"
    • Возможность отформатировать/переименовать файловую систему
    • Загрузка по интернету
       

    Доступ по белому списку:

    Ограничивает возможность управления биосом (на программном уровне), так же, если установить require user input, биос будет ждать нажатие от пользователя в белом списке.


    Shell:


    Позволяет выполнять некий код "на лету". Имплементированы следующие функции:

    • print(...)
    • proxy(componentName: string): component proxy or nil
    • sleep([timeout: number])

    Демонстрация:
     

      Показать содержимое

    WWiX2tQ.png

    pnFC0cO.png

    6QXw6LX.png

    Yi7v2n2.png


    P.S Огромное спасибо @Fingercomp за лекцию по экранированию символов.

    укажи в теме пожалуйста что на первых мониторах не работает а то я они комп так ухандохал, конечно на lua биос потом обратно поменял но все равно неприятненько


  13. В 12.10.2020 в 21:32, nikitaaaaa сказал:

    Вобщем времени у меня не так много надо чтоб каким то образом робот без внутреннего монитора передавал картинку на компьютер по беспроводной карте.

    Примерно как терминальный сервер и терминал. Думаю вы все поняли, не задавайте лишних вопросов а я дальше по секретным делам 

    могу сделать, но не за безплатно, в роботе не gpu не screen не потребуеться, можно будет внешний хоть t3 подключить, интересует?

    • Ха-ха 2

  14. aJQiLsL.png

     

    как пользоваться:

    • для входа в меню bios нажмите alt при загрузке
    • для установки пароля bios>password(текущий пароль)>set password вводите пароль два раза
    • пароль можно выключить и он будет нужен только для входа в меню password он может блокировать меню или загрузку в цело
    • пароль захеширован хоть и храниться в nbt, владельцы варпов могут быть спокойны
    • также вы можете перезагрузить компьютер без появления надписи bios menu(computer.shutdown("fast")) или сразу в меню (computer.shutdown("bios"))
    • если у вас стоит мод для openOS() то вы можете использовать reboot fast и reboot bios прямо в shell

     

    также из под функций присутствует:

    • url boot (Internet>Url boot)
    • возможность запуска openOS через интернет(Internet>openOSonline)
    • так же биос умеет подгружать утилиты с github репозитория, которых в скором времени там будет много
    • password
    • возможность загрузки в разные файлы на одном диске например - openOS и mineOS

     

    что может быть непонятно:

    • если вы вводите пароль а поле просто очищается значит вы ввели его неправильна
    • если вы вводите в буквы не вводиться убедитесь что у вас включен английский язык
    • если вы поставили пароль в он не подставился и не было окна pleas wait значит два пароля не совпадают

     

    примечания:

    • поддерживаются все тиры железа
    • обязательно установить архитектуру процессора в lua 5.3(начиная с новой версии биос меняет ее автоматически(как Cyan Bios))
    • начиная с новой версии загрузка в mineOS работать не будет, это проблема ос, так как она использует getData вместо getBootAddress, и я больше не собираюсь поддерживать этот костыль(поддержка mineOS была полностью удалена)

     

    команда для установки: 

    wget https://raw.githubusercontent.com/igorkll/microBios/main/compressed.bin /tmp/bios.lua -f;echo "" > /dev/eeprom-data;flash /tmp/bios.lua microBios -q;echo "require('computer').setArchitecture('lua 5.3')" > "/tmp/architecture.lua" /tmp/architecture.lua;reboot

     

    • Ха-ха 1
    • Грусть 1

  15. В 06.06.2020 в 05:44, BrightYC сказал:

    Я думал сделать так, но к сожалению у меня совсем не хватает места. Я не знаю что можно сделать, разве что назначить какого-то одного админа.

    Исправлю. (Вообще, там должно быть 12 символов).

    В принципе, код EEPROM'ы хранится в NBT, я совсем забыл об этом. Переделаю сегодня...

    сейчас я работаю над своим новым биосом и там будет пароль который хоть и будет в eeprom data будет закеширован, так что пароль не такой уж и плахой вариант


  16. В 03.06.2022 в 12:49, eu_tomat сказал:

    @rootmaster Правильно ли я понял, что эта система автокрафта состоит из единственного робота даже без вспомогательных сундуков, а все необходимые для крафта материалы должны находиться во внутреннем инвентаре робота?

    да ты правильно все понял


  17. программа которая может сома крафтить предметы

    при установке мода для openOS не соглашайтесь на установку top bios v5.1 он делает программный read only и будет препятствовать своему удалению если хотите хороший БИОС установите мод dev установщиком от сюда

    wget https://raw.githubusercontent.com/igorkll/openOSpath/dev/bin/installer.lua /tmp/ins.lua -f; /tmp/ins.lua

     

     

    конфигурация робота

    • контроллер инвентаря
    • улучшения верстак
    • два апгрейдя инвентарь(лучше больше)
    • монитор, видеокарта и клавиатура
    • интернет карта(для установки мода для openOS необходимого для запуска)

     

    чтобы скачать программу можно пойти двумя путями:

    1. скачать из магазина, скачиваем мод для openOS из соответствующий темы, затем зайти в market, виртуальным курсором навести на robotCraft нажать enter и скачать его 
    2. скачать программу этой командой
      wget https://raw.githubusercontent.com/igorkll/appMarket3/main/robotCraft.lua /usr/bin/robotCraft.lua -f
      а она уже сома откроет установщик мода

     

    чтобы открыть программу просто введите в терминале robotCraft, если предлагает установить мод для openOS смело устанавливайте(без него не будет работать)

     

    управления

    • в меню можно видеть зарегистрированные предметы а ниже подменю для осуществления различных действий
    • для регистрации предметы выложите его крафт в верхнем левом углу инвентаря робота а результат крафта положите в четвертый слот и нажмите add
    • меня give это продвинутый поиск предметов он скрафтит предмет если не сможет найти
    • find в отличии от give умеет только искать но не крафтить
    • при выборе предметы в главном меню предстанет выбор крафтить один или пока не вылезет какая-то ошибка(например закончатся ресурсы)
    • выход из программы кнопкой exit или ctrl + alt + c(например если идет крафт)
    • В шоке 1
    • Грусть 5

  18. В 09.11.2019 в 23:06, 8urton сказал:

    img0.jpg.1de48c0c1a6222163482b68eb428a279.jpg

     

    Последняя версия         : 2.2
    Команда для установки : pastebin run ngQT9YF8

     

    Системные требования:

    • Корпус компьютера, екран - 1 Tier
    • Процесор - 1 Tier
    • Видеокарта - 1 Tier
    • Память - 1.5 Tier (x1)
    • Жёрсткий диск - 1 Tier
    • Дисковод, клавиатура, Lua BIOS - должны присутствовать

     

    Краткое описание: Inerpat - примитивная система для запуска на любом ведре, и инструмент для создание и отладки EEPROM кода.
    Также она поможет в ситуации, когда ваш компьютер превратился в "обожённый строительный материал"

     

    Специальные клавиши:

    • ALT - Открыть главное меню
    • CTRL - Открыть меню файла/папки. В редакторе - меню сохранения.
    • TAB - Навигация по доступным файловым системам

     

    Скриншоты:

    img1.jpg.6f4b917a44f4fb0cf12a42191c2ac48b.jpg

     

    img2.jpg.ddc5baeeb05174e5ab0c0a72b3c92697.jpg

     

    img3.jpg.4bb127fe0a465a063e60299c65ee6e88.jpg

    почему после каждого действия откидывает в самое начало списка файлов? если бы не это отчичьная бы ос была бы


  19. начнем с того что программа идет в паре программа/загрузчик

    для программы необходимо создать отдельную папку и поместить туда саму программа и загрузчик(bootloader.lua)

     

    устоновка:

     

    что умеет данная прошивка eeprom?

    • удаленное включить/выключить микроконтроллер
    • узнать в каком он сейчас состоянии(вкл/выкл)
    • удаленная перезагрузка
    • удаленный запуск кода
    • удаленная прошивка(обратите внимания что код имеющий синтаксическую ошибку не будет прошит)
    • поиск устройств
    • база данные хранения uuid модемов для обращения по кодовому имени

     

    как работать с базой данных?

    • названия из базы можно использовать вместо полного uuid
    • регистрация nFlash base register uuid(можно сокращенный, если модем установлен в компьютер)
    • регистрация по сети, nFlash broadcast list; nFlash broadcast register "номер из списка" имя

     

    полная документация

        print("power control:")
        print("nFlash control registernameOrFulluuid power on")
        print("nFlash control registernameOrFulluuid power off")
        print("nFlash control registernameOrFulluuid power reboot")
        print("nFlash control registernameOrFulluuid power get")
        print("programm control:")
        print("nFlash control registernameOrFulluuid run path")
        print("nFlash control registernameOrFulluuid fastrun code")
        print("nFlash control registernameOrFulluuid flash path")
        print("base:")
        print("nFlash base list")
        print("nFlash base register uuid(если модем устоновлен в компьютер можно сократить uuid(для быстрой регистрации))")
        print("nFlash base remove")
        print("broadcast:")
        print("nFlash broadcast list(список сохраняться в оперативку для регистрации по номеру)")
        print("nFlash broadcast register number registerName(для начала требуеться проиндексировать устройства)")
        print("nFlash broadcast savedList(выводит предыдулий лист без поиска по сети)")
    • Нравится 2

  20. В 14.04.2022 в 20:50, Taoshi сказал:

    Первым шагом навстречу пользователям является, как я думаю, наличие такой ссылки на программу, благодаря которой можно скачать и запустить её без  необходимости качать и распаковывать архивы.

     

    Вторым, если программа состоит более чем из одного файла, самодокачивание программой своих/не своих частей необходимых для полноценной работы.

     

    Доки на мой взгляд - третьестепенный фактор: большинство пользователей хочет максимально просто получить что-либо и пользоваться этим. Но в это же время предоставляемые продуктом возможности должны быть описаны хоть как-то, иначе они рискуют остаться неизвестными. Например, вывод по кнопке/команде краткого списка "что и как" – один из оптимальных вариантов. Ведь доки, по сути, это задокументированные возможности продукта, а не какие-то взятые с потолка абстрактные рассуждения. И когда автор в теме, в своей теме, пишет что может его программа  – это не только добавляет ему  постов в своей теме, но и - что более важно - делает описание более обширным, более ЗАДОКУМЕНТИРОВАННЫМ. Сделал обновление: что-то добавил или что-то поменял – напиши там же. Это удобно всем.

    у моего софта уже давно есть устоновшик


  21. 1 минуту назад, eu_tomat сказал:

    Насколько я знаю, кнопка включения-выключения немедленно выключает компьютер, не генерируя каких-либо событий. Поэтому и перехватить её нажатие невозможно.

     

    Можно, например, использовать для этой цели вспомогательный компьютер, который, обнаружив отключение основного компьютера, отключит вслед за ним и все подключенные мониторы.

    во первых, это был премер задачи для который может пригодиться обработка, во вторых если я напишу OS поддерживаюшю несколько мониторов даже если есть одна карта то мне нада ставить 2 компа? както не рационально


  22. 7 минут назад, eu_tomat сказал:

    Можно сделать кнопку для гашения мониторов сигналом красного камня.

    Но удобнее, наверное, выключать компьютер программно, чтобы перед выключением компьютера автоматически гасли все мониторы.

     

    нет, я хочу чтобы была какаето функция которая срабатывала не только при програмном выключении но и аппаратном, подмена метада shutdown не помогла, она позваляет обработать софт выключения но не хард, а как перехватить хард выключения не особо понятно

×
×
  • Создать...