Пишу программу работающую с GPIO посредством файловой системы. Сейчас испытываю её на самописном эмуляторе GPIO файлов. Обнаружил что опрос всех 26 файлов занимает минимум 0,04 секунды. Это нормально или слишком много?
Запрашиваю состояние следующим кодом:
Public Sub Main()
' Автомойка
Dim tb, te As Float
Dim Box1 As New BoxType
Dim cGPIO As New ControlGPIO
Dim TestBin As New Boolean[]
Dim a As Integer, m As Integer
LoadConfig ' Загрузка настроек
tb = Timer
cGPIO.ConfGPIO("/home/stas/virtual_gpio/", "/opt/write-string-to-file", 26)
te = Timer
TestBin = cGPIO.GetStatusGPIO()
m = TestBin.Max
For a = 1 To m
If TestBin[a] = True Then Print "GPIO" & LTrim(Str(a)) & " = True"
Next
Print "Время " & Str(Timer - te)
End
На выходе получаю:
GPIO3 = True
Время 0,04341006278992
Ниже код класса.
' Gambas class file ControlGPIO
Public GPIOpath As String ' В конце строки должен обязательно быть слэш
Public PathScriptGPIO As String ' Скрипт для ввода значений в GPIO порт
Public MaxGPIO As Integer ' Сколько всего GPIO
Public DisabledReadGPIO As New Boolean[] ' Включает игнорирование данных GPIO при чтении
Public SubstitutionValueGPIO As New Boolean[] ' При отключенном чтении, возвращает значение из данного массива
Public DisabledWriteGPIO As New Boolean[] ' Включает игнорирование данных GPIO при записи. Воздействует на функцию WriteGPIO
' Данные ограничения и массив подмены не работают при сипользовании функции ReadGPIO напрямую
' Поэтому следует запрашивать данные через GetStatusGPIO с особыми параметрами
Public Function GetStatusGPIO() As Boolean[]
' Функция возвращает двоичный массив содержащий состояние GPIO входов
Dim Result As New Boolean[]
Dim a As Integer, m As Integer
Dim r As Boolean
Dim ResultRealRead As Boolean
Dim t As Integer, i As Integer
Result.Add(False) ' Нулевой элемент массива
'обычное считывание
For a = 1 To MaxGPIO
r = False ' Флаг подмены
If DisabledReadGPIO.Count > 0 Then
' Если есть запреты на реальное чтение
If DisabledReadGPIO.Max <= a Then
' Если входит в зону запрета
If DisabledReadGPIO[a] = True Then
' Запрет на реальное чтение
' Подмена
If SubstitutionValueGPIO.Count > 0 Then
'Есть подмены
If SubstitutionValueGPIO.Max >= a Then
'Подмена определена
r = True ' Совершить подмену
Endif
Endif
Endif
Endif
Endif
If r = True Then
' Подмена
If a > Result.Max Then
Result.Add(SubstitutionValueGPIO[a]) 'Добавление подменного результата
Else
Result[a] = SubstitutionValueGPIO[a] 'Замена образца на подменный результат
Endif
Else
' Реальное чтение
ResultRealRead = ReadGPIO(a)
If a > Result.Max Then
Result.Add(ResultRealRead) 'Добавление прочитанного результата
Else
Result[a] = ResultRealRead 'Замена образца на прочитанный результат
Endif
Endif
Next
Return Result
End
Public Sub ConfGPIO(PathGPIO As String, ScriptWriteGPIO As String, MaxPortsGPIO As Integer)
PathScriptGPIO = ScriptWriteGPIO
MaxGPIO = MaxPortsGPIO
If Len(PathGPIO) > 0 Then
If Mid(PathGPIO, Len(PathGPIO), 1) = "/" Then
GPIOpath = PathGPIO
Else
GPIOpath = PathGPIO & "/" ' Добавляет в конце / слэш если он не передан
Endif
Endif
End
Public Function ReadGPIO(GPIOn As Integer) As Boolean
Dim P As Process
Dim t As String
Dim t1 As String
Dim r As Boolean
Dim s As String
s = GPIOpath & "gpio" & LTrim(Str(GPIOn)) & "/value"
Exec ["cat", s] To t
If Len(t) > 0 Then
t1 = Mid(t, 1, 1)
If t1 = "1" Then r = True
Endif
Return r
End
Public Sub WriteGPIO(GPIOn As Integer, Value As Boolean)
Dim s As String
Dim t As String
s = GPIOpath & "gpio" & LTrim(Str(GPIOn)) & "/value"
If Value = True Then
' Ввод единицы
Exec [PathScriptGPIO, "1", s] To t
Else
' Ввод нуля
Exec [PathScriptGPIO, "0", s] To t
Endif
'Print s
End
Public Sub Execute(IntegerArrayGPIO As Integer[])
' Функция выполняет команды записанные в виде целых чисел.
' Модуль числа определяет номер GPIO, а знак определяет значение.
' <0 False
' >0 True
Dim a As Integer, m As Integer
If IntegerArrayGPIO.Count > 0 Then
'Если в массиве есть элементы
m = IntegerArrayGPIO.Max
For a = 0 To m
If IntegerArrayGPIO[a] > 0 Then
' True
WriteGPIO(Abs(IntegerArrayGPIO[a]), True) ' Функция Abs использована в данной строе для единообразия
Endif
If IntegerArrayGPIO[a] > 0 Then
' False
WriteGPIO(Abs(IntegerArrayGPIO[a]), False)
Endif
' Значение 0 игнорируется
Next
Endif
End
/opt/write-string-to-file
#!/bin/bash
echo "$1" > "$2" 2>/dev/null
exit 0