05.02.2024, 19:19
Moinsen,
das hatte ich mir doch einfacher vorgestellt bin bisher mit meinen ersten Java Programmierversuchen gescheitert.
Was will ich erreichen:
Über 4 Tasten 4 verschieden Playlisten laden. Tasten könnten dann später LW, MW, KW und UKW sein.
1) Erst einmal playlist0.m3u bis playlist3.m3u auf die SD-Karte übertragen.
2) iRadioPlayer.java die Funktion onStartCommand den Aufruf von readPlaylistFromFile um den Parameter 0 erweitert.
3) iRadioPlayer.java die Funktion readPlaylistFromFile erweitert: (int nr) und "/playlist" + nr + ".m3u"
4) iRadioPlayer.java eine neue Funktion eingefügt:
5) gpiodSerialOTG um 4 Kommandos erweitert:
6) dir firmware erteitert:
Die firmware funktioniert zumindest (mit Serial Monitor getestet)
Die playlist0.m3u wird auch geladen.
Nur bei den "Bereichstasten" passiert nichts
Sollte hier jemand eine Lösung haben, dann immer her damit.
Noch lieber wäre mir jemand erklärt mir meine Fehler in den Programmänderungen.
-Joe
das hatte ich mir doch einfacher vorgestellt bin bisher mit meinen ersten Java Programmierversuchen gescheitert.
Was will ich erreichen:
Über 4 Tasten 4 verschieden Playlisten laden. Tasten könnten dann später LW, MW, KW und UKW sein.
1) Erst einmal playlist0.m3u bis playlist3.m3u auf die SD-Karte übertragen.
2) iRadioPlayer.java die Funktion onStartCommand den Aufruf von readPlaylistFromFile um den Parameter 0 erweitert.
Code:
public int onStartCommand(Intent intent, int flags, int startId) {
// Log.i(TAG, "try to read playlist.m3u from folder Download ...");
readPlaylistFromFile(0);
3) iRadioPlayer.java die Funktion readPlaylistFromFile erweitert: (int nr) und "/playlist" + nr + ".m3u"
Code:
void readPlaylistFromFile(int nr) {
Log.i(TAG, "try to read playlist" + nr +".m3u from folder Download ...");
playlist.clear();
if ((playlist != null) && (playlist.isEmpty())) {
FileInputStream is;
BufferedReader reader;
final File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/playlist" + nr + ".m3u");
4) iRadioPlayer.java eine neue Funktion eingefügt:
Code:
public void newPlaylistFromFile(int nr) {
playlist.clear();
readPlaylistFromFile(nr);
gotoProg(0);
}
5) gpiodSerialOTG um 4 Kommandos erweitert:
Code:
if (iRadioPlayerService != null) {
if (dataUTF8.contains("0FB")) {
Log.i(TAG, "command 0FB -> Band 0");
iRadioPlayerService.newPlaylistFromFile(0);
}
}
if (iRadioPlayerService != null) {
if (dataUTF8.contains("1FB")) {
Log.i(TAG, "command 1FB -> Band 1");
iRadioPlayerService.newPlaylistFromFile(1);
}
}
if (iRadioPlayerService != null) {
if (dataUTF8.contains("2FB")) {
Log.i(TAG, "command 2FB -> Band 2");
iRadioPlayerService.newPlaylistFromFile(2);
}
}
if (iRadioPlayerService != null) {
if (dataUTF8.contains("3FB")) {
Log.i(TAG, "command 3FB -> Band 3");
iRadioPlayerService.newPlaylistFromFile(3);
}
}
6) dir firmware erteitert:
Code:
// switches for next & prev channel
#define PIN_TASTER_PROGRAM_NEXT 3
#define PIN_TASTER_PROGRAM_PREV 2
// rotary encoder for volume setting
#define PIN_ENCODER_VOL_CLK 5
#define PIN_ENCODER_VOL_DT 4
// switches for frequency band
#define PIN_TASTER_BAND_0 8
#define PIN_TASTER_BAND_1 9
#define PIN_TASTER_BAND_2 10
#define PIN_TASTER_BAND_3 11
unsigned char flag;
unsigned char Last_RoB_Status;
unsigned char Current_RoB_Status;
static unsigned long last_interrupt_time = 0;
void setup() {
// put your setup code here, to run once:
// switches with interrupt support, rotary in polling mode
pinMode(PIN_TASTER_PROGRAM_NEXT, INPUT_PULLUP);
pinMode(PIN_TASTER_PROGRAM_PREV, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PIN_TASTER_PROGRAM_NEXT), Interrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(PIN_TASTER_PROGRAM_PREV), Interrupt, FALLING);
pinMode(PIN_ENCODER_VOL_CLK, INPUT_PULLUP);
pinMode(PIN_ENCODER_VOL_DT, INPUT_PULLUP);
pinMode(PIN_TASTER_BAND_0, INPUT_PULLUP);
pinMode(PIN_TASTER_BAND_1, INPUT_PULLUP);
pinMode(PIN_TASTER_BAND_2, INPUT_PULLUP);
pinMode(PIN_TASTER_BAND_3, INPUT_PULLUP);
// Enable PCIE2 Bit1 = 1 (Port B)
PCICR |= B00000001;
// Enable PCINT8 bis PCINT11 (Pins D8, D9, D10, D11)
PCMSK0 |= B00001111;
// Send commands via serial to Smartphone
Serial.begin(115200);
}
void rotaryProcessing(void)
{
Last_RoB_Status = digitalRead(PIN_ENCODER_VOL_CLK);
while(!digitalRead(PIN_ENCODER_VOL_DT)){
Current_RoB_Status = digitalRead(PIN_ENCODER_VOL_CLK);
flag = 1;
}
if(flag == 1){
flag = 0;
if((Last_RoB_Status == 0)&&(Current_RoB_Status == 1)){
Serial.println("VUP"); // send iRadioAndroid command for volume up
}
if((Last_RoB_Status == 1)&&(Current_RoB_Status == 0)){
Serial.println("VDW"); // send iRadioAndroid command for volume down
}
}
}
ISR (PCINT0_vect)
{
// Port B Interrupt occured
// Check if this was D8
if (digitalRead(PIN_TASTER_BAND_0) == LOW) {
Serial.println("0FB");
}
if (digitalRead(PIN_TASTER_BAND_1) == LOW) {
Serial.println("1FB");
}
if (digitalRead(PIN_TASTER_BAND_2) == LOW) {
Serial.println("2FB");
}
if (digitalRead(PIN_TASTER_BAND_3) == LOW) {
Serial.println("3FB");
}
}
void Interrupt() {
unsigned long interrupt_time = millis();
// If interrupts come faster than 500ms, assume it's a bounce and ignore
if (interrupt_time - last_interrupt_time > 500)
{
if (digitalRead(PIN_TASTER_PROGRAM_NEXT) == 0)
Serial.println("PNX"); // send iRadioAndroid command for next program
if (digitalRead(PIN_TASTER_PROGRAM_PREV) == 0)
Serial.println("PPR"); // send iRadioAndroid command for prev program
}
last_interrupt_time = interrupt_time;
}
void loop() {
// put your main code here, to run repeatedly:
rotaryProcessing();
delay(10);
}
Die firmware funktioniert zumindest (mit Serial Monitor getestet)
Die playlist0.m3u wird auch geladen.
Nur bei den "Bereichstasten" passiert nichts
Sollte hier jemand eine Lösung haben, dann immer her damit.
Noch lieber wäre mir jemand erklärt mir meine Fehler in den Programmänderungen.
-Joe