Эту процедуру нужно вызывать по таймеру. Чем чаще будет вызываться, тем быстрее будет передаваться.
Можно пример?
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Эту процедуру нужно вызывать по таймеру. Чем чаще будет вызываться, тем быстрее будет передаваться.
Можно пример?
Можно пример?
Я ведь написал процедуру Timer_10().
Осталось прикрутить ее к имеющемуся таймеру.
То-есть я не совсем понимаю что означают значения в скобках:
SetTimer_(WindowID(0),4,10, @Timer1())
не совсем понимаю что означают значения в скобках
Тут описание функции. http://www.vsokovikov.narod.ru/New_MSDN … ttimer.htm
WindowID(0) - это к какому окну привязан таймер.
4 - идентификатор таймера. Он должен быть уникален для заданного окна, т. е. у одного и того же окна, может быть только один таймер с таким идентификатором.
10 - время в миллисекундах через которое периодически будет вызываться процедура.
@Timer1() - указатель на процедуру, вызываемую по таймеру.
Спасибо.
Что-то у меня не получается добавить процедуру Timer_10().
Подправил код.
Теперь он компилируется. http://rghost.ru/35985719
А как именно нужно подключать процедуру, хз, ведь там не только данные из файла будут выводится в USB, но и много чего другого.
Спасибо.
Как-то странно выводится вот этот файл
100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111 100000000000000000 010000000000000000 001000000000000000 000100000000000000 000010000000000000 000001000000000000 000000100000000000 000000010000000000 000000001000000000 000000000100000000 000000000010000000 000000000001000000 000000000000100000 000000000000010000 000000000000001000 000000000000000100 000000000000000010 000000000000000001 000000000000000000 100110011111000010 010101010101010101 101010101010101010 001100110011001100 000000000000000000 100000000000000000 110000000000000000 111000000000000000 111100000000000000 111110000000000000 111111000000000000 111111100000000000 111111110000000000 111111111000000000 111111111100000000 111111111110000000 111111111111000000 111111111111100000 111111111111110000 111111111111111000 111111111111111100 111111111111111110 111111111111111111
Вот видео.
Вызываю так:
Case 82 File$ = OpenFileRequester(open, "", Maska , 0) If File$ Put=File$ ReadFile_BinString(File$, DataFile()) Timer_10() SetTimer_(WindowID(0),4,100, @Timer_10()) EndIf
Что-то не могу разобратся, как вывести "светодиоды" на форму. За это отвечает процедура LedOnOff при выборе EFFECT_ZMU. Есть какие-нибудь идеи?
Отредактировано max (19.01.2012 17:32:14)
Бегло посмотрел исходник и там вроде кроме самих данных, передаются данные об яркости и скорости.
Уточни у Василия протокол обмена данными.
Что-то не могу разобратся, как вывести "светодиоды" на форму. За это отвечает процедура LedOnOff
Там написано:
Procedure LedOnOff(Nled, On) ;Процедура включения/выключения светодиодов
; Nled- номер светодиода. Если =0 -все светодиоды
; On=0 - выключить, On>0 - включить
Нужно данные разобрать на отдельные биты и в зависимости от состояния бит (0 или 1), погасить или зажечь светодиод в окне.
Проще чего это сделать в цикле с использованием операции "Логическое И" и сдвигов.
Добавь в процедуру Timer_10(), после имеющегося там цикла, этот код:
Info=DataFile() For i=1 To 18 If Info&1 LedOnOff(i, 1) Else LedOnOff(i, 0) EndIf Info>>1 Next i
Спасибо. Сейчас с Василием спишусь.
Вот что Василий ответил:
Найди в коде следующий фрагмент:
;Вывод данных на светодиоды в USB HID устройство
Shared OutBytes() : nt.c=0
OutBytes(1) = OUT_C
SendDevice()Shared OutBytes() : nt.c=0
OutBytes(1) = OUT_B
SendDevice()Shared OutBytes() : nt.c=0
OutBytes(1) = OUT_D
SendDevice();Вывод данных о начальной яркости и скорости шага её изменения
; Передавая доп коды по USB можно менять скорость и начальную яркость:
; 0b1100xxxx - установить начальную яркость (0b000xxxx/16)
; скорость (шаг) меняется от 1 (85 микросек) до 255 (21 милисек)
; 0b1101xxxx - младший нибл скорости (&0x0f)
; 0b1110xxxx - старший нибл скорости (&0xf0)If flag_bright = 1
;начальная яркость
Shared OutBytes() : nt.c=0
OutBytes(1) = 192 + GetGadgetState (66)
SendDevice();Debug GetGadgetState (67)
;Debug GetGadgetState (67) & $F
;Debug GetGadgetState (67) >> 4
sn=GetGadgetState (67) >> 4
mn=GetGadgetState (67) & $F
;Debug sn * 16 + mn;младший нибл скорости
Shared OutBytes() : nt.c=0
OutBytes(1) = 208 + mn
SendDevice();старший нибл скорости
Shared OutBytes() : nt.c=0
OutBytes(1) = 224 + sn
SendDevice()Сначала выводим 3 байта с информацией о включенных/выключенных
светодиодах - OUT_C, OUT_B, OUT_D. В каждом байте используется по 6
бит. Итого: 3х6=18
Далее обязательно начальную яркость, младший и старший нибл скорости.
Ещё 3 байта. Они высчитываются программно из положений соответствующих
регуляторов.Я бы в Procedure UpdateSpectrum(это поток!) добавил ещё одно условие -
If EFFECT_SDU=6 (6 добавить в комбобокс выбора эффекта, например "БО
из файла")
и в нём поочерёдно из полученных данных из текстового файла формировал
значения 1 и 0 для каналов.
For j=1 To 18
LedOnOff(j, 0 или 1)
Next
Это для включения индикаторов на форме и подготовке данных для USB.
Ведь они потом ещё и переопределяются в зависимости от выбранных
выходов(правая всплывающая панель). Потом добавил бы ещё один
регулятор, в котором были бы значения скорости для внешних эффектов.
Пока есть звук, работает ЦМУ. Как звук меньше порога шума - работают
эффекты (If Z(18)>=porog_noice). Вот там и нужно дополнительную
задержку (значение с регулятора скорости) для внешних эффектов. Если
хочешь в отдельном таймере, тогда останавливай поток, чтобы не
пересекались. И выноси в отдельную процедуру всё, что находится в
вышеуказанной процедуре, начиная с
;Переназначение выходов для контроллера USB и до конца.
А затем эту процедуру вызывай в потоке и своём таймерах после
формирования данных LedOnOffГде то так примерно.
Начал делать, что советовал Василий, но прога вылетает на 1035 строке.
прога вылетает на 1035 строке.
Остальной код в процедуре Timer_10() ведь не просто так написан!
Программа вылетает из-за того, что список пуст и из него производится попытка чтения.
Прочитай про работу со связанными списками.
http://pure-basic.narod.ru/docs/books/s … s_List.htm
http://pure-basic.narod.ru/docs/array_struct_list.html
Понял, спасибо.
А меня опередили. Сделано просто и интересно. Но (куда без этого, сколько людей, столько мнений) хочется добавить скорость эффекта, выбор языка без перегрузки(это я уже сделал), добавление/удаление автозагрузки(тоже есть), а в новой программе помимо эффекта пишется язык и названия эффекта. Так же в файле эффектов хранятся статические цвета.
Посему у меня есть несколько вопросов:
- как избавится от языка и названия эффекта в файле эффектов(для выбора языка без перегрузки)
- как добавить скорость эффекта
- как сделать, чтобы при нажатии на кнопку "Открыть файл" пользователь выбирает один из нескольких файлов эффектов с расширением sdu.
За меня писать не прошу, прошу подсказать, что для этого надо сделать.
Вот что я сделал, прада почему-то "Гц" не меняются на "Hz". В чем проблема пока не понял.
Заранее всем спасибо.
Отредактировано max (21.01.2012 23:42:42)
Ну что тут можно ответить? Нужно искать места программы, отвечающие за требуемые функции и изменять их.
Но для начала нужно проанализировать код, а его не мало, почти 2000 строк.
За добавление эффектов отвечает процедура Read_effect и строки:
If (Z(18)<porog_noice Or EFFECT_ZMU=0) And cnt=0 ; SDU If ListIndex(sduch())=ListSize(sduch())-1 FirstElement(sduch()) EndIf ledstate.s=sduch() NextElement(sduch()) For j=1 To 18 If Mid(ledstate, j, 1)="1" ;Debug j LedOnOff(j,1) Else LedOnOff(j,0) EndIf Next EndIf
На счет скорости Василий написал:
Это нетрудно сделать - когда режим ЦМУ, то одна фиксированная задержка, а когда БО - то значения с регулятора. 50мс - минимум!
На счет загрузки файло надо в процедуре Read_effect изменить If ReadFile(#FILE_SDU,"effect.sdu") на код, который бы вставлял вместо effect имя конкретного файла. Попробую из моджета "выдрать".
На счет загрузки файло надо в процедуре Read_effect изменить If ReadFile(#FILE_SDU,"effect.sdu") на код, который бы вставлял вместо effect имя конкретного файла. Попробую из моджета "выдрать".
Тогда нужно во втором аргументе ReadFile(), в место "effect.sdu" использовать строковую переменную, в которой будет хранится имя файла.
Как-то так?
File$ = OpenFileRequester(open, "", Maska , 0) If File$ Put=File$ Text=ReadFile(#FILE_SDU,File$) EndIf
Я тут еще подумал над словами Василия:
когда режим ЦМУ, то одна фиксированная задержка, а когда БО - то значения с регулятора. 50мс - минимум!
У нас и рисование спектра, и отправка в USB обрабатывается в процедуре UpdateSpectrum, а в ее конце стоит задержка Delay(50).
Определение, что сейчас должны работат эффекты СДУ, происходит так:
If (Z(18)<porog_noice Or EFFECT_ZMU=0) And cnt=0 бла-бла EndIf
Получается, что нам надо сделать так:
If (Z(18)<porog_noice Or EFFECT_ZMU=0) And cnt=0 Delay(вот здесь значение с регулятора) Else Delay(50) EndIf
Думаю 5 шагов хватит.
Отредактировано max (22.01.2012 13:53:39)
Как-то так?
Ну примерно.
Text=ReadFile(#FILE_SDU,File$)
Выскакивает ошибка:
Строка 2208: Нельзя присваивать числовое значение строковой переменной.
Еще возникла проблема со слиянием версий:
компилирую, все работает, как только хочу сменить эффект, выскакивает ошибка:
ledstate.s=sduch()
текущий элемент отсутствует в структуре. Думую это связано с тем, что перевод загружается по другому.
Как от этого избавится?
Вот код.
Отредактировано max (22.01.2012 18:00:41)
Строка 2208: Нельзя присваивать числовое значение строковой переменной.
Text, это строковая переменная?
Разве функция ReadFile() возвращает текст из файла? Она всего лишь открывает файл для чтения.
как только хочу сменить эффект, выскакивает ошибка
Потому что выполняется условие в 887 строке.
If (Z(18)<porog_noice Or EFFECT_ZMU=0) And cnt=0
Отладчик показал что в переменной porog_noice число 0.1, в 18 элементе массива Z, число 0, в EFFECT_ZMU число 3, в переменой cnt число 0.
Условия выполняются.
Нужно искать причину именно в этом условии.
Она всего лишь открывает файл для чтения.
Значит туда надо поместить название файла? А как тогда его выделить из абсолютного пути к файлу?
Я написал разработчику, чтобы он рассказал, как все у него реализовано.
Значит туда надо поместить название файла?
Я писал про переменную Text, а не File$.
А как тогда его выделить из абсолютного пути к файлу?
Ну к примеру воспользоваться функцией GetFilePart()
Все это можно найти намного быстрее в справке чем ждать ответа на форуме.
Все это можно найти намного быстрее в справке чем ждать ответа на форуме.
Согласен. Но я не только жду ответ, но и сам ищу, и ищу баги. Вот один из них:
"Гц" не меняются на "Hz". В чем проблема пока не понял. Перебрал все, что пришло в голову, не помогло. Есть какие-нибудь идеи?
Код. Программа уже имеет загружать файл эффекта и регулировать скорость.
"Гц" не меняются на "Hz"
Это в всплывающих подсказках регуляторов что ли? Нужно было уточнить где, а то я минут десять вглядывался в окно ища Гц или Hz.
Добавь в конец процедуры LoadText() эти строки:
GadgetToolTip(1, "13"+herz) GadgetToolTip(2, "16"+herz) GadgetToolTip(3, "24"+herz) GadgetToolTip(4, "35"+herz) GadgetToolTip(5, "53"+herz) GadgetToolTip(6, "79"+herz) GadgetToolTip(7, "118"+herz) GadgetToolTip(8, "178"+herz) GadgetToolTip(9, "267"+herz) GadgetToolTip(10, "400"+herz) GadgetToolTip(11, "600"+herz) GadgetToolTip(12, "900"+herz) GadgetToolTip(13, "1350"+herz) GadgetToolTip(14, "2024"+herz) GadgetToolTip(15, "3036"+herz) GadgetToolTip(16, "4554"+herz) GadgetToolTip(17, "6830"+herz) GadgetToolTip(18, "10250"+herz)
Спасибо, Петр.
До этого не дошел.
Возможно ли с помощью процедуры LoadText() сделать автоматическую загрузку языка в список, то есть создали файл языка в папке с программой, а он автоматически загрузился в список выбора языка. Сейчас только русский и английский. На ум приходит следующее: можно добавить названия языков в список, а при выборе не существующего загружать язык по умолчанию(русский). Есть еще какие-нибудь идеи?
Заранее спасибо.
Просканируй папку с программой на наличие файлов с расширением lng (смотри функцию ExamineDirectory() и связанные с ней). И добавляй в выпадающий список имена найденных файлов.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике