2016-12-01 3 views
1

Я создаю интерфейс с использованием Processing и controlp5 для Arduino с прикрепленными к нему датчиками. Я хочу иметь много датчиков, поэтому я пытаюсь построить интерфейс модульным способом, чтобы я мог просто создать столько панелей управления, как у меня есть датчики, и обновить все панели сразу, когда мое оборудование отправит телеметрический пакет.Использование виджетов controlp5 из класса в обработке

Я сделал что-то подобное и рисует виджеты, но кажется, что мои функции обратного вызова не запускаются - например, когда нажата одна из кнопок в приведенном ниже коде, соответствующая последовательная распечатка не бывает. Кроме того, println(channelOne.currentGain); в основном эскизе всегда печатает 0, независимо от того, что делает ползунок усиления.

Я не очень много Java, поэтому я уверен, что я пропустил что-то основное здесь о том, как объявляются класс и его переменные, любые указатели на то, как правильно установить это, будут высоко оценены!

Вот моя основная программа:

import processing.core.PApplet; 

SensorChannel channelOne; 

void setup() 
{ 
    size(800, 450); 
    smooth(); 

    channelOne = new SensorChannel(this, 30, 30); 
} 

void draw() 
{ 
    background(0); 

    println(channelOne.currentGain); 
    delay(20); 
} 

А вот определение класса для SensorChannel:

import processing.core.PApplet; 
import controlP5.*; 

class SensorChannel { 
    PApplet app; 
    ControlP5 cp5; 

    //Moving line graph 
    Chart chart; 

    //CheckBox buttons; 
    boolean triggered; 
    boolean manualOverride; 
    boolean calibrateBaseline; 
    boolean calibrateGain; 
    boolean calibrateTrigger; 
    boolean selfControl; 

    //Sliders 
    int currentGain; 
    int currentBalance; 
    int currentReading; 
    int currentTrigger; 

    SensorChannel(PApplet papp, int x, int y) 
    { 

    app = papp; 
    cp5 = new ControlP5(papp); 

    println("hello!"); 

    //Line graph 
    chart = cp5.addChart("sensorChart") 
    .setPosition(x+0, y+0) 
    .setSize(306, 220) 
    .setRange(0, 1024) 
    .setView(Chart.LINE) // use Chart.LINE, Chart.PIE, Chart.AREA, Chart.BAR_CENTERED 
    .setStrokeWeight(1.5) 
    .setColorCaptionLabel(color(40)) 
    ; 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(240)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(140)); 

    //Reading (10bits) 
    //Trigger point (10bits) 

    //Balancing digipot setting (1 byte) 
    cp5.addSlider("currentBalance") 
    .setLabel("Balance Pot") 
    .setPosition(x+0,y+284) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 
    //Gain setting (1 byte) 
    cp5.addSlider("currentGain") 
    .setLabel("Gain") 
    .setPosition(x+0,y+263) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Current Sensor Reading (1 byte) 
    cp5.addSlider("currentReading") 
    .setLabel("Sensor Reading") 
    .setPosition(x+0,y+221) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Trigger Point (1 byte) 
    cp5.addSlider("currentTrigger") 
    .setLabel("Trigger Point") 
    .setPosition(x+0,y+242) 
    .setSize(306,20) 
    .setRange(0,255) 
    ; 

    //Misc. Settings Toggles 
    cp5.addToggle("triggered") 
    .setLabel("Trigger") 
    .setPosition(x+0,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("manualOverride") 
    .setLabel("Override") 
    .setPosition(x+51,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateBaseline") 
    .setLabel("C. Baseline") 
    .setPosition(x+102,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateGain") 
    .setLabel("C. Gain") 
    .setPosition(x+153,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("calibrateTrigger") 
    .setLabel("C. Trig") 
    .setPosition(x+204,y+305) 
    .setSize(50,20) 
    ; 

    cp5.addToggle("selfControl") 
    .setLabel("S. Control") 
    .setPosition(x+255,y+305) 
    .setSize(50,20) 
    ; 

    } 

    void triggered(boolean theFlag) 
    { 
    println("Trigger status: " + theFlag); 
    } 

    void manualOverride(boolean theFlag) 
    { 
    println("Manual Override status: " + theFlag); 
    } 

    void calibrateBaseline(boolean theFlag) 
    { 
    println("Calibrate Baseline status: " + theFlag); 
    } 

    void calibrateGain(boolean theFlag) 
    { 
    println("Calibrate Gain status: " + theFlag); 
    } 

    void calibrateTrigger(boolean theFlag) 
    { 
    println("Calibrate Trigger status: " + theFlag); 
    } 

    void selfControl(boolean theFlag) 
    { 
    println("Self Control status: " + theFlag); 
    } 

} 
+0

любая удача с моим решением? –

ответ

0

Есть несколько вещей, которые могут быть улучшены:

  • нет необходимо позвонить по телефону delay(). draw() вызывается около 60 раз в секунду, но вы можете легко (и чисто) управлять с помощью frameRate() (например, framerate(50);)
  • Вы создаете экземпляр cp5 внутри SensorChannel. Возможно, вы можете создать один экземпляр ControlP5 в основном эскизе и передать ссылку на SensorChannel (повторное использование экземпляра для нескольких будущих каналов)

Существует несколько способов использовать значения. Вы должны взглянуть на Примеры> Внесенный Библиотеки> ControlP5> использовать

Один из способов, который должен быть прямо вперед будет использовать plugTo() метод контроллера. Вы передаете объект для подключения контроллера к и до тех пор, как этот объект имеет свойство с тем же именем, что и контроллер будет установить его значение:

import controlP5.*; 

SensorChannel channelOne; 
ControlP5 cp5; 

void setup() 
{ 
    size(800, 450); 
    smooth(); 
    cp5 = new ControlP5(this); 
    channelOne = new SensorChannel(this,cp5, 30, 30); 
} 

void draw() 
{ 
    background(0); 

    text("currentGain:"+channelOne.currentGain,10,15); 
} 

class SensorChannel{ 
    PApplet app; 
    ControlP5 cp5; 

    //Moving line graph 
    Chart chart; 

    //CheckBox buttons; 
    boolean triggered; 
    boolean manualOverride; 
    boolean calibrateBaseline; 
    boolean calibrateGain; 
    boolean calibrateTrigger; 
    boolean selfControl; 

    //Sliders 
    int currentGain; 
    int currentBalance; 
    int currentReading; 
    int currentTrigger; 

    SensorChannel(PApplet papp, ControlP5 cp5,int x, int y) 
    { 

    app = papp; 
    this.cp5 = cp5; 

    println("hello!"); 

    //Line graph 
    chart = cp5.addChart("sensorChart") 
    .setPosition(x+0, y+0) 
    .setSize(306, 220) 
    .setRange(0, 1024) 
    .setView(Chart.LINE) // use Chart.LINE, Chart.PIE, Chart.AREA, Chart.BAR_CENTERED 
    .setStrokeWeight(1.5) 
    .setColorCaptionLabel(color(40)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(240)); 

    chart.addDataSet("sensorReading"); 
    chart.setData("sensorReading", new float[100]); 
    chart.setColors("sensorReading", color(140)); 

    //Reading (10bits) 
    //Trigger point (10bits) 

    //Balancing digipot setting (1 byte) 
    cp5.addSlider("currentBalance") 
    .setLabel("Balance Pot") 
    .setPosition(x+0,y+284) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 
    //Gain setting (1 byte) 
    cp5.addSlider("currentGain") 
    .setLabel("Gain") 
    .setPosition(x+0,y+263) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this); 
    ; 

    //Current Sensor Reading (1 byte) 
    cp5.addSlider("currentReading") 
    .setLabel("Sensor Reading") 
    .setPosition(x+0,y+221) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 

    //Trigger Point (1 byte) 
    cp5.addSlider("currentTrigger") 
    .setLabel("Trigger Point") 
    .setPosition(x+0,y+242) 
    .setSize(306,20) 
    .setRange(0,255) 
    .plugTo(this) 
    ; 

    //Misc. Settings Toggles 
    cp5.addToggle("triggered") 
    .setLabel("Trigger") 
    .setPosition(x+0,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("manualOverride") 
    .setLabel("Override") 
    .setPosition(x+51,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateBaseline") 
    .setLabel("C. Baseline") 
    .setPosition(x+102,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateGain") 
    .setLabel("C. Gain") 
    .setPosition(x+153,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("calibrateTrigger") 
    .setLabel("C. Trig") 
    .setPosition(x+204,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    cp5.addToggle("selfControl") 
    .setLabel("S. Control") 
    .setPosition(x+255,y+305) 
    .setSize(50,20) 
    .plugTo(this) 
    ; 

    } 

} 

Это одно предложение. Не стесняйтесь изучать другие примеры ControlP5 по событиям и значениям контроллера.

Смежные вопросы