DreamShell lua source code - SWAT - 02.09.2005 00:12
Думаю для лучшего изучения DreamShell lua скриптов, можно кидать исходники своих скриптов на форуме, так на примерах будет лучше понять:)
Я вот начал уже обновлять CMD Path, сделал одну новую команду, она может конвертировать файл браузера DK или DP в обычный файл, чтобы можно было его использовать в DS(например скрипты). Так же комнда может сразу запускать скрипты из файлов браузера, перед тем сама сконвертировав его.
Ну вообщем вот сам исходник:
Код:
-- DK/DP VMU files manager v1.6
-- Created by SWAT
-- http://www.dc-swat.net.ru
-- dc-swat@nm.ru
-- Usage: lua bfm.lua -flag infile.lua outfile.lua(if needed)
if argv.n < 2 then
print("Usage: bfm -flag file_in file_out(if needed)")
print("Flags:")
print(" -c -Convert DK or DP VMU file to normal file")
print(" -rl -Run lua script from DK or DP VMU file")
print(" -rd -Run dscript from DK or DP VMU file")
return
end
function dpf_convert(filein, fileout)
local buff
local fin = assert(io.open(filein,"r"))
fin:seek(set, 704)
local type = fin:read(5)
if type == "From:" then
fin:seek(cur, 101)
buff = fin:read("*a")
end
if type ~= "From:" then
fin:seek(cur, -5)
buff = fin:read("*a")
end
io.close(fin)
local fout = assert(io.open(fileout,"w"))
fout:write(buff)
io.close(fout)
end
-- DS.makeabspath(fnin, argv[2], 256);
fnin = argv[2]
if argv[1] == "-c" then
-- DS.makeabspath(fnout, argv[3], 256);
fnout = argv[3]
dpf_convert(fnin, fnout)
return
end
if argv[1] == "-rl" then
dpf_convert(argv[2], "/ram/bf_temp_file___.lua")
DS.ds_exec_one("lua /ram/bf_temp_file___.lua");
DS.ds_exec_one("rm /ram/bf_temp_file___.lua");
return
end
if argv[1] == "-rd" then
dpf_convert(argv[2], "/ram/bf_temp_file___.dsc")
DS.ds_exec_one("dscript /ram/bf_temp_file___.dsc");
DS.ds_exec_one("rm /ram/bf_temp_file___.dsc");
return
end
Причем данный скрипт использует стандартные функции для работы с файлами lua 5... Хоть я интегрировал туда и KOS и стандартные Си функции работы с файлами, думаю нет необходимости писать лишнее если можно это было сделать и со стандартными:)
Да и кстати, прошу заметить коментарии сверху скрипта, в скрипте должен быть хотябы один коментарий в самом верху файла! Когда DreamShell определяет из чего сделана команда(а она может быть dscript, lua и bin) она заглядывает в нутрь файла и определяет что это. Так же в случае и с DScript, у него тоже должен быть комментарий сверху, только он там обозначается символом решетки - #
Надеюсь появятся люди которые будут поддерживать DreamShell все большим числом команд ;)Если что будет не понятно, я обязательно помогу!
И еще, советую использовать редактор lua скриптов для подсветки синтаксиса, так будет полегче:)Есть один хороший, которым я пользуюсь, называется LuaEdit скачать его мона на сайте http://luaedit.luaforge.net/
DreamShell lua source code - SWAT - 05.09.2005 00:42
Скрипт для рипа GD-ROM'ов с помощью модема.
Пока конечно не удобен в использовании из за того что сектора нужно указывать самому :(
Просто я не внедрил в lua пару нужных сидиромных функций, у меня просто не получилось их туда засунуть, если бы они там были бы, то процесс я бы сделал полностью автомотическим, а так придется указывать сектора, думаю можно просто указать весь диск :) скрипт сам рубанет процесс, когда читать будет нечего :)
Да и кстати, нет поддержки GD-ROM с аудио треками...
Я не смог сделать автораспознание, по той же причине, но если уж так надо будет, то просто нужно поменять размер сектора на 2352.
Вообщем вот:
Код:
-- RIP GD-ROM with modem using
-- Created by SWAT
-- http://www.dc-swat.net.ru
-- dc-swat@nm.ru
-- Usage: lua gdrip.lua first_sector num_sec_for_read
function write_data(sbuf, sbyte)
local bw = DS.modem_write_data(sbuf, sbyte);
if bw == 0 then
print("DS_ERROR: 0 bytes written, maybe modem is not connected?")
end
return bw
end
function rip_sec(first, nsec)
local secbyte, rerr, werr, istep, secbuf
secbyte = 2048
rerr = 0
werr = 1
print("\nCerrent Sector | Total MBytes\n")
for istep=0, nsec do
rerr = DS.cdrom_read_sectors(secbuf,first+istep,1)
if rerr ~= 0 then
print("DS_ERROR: GD-ROM read error")
return
end
werr = write_data(secbuf,secbyte)
if werr == 0 then
break
end
if istep == 0 then
print(first+istep, "", secbyte/102400)
end
if istep > 0 then
print(first+istep, "", istep*secbyte/102400)
end
end
end
if argv.n < 2 then
print("Usage: gdrip first_sector num_sec_for_read \n")
print("DS_INF: Do not overlook to connect the modem before the beginning!")
return
end
print("DS_PROCESS: Ripping GD-ROM...")
rip_sec(tonumber(argv[1]), tonumber(argv[2]))
Модемное подключение выбираете сами, сначало подключаетесь с помощью команды modem, а потом рипаете...
Для РС прогу я не писал, может попробую... Я просто незнаю как там с модемом работать :)
Может кто поможет с этим?
Можно попробовать сделать на TCP/IP, просто в рипе сделать клиент а для РС сервер, так я сделать смогу, но вот я не уверен в корректной работе PPP соединения в DreamShell...
DreamShell lua source code - SWAT - 06.09.2005 02:29
Окончательно решился обучению вас скриптам :)
Привожу примеры скриптов с использованием SDL.
Скрипт выполнены в 2 версиях, одна для интерпритатора скриптов для РС, сделанный мной с поддержкой SDL специально для проверки скриптов на РС, он находится в DreamShell Service v5.
Вторая непосредственно для DreamShell.
Скрипт включает в себя функции для загрузки и показа картинок на экране:
DreamShell Service version
Код:
-- DreamShell lua SDL Test 2, Load and display images
-- Created by SWAT
SDL.SDL_BlitSurface = SDL.SDL_UpperBlit;
function ShowIMG(file, screen)
local img_t
img_t = SDL.IMG_Load(file);
if img_t == nil then
print("DS_ERROR: Couldn't load ", file);
return;
end
SDL.SDL_BlitSurface(img_t, NULL, screen, NULL);
SDL.SDL_Flip(screen);
SDL.SDL_FreeSurface(img_t);
end
function ShowIMG_xy(file, screen, x, y)
local img_t, dest
dest = SDL.SDL_Rect_new();
img_t = SDL.IMG_Load(file);
if img_t == nil then
print("DS_ERROR: Couldn't load ", file);
return;
end
dest.x = x
dest.y = y
dest.w = img_t.w
dest.h = img_t.h
SDL.SDL_BlitSurface(img_t, NULL, screen, dest);
SDL.SDL_Flip(screen);
SDL.SDL_FreeSurface(img_t);
end
-- Инициализируем SDL
SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
-- Устанавливаем видеорежим
flags = SDL.bit_or(SDL.SDL_HWSURFACE, SDL.SDL_DOUBLEBUF);
screen = SDL.SDL_SetVideoMode(640,480,16,flags);
-- Показываем картинку
ShowIMG("image.jpg", screen)
-- Ждем 3 секунды
SDL.SDL_Delay(3000);
-- Показываем картинку с указанием координат
ShowIMG_xy("image.jpg", screen, 100, 50)
-- Ждем 3 секунды
SDL.SDL_Delay(3000);
DreamShell version
Код:
-- DreamShell lua SDL Test 2, Load and display images
-- Created by SWAT
SDL.SDL_BlitSurface = SDL.SDL_UpperBlit;
function ShowIMG(file, screen)
local img_t
img_t = SDL.IMG_Load(file);
if img_t == nil then
print("DS_ERROR: Couldn't load ", file);
return;
end
SDL.SDL_BlitSurface(img_t, NULL, screen, NULL);
SDL.SDL_Flip(screen);
SDL.SDL_FreeSurface(img_t);
end
function ShowIMG_xy(file, screen, x, y)
local img_t, dest
dest = SDL.SDL_Rect_new();
img_t = SDL.IMG_Load(file);
if img_t == nil then
print("DS_ERROR: Couldn't load ", file);
return;
end
dest.x = x
dest.y = y
dest.w = img_t.w
dest.h = img_t.h
SDL.SDL_BlitSurface(img_t, NULL, screen, dest);
SDL.SDL_Flip(screen);
SDL.SDL_FreeSurface(img_t);
end
-- Закрываем графику DreamShell
DS.ds_draw_shutdown();
-- Показываем картинку
ShowIMG("/rd/image/logos/DSXT1.jpg", DS.screen)
-- Ждем 3 секунды
SDL.SDL_Delay(3000);
-- Показываем картинку с указанием координат
ShowIMG_xy("/rd/image/logos/DSXT1.jpg", DS.screen, 100, 50)
-- Ждем 3 секунды
SDL.SDL_Delay(3000);
-- Инициализируем назад графику DreamShell
DS.ds_draw_init();
DreamShell lua source code - SWAT - 06.09.2005 23:59
В связи с вынужденным обновлением DS, я решил воспользоваться возможностью и всетаки впихнуть нужные функции для CD-ROM.
И написал более автоматизированный скрипт по рипу GD-ROM'ов
Теперь не нужно указывать сектора, скрипт все треки сам рипанет и рипанет как надо :)
Работает он естественно только в v2.3.1
Код:
-- RIP GD-ROM with modem using v1.5
-- Created by SWAT
-- http://www.dc-swat.net.ru
-- dc-swat@nm.ru
-- Usage: lua gdrip.lua
function write_data(sbuf, sbyte)
return DS.modem_write_data(sbuf, sbyte);
end
function rip_sec(trak_num, first, nsec, type)
local secbyte, rerr, werr, istep, secbuf
if type == 4 then
secbyte = 2048
end
if type ~= 4 then
secbyte = 2352
end
rerr = 0
werr = 1
print("\nCerrent Sector | Total MBytes| Track number\n")
for istep=0, nsec do
rerr = DS.cdrom_read_sectors(secbuf,first+istep,1)
if rerr ~= 0 then
print("DS_ERROR: GD-ROM read error")
return
end
werr = write_data(secbuf, secbyte)
if werr == 0 then
print("DS_ERROR: 0 bytes written, maybe modem not connected?")
break
end
if istep == 0 then
print(first+istep, "", secbyte/102400, "", trak_num)
end
if istep > 0 then
print(first+istep, "", istep*secbyte/102400, "", trak_num)
end
end
end
print("DS_PROCESS: Ripping GD-ROM...")
local start, s_end, s_size, type, tn
toc = DS.CDROM_TOC_new();
for session=0, 1 do
local ret = DS.cdrom_read_toc(toc, session);
if ret > 0 then
print("DS_ERROR: Toc read error")
return
end
local first = DS.TOC_TRACK_(toc.first);
local last = DS.TOC_TRACK_(toc.last);
print("DS_INF: Session ", session+1)
for tn=first, last do
type = DS.TOC_CTRL_(toc.entry[tn-1]);
start = DS.TOC_LBA_(toc.entry[tn-1]);
if tn == last then
s_end = DS.TOC_LBA_(toc.dunno);
end
if tn ~= last then
s_end = DS.TOC_LBA_(toc.entry[tn]);
end
s_size = s_end - start
rip_sec(tn, start, s_size, type)
end
end
print("DS_OK: End ripping.")
DreamShell lua source code - zaero - 01.10.2005 18:48
Вот калькулятор:
Код:
-- lua calc by zaero
-- zaero@list.ru
if argv.n < 1 then
print("\n\nLua calc v.0.1 by zaero")
print("Usage: calc -flag(if needed) arg1 operator arg2")
print("Flags:")
print(" -d -date and clock")
print(" -o -operations")
print(" -v -print version")
print(" -h -help")
print("\n")
print("Examples: calc 2 / 2")
print("\t calc 2 + 2")
return
end
if argv[1] == "-v" then
print("Lua calc 0.1 for DreamshellXT")
return
end
if argv[1] == "-o" then
print("This version supports such operations: +, -, *, /")
return
end
if argv[1] == "-h" then
print("This flag is not supported")
return
end
if argv[1] == "-d" then
print(os.date())
return
end
if argv[1] then
if argv[2] then
if argv[2] == '+' then
print(argv[1]+argv[3])
end
if argv[2] == '-' then
print(argv[1]-argv[3])
end
if argv[2]== '*' then
print(argv[1]*argv[3])
end
if argv[2]== '/' then
print(argv[1]/argv[3])
end
end
return
end
DreamShell lua source code - SWAT - 02.10.2005 20:18
Вот пример использования функций файловой системы KOS в DS lua скриптах:
Скрипт считает количество файлов в директории и выдает их имена.
Код:
-- KOS Filesystem in lua test - Reading dir's
-- Created by SWAT
-- http://www.dc-swat.net.ru
-- dc-swat@nm.ru
local ent
function read_dir(hnd)
ent = DS.fs_readdir(hnd)
return ent
end
function find_files_count(dirname)
local flags = SDL.bit_or(DS.O_RDONLY, DS.O_DIR);
local fcount = 0
hnd = DS.fs_open(dirname, flags);
if hnd == -1 then return 0 end
while read_dir(hnd) do
if ent.name ~= ".." then
-- Use if needed print list files
print(ent.name)
fcount = fcount + 1
end
end
DS.fs_close(hnd);
return fcount
end
-- Example using
local cn = find_files_count("/cmd")
print(cn)
DreamShell lua source code - SWAT - 02.10.2005 20:48
Еще один пример работы с файлами в DS lua с использованием KOS filesystem.
Скрипт считывает все данные из одного файла и записывает их в другой:
Код:
-- KOS Filesystem in lua test - Reading and writing primitive
-- Created by SWAT
-- http://www.dc-swat.net.ru
-- dc-swat@nm.ru
local buff
-- Открываем файл
local src = DS.fs_open("/rd/doc/about.txt", DS.O_RDONLY);
-- Проверяем, открылся ли файл?
if src < 0 then
print("DS_ERROR: Error opening ", srcfn);
return
end
-- Тоже самое...
local dest = DS.fs_open("/ram/about.txt", DS.O_WRONLY);
if dest < 0 then
print("DS_ERROR: Error opening ", destfn);
DS.fs_close(src);
return;
end
-- Узнаем размер файла src
local sizef = DS.fs_total(src);
-- Считываем все данные из файла src
DS.fs_read(src, buff, sizef);
-- Записываем все прочтенные данные из файда src в файл dst
DS.fs_write(dest, buff, sizef);
-- Закрываем файлы
DS.fs_close(src);
DS.fs_close(dest);
DreamShell lua source code - alex - 12.11.2005 22:18
извиняюсь что не совсем в тему:)
на днях наткнулся на сайт
и у меня возник вопрос
а мона ли такое на dreamshell lua сделать:)
DreamShell lua source code - zaero - 12.11.2005 22:38
Впринципе можно такое сделать на луа и SDL.
Только часы не получется. Dreamshell не умеет щитать время. =(
DreamShell lua source code - SWAT - 12.11.2005 22:46
Можно взять основу, но есть некоторые функции которые интегрированы туда автором этого плеера, так же как и я делал в DS, так что его функции не полуится использовать в DS, а основу пожалуйста...
DreamShell lua source code - zaero - 20.11.2005 22:56
Сват выручай нужны примеры работы с SDL
DreamShell lua source code - SWAT - 21.11.2005 18:31
Что именно? Мне нужно знать к чему клонить то хоть...
DreamShell lua source code - zaero - 21.11.2005 18:37
Любое...
Ну например надо вывести прямую
DreamShell lua source code - SWAT - 21.11.2005 18:43
Я попробую помочь...
DreamShell lua source code - zaero - 21.11.2005 22:05
Вот блокнот. Теперь при нажатии ентер каретка не будет возвращена и вы сможете писать дальше. Надеюсь хоть теперь кто-то начнет писать приложения, благо теперь это можно делать прямо в дримшелл.
Кратко о notepad v0.3full:
1)Для работы требует клавиатуру
2)Теперь при нажатии на ентер вы можете писать дальше
3)Сохраняет при нажатии на "~"(консоль, тильда)
Код:
-- Lua notepad v 0.3full by zaero
-- Большое спасибо Swat'y за помощь и поддержку
-- This is notepad.
-- http://bbrclan.dc-swat.net.ru/dreamshell/
-- This is filter ASCII => in char.
function convert_ascii(num)
-- Special symbol and digital
if num == 96 then return "" end
if num == 61 then return "=" end
if num == 59 then return ";" end
if num == 126 then return "~" end
if num == 32 then return " " end
if num == 48 then return "0" end
if num == 49 then return "1" end
if num == 50 then return "2" end
if num == 51 then return "3" end
if num == 52 then return "4" end
if num == 53 then return "5" end
if num == 54 then return "6" end
if num == 55 then return "7" end
if num == 56 then return "8" end
if num == 57 then return "9" end
if num == 33 then return "!" end
if num == 64 then return "@" end
if num == 35 then return "#" end
if num == 36 then return "$" end
if num == 37 then return "%" end
if num == 94 then return "^" end
if num == 38 then return "&" end
if num == 42 then return "*" end
if num == 40 then return "(" end
if num == 41 then return ")" end
if num == 45 then return "-" end
if num == 95 then return "_" end
if num == 43 then return "+" end
if num == 124 then return "|" end
if num == 91 then return "[" end
if num == 93 then return "]" end
if num == 123 then return "{" end
if num == 125 then return "}" end
if num == 46 then return "." end
if num == 44 then return "," end
if num == 58 then return ":" end
if num == 39 then return "'" end
if num == 34 then return '"' end
if num == 60 then return "<" end
if num == 62 then return ">" end
if num == 47 then return "/" end
if num == 63 then return "?" end
if num == 10 then return "\n" end
-- Big char
if num == 65 then return "A" end
if num == 66 then return "B" end
if num == 67 then return "C" end
if num == 68 then return "D" end
if num == 69 then return "E" end
if num == 70 then return "F" end
if num == 71 then return "G" end
if num == 72 then return "H" end
if num == 73 then return "I" end
if num == 74 then return "J" end
if num == 75 then return "K" end
if num == 76 then return "L" end
if num == 77 then return "M" end
if num == 78 then return "N" end
if num == 79 then return "O" end
if num == 80 then return "P" end
if num == 81 then return "Q" end
if num == 82 then return "R" end
if num == 83 then return "S" end
if num == 84 then return "T" end
if num == 85 then return "U" end
if num == 86 then return "V" end
if num == 87 then return "W" end
if num == 88 then return "X" end
if num == 89 then return "Y" end
if num == 90 then return "Z" end
-- Little char
if num == 97 then return "a" end
if num == 98 then return "b" end
if num == 99 then return "c" end
if num == 100 then return "d" end
if num == 101 then return "e" end
if num == 102 then return "f" end
if num == 103 then return "g" end
if num == 104 then return "h" end
if num == 105 then return "i" end
if num == 106 then return "j" end
if num == 107 then return "k" end
if num == 108 then return "l" end
if num == 109 then return "m" end
if num == 110 then return "n" end
if num == 111 then return "o" end
if num == 112 then return "p" end
if num == 113 then return "q" end
if num == 114 then return "r" end
if num == 115 then return "s" end
if num == 116 then return "t" end
if num == 117 then return "u" end
if num == 118 then return "v" end
if num == 119 then return "w" end
if num == 110 then return "x" end
if num == 121 then return "y" end
if num == 122 then return "z" end
end
function save_data(filename, data, size)
local i
local buff = {}
fout_write = assert(io.open(filename,"w"))
for i = 0, size do
buff[i] = convert_ascii(data[i])
fout_write:write(buff[i])
end
io.close(fout_write)
end
local ibuff = {}
local bc = 0
local exit = 1
-- open input outpat streem. This need to buffer.
while exit do
ibuff[bc] = DS.getchar()
if ibuff[bc] == 96 then
save_data("/ram/note.txt", ibuff, bc)
print("Saved in /ram/note.txt\n")
break end
bc = bc+1
end
DreamShell lua source code - SWAT - 22.11.2005 15:28
Ты проверял его в самой DS? В DSS то работает DS.getchar(), а вот в DS я не уверен...
И еще, размер буфера в твоем случае можеш делать какой хочеш, так как буфер ввода в DS тут тебе не помеха совсем, ведь буфер у тебя свой...
А вообще молодец!!!
DreamShell lua source code - zaero - 22.11.2005 20:14
Спасибо!=)
В дримшелл еще не проверял. Т.к не было времени подключать дрим к нету и качать скрипт.
DreamShell lua source code - SWAT - 22.11.2005 22:11
Давно пора тебе собрать Coders Cable:)
DreamShell lua source code - zaero - 22.11.2005 22:19
Надо. Были б руки прямые сделал бы =)
А если серьезно, то надо уже делать.
DreamShell lua source code - SWAT - 23.11.2005 20:09
Вот обещаный пример как нарисовать примитивы в DS lua.
Можно попробовать их как в DS так и в DSS, что для этого нужно, я написал в коментариях.
Код:
-- DreamShell lua SDL Test 3, Draw func from SDL_prime
-- Created by SWAT
SDL.SDL_BlitSurface = SDL.SDL_UpperBlit;
-- Инициализируем SDL(нужно сделать только если пробуем в DSS)
-- SDL.SDL_Init(SDL.SDL_INIT_VIDEO);
-- Закрываем графику DreamShell
-- (Если в DSS пробуем, то удолите эту функцию или поместите в коментарий)
DS.ds_draw_shutdown();
-- Устанавливаем видеорежим
flags = SDL.bit_or(SDL.SDL_HWSURFACE, SDL.SDL_DOUBLEBUF);
screen = SDL.SDL_SetVideoMode(640,480,16,flags);
-- Сделаем функцию для рисовки квадрата из функций для рисовки линий.
function DrawBox(scr, x, y, width, height, clr, alpha, flags)
SDL.SDL_drawLine_TG(scr, x, y, x + width, y, clr, alpha, flags);
SDL.SDL_drawLine_TG(scr, x, y, x, y+height, clr, alpha, flags);
SDL.SDL_drawLine_TG(scr, x+width, y, x + width, y+height, clr, alpha, flags);
SDL.SDL_drawLine_TG(scr, x, y+height, x + width, y + height, clr, alpha, flags);
end
-- Что за параметры функциям я задавал,
-- можно посмотреть в списке внедренных в DS lua функций SDL(конкретно это SDL_prime)
-- Рисуем линию
SDL.SDL_drawLine_TG(screen, 200, 200, 50, 50, 255, 0, SDL.SDL_TG_ANTIALIAS);
-- Круг
SDL.SDL_drawCircle_TG(screen, 300, 300, 20, 255, 0, SDL.SDL_TG_ANTIALIAS);
-- Треугольник
SDL.SDL_drawTriangle_TG(screen, 400, 400, 350, 350, 300, 300, 255, 0, SDL.SDL_TG_ANTIALIAS);
-- Рисуем 1 пиксель
SDL.SDL_putPixel(screen, 320, 240, 255);
-- 1 Пиксель с альфа блендом
SDL.SDL_blendPixel(screen, 310, 240, 255, 0);
-- Квадрат
DrawBox(screen, 100, 100, 50, 50, 255, 0, SDL.SDL_TG_ANTIALIAS);
-- Так как видеорежим мы сделали с двойным буфером,
-- мы меняем местами буфер тот который мы сейчас видим,
-- на тот буфер который мы изменили поместив туда разные объекты.
-- Если после этого мы еще что нибудь нарисуем, то потребуется вызвать эту функцию еще раз.
SDL.SDL_Flip(screen);
-- Ждем 30 секунд и наслаждаемся тем что нарисовали :)
SDL.SDL_Delay(30000);
-- Инициализируем назад графику DreamShell
-- (Если в DSS пробуем, то удолите эту функцию или поместите в коментарий)
DS.ds_draw_init();
|