PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике


Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике

Сообщений 361 страница 390 из 446

361

max написал(а):

Эту процедуру нужно вызывать по таймеру. Чем чаще будет вызываться, тем быстрее будет передаваться.

Можно пример?

0

362

max написал(а):

Можно пример?

Я ведь написал процедуру Timer_10().
Осталось прикрутить ее к имеющемуся таймеру.

0

363

То-есть я не совсем понимаю что означают значения в скобках:

Код:
SetTimer_(WindowID(0),4,10, @Timer1())

0

364

max написал(а):

не совсем понимаю что означают значения в скобках

Тут описание функции. http://www.vsokovikov.narod.ru/New_MSDN … ttimer.htm
WindowID(0) - это к какому окну привязан таймер.
4 - идентификатор таймера. Он должен быть уникален для заданного окна, т. е. у одного и того же окна, может быть только один таймер с таким идентификатором.
10 - время в миллисекундах через которое периодически будет вызываться процедура.
@Timer1() - указатель на процедуру, вызываемую по таймеру.

0

365

Спасибо.

0

366

Что-то у меня не получается добавить процедуру Timer_10().

0

367

Подправил код.
Теперь он компилируется. http://rghost.ru/35985719

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

0

368

Спасибо.

0

369

Как-то странно выводится вот этот файл

Код:
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)

0

370

Бегло посмотрел исходник и там вроде кроме самих данных, передаются данные об яркости и скорости.
Уточни у Василия протокол обмена данными.

max написал(а):

Что-то не могу разобратся, как вывести "светодиоды" на форму. За это отвечает процедура 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

0

371

Спасибо. Сейчас с Василием спишусь.

0

372

Вот что Василий ответил:

Найди в коде следующий фрагмент:

;Вывод данных на светодиоды в 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

Где то так примерно.

0

373

Начал делать, что советовал Василий, но прога вылетает на 1035 строке.

0

374

max написал(а):

прога вылетает на 1035 строке.

Остальной код в процедуре Timer_10() ведь не просто так написан!
Программа вылетает из-за того, что список пуст и из него производится попытка чтения.
Прочитай про работу со связанными списками.
http://pure-basic.narod.ru/docs/books/s … s_List.htm
http://pure-basic.narod.ru/docs/array_struct_list.html

0

375

Понял, спасибо.

0

376

А меня опередили. :D Сделано просто и интересно. Но (куда без этого, сколько людей, столько мнений) хочется добавить скорость эффекта, выбор языка без перегрузки(это я уже сделал), добавление/удаление автозагрузки(тоже есть), а в новой программе помимо эффекта пишется язык и названия эффекта. Так же в файле эффектов хранятся статические цвета.
Посему у меня есть несколько вопросов:
- как избавится от языка и названия эффекта в файле эффектов(для выбора языка без перегрузки)
- как добавить скорость эффекта
- как сделать, чтобы при нажатии на кнопку "Открыть файл" пользователь выбирает один из нескольких файлов эффектов с расширением sdu.
За меня писать не прошу, прошу подсказать, что для этого надо сделать.
Вот что я сделал, прада почему-то "Гц" не меняются на "Hz". В чем проблема пока не понял.
Заранее всем спасибо.

Отредактировано max (21.01.2012 23:42:42)

0

377

Ну что тут можно ответить? Нужно искать места программы, отвечающие за требуемые функции и изменять их.
Но для начала нужно проанализировать код, а его не мало, почти 2000 строк.

0

378

За добавление эффектов отвечает процедура 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 имя конкретного файла. Попробую из моджета "выдрать".

0

379

max написал(а):

На счет загрузки файло надо в процедуре Read_effect изменить If ReadFile(#FILE_SDU,"effect.sdu") на код, который бы вставлял вместо effect имя конкретного файла. Попробую из моджета "выдрать".

Тогда нужно во втором аргументе ReadFile(), в место "effect.sdu" использовать строковую переменную, в которой будет хранится имя файла.

0

380

Как-то так?

Код:
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)

0

381

max написал(а):

Как-то так?

Ну примерно.

0

382

Код:
Text=ReadFile(#FILE_SDU,File$)

Выскакивает ошибка:
Строка 2208: Нельзя присваивать числовое значение строковой переменной.
Еще возникла проблема со слиянием версий:
компилирую, все работает, как только хочу сменить эффект, выскакивает ошибка:

Код:
ledstate.s=sduch()

текущий элемент отсутствует в структуре. Думую это связано с тем, что перевод загружается по другому.
Как от этого избавится?
Вот код.

Отредактировано max (22.01.2012 18:00:41)

0

383

max написал(а):

Строка 2208: Нельзя присваивать числовое значение строковой переменной.

Text, это строковая переменная?
Разве функция ReadFile() возвращает текст из файла? Она всего лишь открывает файл для чтения.

max написал(а):

как только хочу сменить эффект, выскакивает ошибка

Потому что выполняется условие в 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.
Условия выполняются.
Нужно искать причину именно в этом условии.

0

384

Пётр написал(а):

Она всего лишь открывает файл для чтения.

Значит туда надо поместить название файла? А как тогда его выделить из абсолютного пути к файлу?
Я написал разработчику, чтобы он рассказал, как все у него реализовано.

0

385

max написал(а):

Значит туда надо поместить название файла?

Я писал про переменную Text, а не File$.

max написал(а):

А как тогда его выделить из абсолютного пути к файлу?

Ну к примеру воспользоваться функцией GetFilePart()
Все это можно найти намного быстрее в справке чем ждать ответа на форуме.

0

386

Пётр написал(а):

Все это можно найти намного быстрее в справке чем ждать ответа на форуме.

Согласен. Но я не только жду ответ, но и сам ищу, и ищу баги. Вот один из них:
"Гц" не меняются на "Hz". В чем проблема пока не понял. Перебрал все, что пришло в голову, не помогло. Есть какие-нибудь идеи?
Код. Программа уже имеет загружать файл эффекта и регулировать скорость.

0

387

max написал(а):

"Гц" не меняются на "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)

0

388

Спасибо, Петр.
До этого не дошел.

0

389

Возможно ли с помощью процедуры LoadText() сделать автоматическую загрузку языка в список, то есть создали файл языка в папке с программой, а он автоматически загрузился в список выбора языка. Сейчас только русский и английский. На ум приходит следующее: можно добавить названия языков в список, а при выборе не существующего загружать язык по умолчанию(русский). Есть еще какие-нибудь идеи?
Заранее спасибо.

0

390

Просканируй папку с программой на наличие файлов с расширением lng (смотри функцию ExamineDirectory() и связанные с ней). И добавляй в выпадающий список имена найденных файлов.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике