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

1Ridav

Администраторы
  • Публикации

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

  • Посещение

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


  1. Хм, почему то у меня крашится приложение при попытке что-либо отправить (в приложении "rc" произошла ошибка). Android 4.1.1

    Приложение больше не соответствует методам работы моста. Допиливаю новое приложение ТЫК


  2. Изменил библиотеку, адаптировал к новым алгоритмам работы моста. Исправил несколько серьезных багов.

    Мост работает по адресу bridge.computercraft.ru .Система уже доступна для полноценного использования, допиливаю лишь детали в андроид приложении


  3. Давно хотел заняться вводом цветов в редактор, но и так загружен несколькими задумками. Не совсем понял для чего использовать библиотеку отдельно, на мой взгляд будет удобнее сделать копию оригинального редактора и дополнить уже его. Нецензурные словечки в коде напрягают :unsure:.  Скорость прорисовки надо будет еще допиливать, хотя не уверен, что сильно возрастет

     

    PS: В циклах используй кеширование функций для unicode.find, получишь прирост скорости на 20% минимум

    for i = 1, 1000 do
       math.sin(i)
    end
      работает на 30% медленее, чем
    local sin = math.sin //кеширование функции
    for i = 1, 1000 do
       sin(i)
    end
    • Нравится 2

  4. На счет буферизации изображений на экране. В свободное время сделаю библу-прослойку для буферизации изображений, в графических интерфейсах будет значительный прирост производительности. Работать будет так же как и обычный gpu.set и аналогичные функции видеокарты. Дополнится лишь функцией - flush()


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

     

    write(chunk) cyka = cyka .. chunk

    Просто убило наповал



    Некоторые библиотеки для этой ОС как оказалось взяты с нашего портала :lol:  Так что полезным делом занимаемся, товарищи

    https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/qrcode.lua

    https://github.com/IgorTimofeev/OpenComputers/blob/master/lib/thread.lua


  6.  

     

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

     

    Плюсы по сравнению с оригиналом:

    1. Объектный подход

    2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице

    3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные

     

     

     

    --by 1Ridav, rewritten by FredoNook
    ---http://computercraft.ru
    local PWD = os.getenv("PWD")
     
    local pref = {}
    local meta = {}
     
    meta.filename = ""
    meta.table = {}
     
    local function load(path)
      local table = {}
      local key, value, delimeter
      local len = 0
     
      local f = io.open(path, "r")
      if not f then return nil end
     
      for line in f:lines() do
        len = len + 1
        delimeter = string.find(line, "=")
        key = string.sub(line, 1, delimeter-1)
        value = string.sub(line, delimeter+1, #line)
        table[key] = value
      end
     
      f:close()
      if len == 0 then return nil end
      return table
    end
     
    function meta.__call(op, path)
      local newmeta = {}
      for n, v in pairs(meta) do
        newmeta[n] = v
      end
      local table = load(PWD..path) or {}
      newmeta.table = table
      newmeta.filename = PWD..path
      newmeta.__index = newmeta
      setmetatable(table, newmeta)
      return table
    end
     
    function meta:save()
      local f = io.open(self.filename, "w")
      if not f then return false end
      for k, v in pairs(self.table) do
        f:write(k.."="..v.."\n")
      end
      f:close()
      return true
    end
     
    setmetatable(pref, meta)
    return pref

     

     

     

    Использование:

    preferences = pref("filepath")
    

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

    preferences:save()
    

    Сохраняет таблицу в файл (по пути который был задан в pref("filename"))

     

    Пример:

    pref = require("pref") // подключаем либу
    
    settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица
    settings.fname = "Bob"  -- Добавляем значения к таблице
    settings.lname = "Marley"
    settings.year = 90
    settings.status = "Narcoman"
    settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории
     
    settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории
    settings.year = 00  -- Меняем значения в загруженной таблице
    settings.status = "Icon"
    settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директории
    
    

    PS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome.

     

     

     

    Я тоже по началу такой путь выбрал. но потом пока дебажил - вечно путался где у меня префы, а где свои переменные. Сказалось то, что всегда работал с ними через get/set вызовы функций типа set("key", value). Поэтому решил для наглядности использовать табличный вид, они контрастно выделяются на фоне. В принципе большой разницы нет в моем или твоем варианте, это лишь дело вкуса при использовании

     

    PS: Поднял твое сообщение, чтобы было видно всем


  7. Хм, яндекс почта :)

    А вы оказывается используете динамический DNS http://pdd.yandex.ru

    Сам лично использовал их DNS. Шустрая и юзабельная.

    Хотя если IP динамический (как у меня), то сайтец порой бывает в оффлайне пока кеширующие сервера обновят A-записи.

     

    Ну да ладно много болтовни, если можно мне тоже ящичек? ;)

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

    tuxshot@computercraft.ru Зарегистрирован, первичный пароль скинул в ЛС


  8. Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера

     

    В примере описано все очень просто.

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

    Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что

    if msg == nil then

       br.init("КЛЮЧ")

    Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам


  9. https://github.com/1Ridav/Bridge-OpenComputers/blob/master/bridgeLIB.lua
    мобильное приложение
     
    Система работает по принципу
    Мобильное приложение соединяется с мостом и передает ключ
    Клиентская часть OC соединяется с мостом и передает ключ
    Мост найдя два одинаковых ключа начнет ретранслировать сообщения от мобильного приложения к ОС, так и от ОС к мобильному приложению.
     


    b391e31b50.png


     
    Подключать приложение и ОС к мосту можно в любом порядке очереди, активность соединения поддерживается самостоятельно. При обрыве соединения OC с мостом, в ОС требуется использовать init(КЛЮЧ)
     
     
    Функции

    init("стринг ключ", "HOST/IP:PORT"):true/false вводный аргумент ключ соединения, возвращает true/false успешно ли соединение, используется для того, чтобы подключиться к мосту с заданным ключом
    
    send("стринг"):true/false вводный аргумент сообщение для пересылки, возвращает true/false успешности отсылания на мост
    receive():string/nil:true/false --НЕ БЛОКИРУЕТ программу
    первый аргумент сообщение message, оно может принимать значения:
     "" пустышки при отсутствии сообщений, nil при потере соединения с мостом
    Второй аргумент указывает на то, есть ли соединение с мобильным устройством true/false
    isBridgeConnected():true/false Проверка соединения с мостом
    isPairConnected():true/false Проверка соединения с мобильным устройством
    split("стринг", "разделитель"):table -- легкий способ разделить ваши сообщения по разделителям. 
    sendToast("стринг", 0/1) --Дает команду андроиду показать тост, второй аргумент указывает продолжительность. 0 короткий 1 длинный
    
    
    sendNotification(table) -- Дает команду андроиду показать push нотификацию, функция получает таблицу с параметрами
    К примеру:
    local notif = {} -- Создали таблицу
    notif["title"] = "Заголовок" --Обязательный параметр
    notif["text"] = "Текст нотификации" --Обязательный параметр
    --Далее идут опциональные параметры, которые расширят ваши возможности оповещения пользователя:
    notif["blinkTitle"] = "Первичный показывающийся заголовок" -- Показывает этот текст проносящейся строкой
    notif["id"] = "2" --Айди нотификации, можно использовать айди от 2, тк 1 зарезервирован приложением для собственных нужд
    --Айди позволяет создавать независимые друг от друга нотификации, иначе они будут наслаиваться друг на друга.
    --К примеру отослали 3 нотификации с одним айди - они все запишутся поверх, так что пользователь увидит лишь последнюю
    --Айди так же позволяют исправлять/обновлять предыдущую нотификацию с этим же айди, если она не была прочтена пользователем
    notif["vibrate"] = true  -- Включать ли вибрацию при появлении нотификации. Можно не передавать этот параметр 
    notif["sound"] = true -- Включать ли звук при появлении нотификации. Можно не передавать этот параметр
    notif["urgent"] = true -- Короткий аналог vibrate&sound, включает звук и вибрацию при появлении нотификации
    
    Пример использования:
    
    local br = dofile("bridge.lua")
    local KEY = "q1w2e3r4t5"
    local msg, pair
    while true do
       --Это главный цикл вашей программы
       msg, pair = br.receive() --НЕ БЛОКИРУЕТ ПРОГРАММУ
       if msg == nil then --соединение с мостом оборвано или отсутствует
          br.init(KEY) -- вернет true/false, но мы не проверяем, а просто пропускаем ход
       elseif msg == "" then --соединение активно, но сообщения для нас нет
          --ничего не делаем
       else
          --сообщение к нам пришло, принтим
          print(msg)
          local msgArray = br.split(msg, " ") --разделили наше сообщение по знакам пробела.
          if(msgArray[1] == "notify") then --если андроид прислал notify строку
             local notif = {}
             notif["blinkTitle"] = "Мигающий заголовок"
             notif["title"] = "Заголовок"
             notif["text"] = "Текст нотификации"
             notif["id"] = 2
             notif["urgent"] = true
             br.sendNotification(notif)
          elseif(msgArray[1] == "toast") --если андроид прислал toast строку
             br.sendToast("текст всплывающего тоста", 1) -- второй аргумент не обязателен, указывает продолжительность 0 или 1
          else
             br.send("Получено: " .. msg)
          end
       end
       os.sleep(0.5)
    end
    
    

     

    Библиотека на своем уровне обрабатывает следующие сервисные коды, они не видны в возвратных данных receive:
    00 - PING
    01 - PONG
    02 - BRIDGE SHUTDOWN

    03 - INIT OK
     
    10 - FAILED TO TRANSMIT
     
    20 - PAIR FOUND
    21 - PAIR LOST

     


     
    Я переделал буферизированную реализацию сокетов по своему, так что receive() НЕ БЛОКИРУЕТ программу так что можно сказать - она на асинхронных сокетах. Если есть данные - она их считывает, иначе возвращает "" если нет сообщений для юзера, но сообщения для самой библы могут быть, однако они не должны касаться юзера
     
    В примере описано все очень просто.
    Библиотека основана на проходной логике, то есть необходимо иметь цикл, который постоянно крутится, лучше всего для этого подходит главный цикл.
    Где нибудь в конце цикла можно поставить br.receive() который сначала вернет nil - мы не подсоединены к мосту, так что
    if msg == nil then
       br.init("КЛЮЧ")
    Соединит нас с мостом, этот проход цикла можно считать холостым. На следующем проходе цикла, msg будет иметь скорее всего или "" пустой стринг или какое нибудь сообщение, которое можно обработать в вашей проге. Второй аргумент ретурна - это переменная со значениями true/false - Она показывает подключен ли андроид к ОС через мост. При значении false не советую кидать сообщения через мост, это может спровоцировать невидимый спам
     
     
     
    PS:
    Если отсылать сообщения при помощи send при том, что receive вернула false вторым аргументом - мост будет отвечать сервисным сообщением 10, которое обрабатывается на уровне библиотеки и невидимо для вас. Таким образом вы нечаянно можете спровоцировать спам сообщениями, которые не дойдут до мобильного приложения, которое фактически не подключено к вам по ключу

     

     

    Обновление 1:

    Оптимизирована буферизация и обработка команд, уменьшена возможная задержка между обработкой строк пользователя

    • Нравится 6

  10. Как вы думаете, такие старожилы проекта как я и @Asummonster достойны крутого почтового ящика? Мне бы не плохо получить таковой, а то хожу как дурак с гугловским ящиком. :) Кстати, скоро увидите мой новый проект.

    leshainc@computercraft.ru Зарегистрирован, первичный пароль выслал в ЛС

    Я бы хотел получить. Я достоен почтового ящика на моём любимом форуме? :)

    assumonster@computercraft.ru Зарегистрирован, первичный пароль отправил в ЛС

    • Нравится 3

  11. В Банке на 2 этажа ниже, под менялой Байтом, поставили такое вот табло.

    Оно обогатит тех, кто знает, как использовать QR B-)

    Код меняется каждые 20-24 часов, на скрине виден 25-й код, следующим будет 24-й

     

     

    oUQoZvQ.png

    • Нравится 8

  12. Продолжаю работать над системой, добавил возможность кидать Тосты и Push нотификации, со звуком. Все это можно делать из ОС просто скинув определенную команду с аргументами

     

    Работаю над возможностью строить свое GUI через ОС. Разработчик программы на ОС сможет самостоятельно строить GUI интерфейс на любом андроид устройстве.GUI будет работать как макросы

    • Нравится 2
×
×
  • Создать...