Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

doriangrey

Plik .csv na podstawie danych w czasie rzeczywistym

Rekomendowane odpowiedzi

Mam działającą aplikację którą chciałbym zmodyfikować. Jest w niej 5 zmiennych, cztery pochodzą z zewnętrznego sensora EEG i przedstawiają poszczególne fale, jedna to stosunek tych fal względem siebie (ratio).

 

Ratio:

 

 public int measureConcentration(double[] means){
       return (int) (means[3] / means[1]) ;

 

Fale (0 - delta, 1 - theta, 2 - alpha i 3 - beta):

 

  private void getEegChannelValues(double[] newData, MuseDataPacket p) {
           newData[0] = p.getEegChannelValue(Eeg.EEG1);
           newData[1] = p.getEegChannelValue(Eeg.EEG2);
           newData[2] = p.getEegChannelValue(Eeg.EEG3);
           newData[3] = p.getEegChannelValue(Eeg.EEG4);

 

Chciałbym utworzyć na podstawie tych pięciu wartości plik csv z danymi zapisywanymi co sekundę, który wyglądałby mniej więcej tak:

 

Timestamp,delta,theta,alpha,beta,ratio
currenttime,xxx,yyyyy,zzzzz,bbbb,rrrrr

 

Jakiego kodu użyć? Jak to zrobić? Z góry dziękuję za pomoc ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

fopen gdzieś na początku programu, potem fwrite, przy kończeniu działania fclose

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ajax (np. jquery, ale może być też czysty z js), i do tego serwer, na który będą zapisywane dane (czyli kłania się php, pyton, itd.).

Może być jeszcze local storage użyte (html5), ale nie jestem pewien na ile jest to zaimplementowane w przeglądarkach (o ile jest).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znalazłem w bliźniaczej apce (android) taki kod, który zapisuje dane z EEG w zależności od ustawień w aplikacji:

 

package com.eeg_project.components.csv;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
import android.support.v4.content.FileProvider;
import android.util.Log;
import android.widget.Toast;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

/**
* Writes EEG data (either raw/filtered EEG or computed FFT) into a csv. Presents a toast when
* recording is started and starts sharing intent for sending data to email when recording is
* completed
*/

public class EEGFileWriter {

   // ---------------------------------------------------------------------------
   // Variables

   private Context context;
   StringBuilder builder;
   int fileNum = 1;
   public FileWriter fileWriter;
   private static boolean isRecording;

   // ---------------------------------------------------------------------------
   // Constructor

   public EEGFileWriter(Context context, String title) {
       this.context = context;
       isRecording = false;
   }

   // ---------------------------------------------------------------------------
   // Internal methods

   public void initFile(String title) {
       builder = new StringBuilder();
       builder.append("Timestamp (ms),");
       makeToast(title);
       isRecording = true;
       if(title.contains("Power")) {
           for(int i=1; i<129; i++) {
               builder.append(i + " hz,");
           }
           builder.append("\n");
       } else if(title.contains("Classifier")) {
           builder.append("Label,");
           for(int i=1; i<=16; i++) {
               builder.append(" Feature " + i + ",");
           }
           builder.append("\n");
       }
       else {
           for(int i=1; i<5; i++) {
               builder.append("Electrode " + i + ",");
           }
           builder.append("\n");
       }
   }

   public void addDataToFile(double[] data) {
       // Append timestamp
       Long tsLong = System.currentTimeMillis();
       builder.append(tsLong.toString() +",");
       for (int j = 0; j < data.length; j++) {
           builder.append(Double.toString(data[j]));
           if (j < data.length - 1) {
               builder.append(",");
           }
       }
       builder.append("\n");
   }

   public void addLineToFile(String line){
       builder.append(line);
       builder.append("\n");
   }

   public void writeFile(String title) {
       try {
           final File dir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
           final File file = new File(dir, title + fileNum + ".csv");
           fileWriter = new java.io.FileWriter(file);
           BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
           bufferedWriter.write(builder.toString());
           bufferedWriter.close();
           sendData(file);
           fileNum ++;
           isRecording = false;
       } catch (IOException e) {}
   }

   public void makeToast(String title) {
       CharSequence toastText = "Recording data in " + title+fileNum+".csv";
       Toast toast = Toast.makeText(context, toastText, Toast.LENGTH_SHORT);
       toast.show();
   }

   public void sendData(File dataCSV) {
       FileProvider fileProvider = new FileProvider();
       Intent sendIntent = new Intent();
       sendIntent.setAction(Intent.ACTION_SEND);
       sendIntent.setType("application/csv");
       sendIntent.putExtra(Intent.EXTRA_STREAM, fileProvider.getUriForFile(this.context, "com.eeg_project.fileprovider", dataCSV));
       context.startActivity(Intent.createChooser(sendIntent, "Export data to..."));
   }

   public boolean isRecording() {
       return isRecording;
   }
}

 

Wygląda na to, że

isRecording

odpowiada za zainicjowanie zapisu danych do pliku csv. Teraz pytanie jak zmodyfikować ten kod aby po wywołaniu tej funkcji zapisywało to co podałem w pierwszym poście?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak w ogóle to wygląda, że ten kod to ty piszesz w Javie a nie Javascriptie :E

Wrzuć kod który już masz.

 

Sprawa jest prosta:

1. Tworzysz globalny stream.

2. Używasz parsera aby przerobić twoje wartości na typ string.

3. Doklejasz do streamu odczytane i sparsowane wartości. (co sekundę)

4. Nadpisujesz zawartość pliku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wrzuciłem wszystko co mam. No tak, racja, jest to java ;) Jak zrobić to co wypunktowałeś?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wrzuciłem wszystko co mam. No tak, racja, jest to java ;) Jak zrobić to co wypunktowałeś?

Po pierwsze to nigdy nic w Javie nie pisałem, po drugie to co wrzuciłeś to apka na androida.

A ty potrzebujesz jak mniemam na PC?

 

Nie bądź tak leniwy, żeby nie dopisać tych kilkunastu linijek kodu :P

Wystarczy trochę pogrzebać w dokumentacji. Przypuszczam, że wszystko czego potrzebujesz jest w standardowych bibliotekach.

 

Jeżeli to co masz to ten kod apki na androida to może zacznij od zainstalowania jakiegoś porządnego IDE :D

Przedewszystkim daj znać na jaką platformę potrzebujesz to mieć.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem jest taki, że ja też niigdy nie pisałem :D

 

Z programowaniem mam ogólnie tyle doświadczenia, że kiedyś zrobiłem jakiś tam skrypt do greasemonkey na własny użytek i ostatnio zmodyfikowałem wcześniej wspomnianą aplikację dodając alarm ;)

 

Tu nie chodzi o lenistwo, a o brak umiejętności. Szukam od kilku dni jak to zrobić ;/

 

Kod będzie na androida, marshmallow. Sama apka jest ogólnie w react native, ale do utworzenia .csv woła plik w javie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W kwestii zapisu do pliku użyłbym gotowego loggera, których do Javy jest kilka. Logback pozwoli się skonfigurować tak, aby zapisywać csv. Odpadają problemy z dostępem do pliku, zamykaniem strumieni, rollowaniem plików, itd. Jest to tam zrobione dobrze i warto korzystać. Piszesz jedną linijkę w kodzie i zapisuje do pliku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tu pojawia się problem, bo ten logger trzeba dodać do apki i za każdym razem wywala mi jakiś błąd... nie wiem czy jest sens się w to pakować, skoro w aplikacji jest gotowy kod, który pisze plik csv. Nie wiem tylko jak go zmodyfikować aby zapisywał podane wartości. W samym kodzie jak dla mnie nie ma nic co by mnie naprowadziło.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do pliku w tym kodzie zapisuje metoda writeFile, ale najpierw musi mieć wypełniony buffer przez addDataToFile. ogólnie ten kod jest tak zły, jak to tylko możliwe, więc w ogóle sobie bym nie zawracał głowy. Ma idiotyczne API, współdzielony stan, głupio obsłużone strumienie i zdropowane wyjątki. Tylko obstawiać zakłady, kiedy się wywali. Zamiast analizować ten chaos, lepiej właśnie ogarnij jakąś normalną bibliotekę/logger do obsługi plików, gdzie wywołasz jedno plecenie i zapiszesz to, co chcesz. Pierwszy lepszy tutorial: https://www.callicoder.com/java-read-write-csv-file-apache-commons-csv/.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Udało mi się dograć do aplikacji logbacka z tego githuba -> https://github.com/tony19/logback-android

Trochę było zabawy z multidexem, ale aplikacja działa ;)

 

I teraz dwa pytania:

1. Czy masz może jakiś przykładowy kod, który zapisuje do csv?

2. Jak przerobić tę funkcję poniżej na string?

 

  public int measureConcentration(double[] means){
       return (int) (means[3] / means[1]) ;

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Musisz sobie zainicjować loggera, w klasie, gdzie chcesz wykonywać zapis do pliku:

 

private static Logger LOG = LoggerFactory.getLogger(NazwaKlasy.class);

i możesz od razu go używać w meotdach:

 

String csvLine = String.join(",", "text1", "text2", "text3", "text4");
LOG.info(csvLine);

 

Jedyny problem, to dobrze skonfigurować loggera w logback.xml:

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <layout class="ch.qos.logback.classic.PatternLayout">
           <Pattern>
               %d{dd-MM-yyyy HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
           </Pattern>
       </layout>
   </appender>
   <appender name="FILE-APPENDER" class="ch.qos.logback.core.FileAppender">
       <file>/sciezka/dopliku/plik.csv</file>
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
           <Pattern>
               %msg%n
           </Pattern>
       </encoder>
   </appender>
   <logger name="pakiet.klasy.piszacej.do.csv" level="INFO" additivity="false">
       <appender-ref ref="FILE-APPENDER" />
   </logger>
   <root level="INFO">
       <appender-ref ref="STDOUT" />
   </root>
</configuration>

W ten sposób po podmienieniu ścieżki do pliku csv i pakietu klasy piszącej do niego dostaniesz, to co chcesz: Konkretne wartości zalogowane do wskazanego pliku csv, a reszta wiadomości trafi gdzie indziej - w tym przypadku na konsolę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wielkie dzięki za odpowiedzi ;)

 

Zrobiłem tak:

 

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <layout class="ch.qos.logback.classic.PatternLayout">
           <Pattern>
               %d{dd-MM-yyyy HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
           </Pattern>
       </layout>
   </appender>
   <appender name="FILE-APPENDER" class="ch.qos.logback.core.FileAppender">
       <file>/storage/emulated/0/Download/Data.csv</file>
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
           <Pattern>
               %msg%n
           </Pattern>
       </encoder>
   </appender>
   <logger name="com.eeg_project.components.csv.LogbackWriter" level="INFO" additivity="false">
       <appender-ref ref="FILE-APPENDER" />
   </logger>
   <root level="INFO">
       <appender-ref ref="STDOUT" />
   </root>
</configuration>

 

W utworzonym module java (LogbackWriter.java)

 

package com.eeg_project.components.csv;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.eeg_project.components.classifier.ClassifierModule;

import java.util.Map;
import java.util.HashMap;
import java.lang.Math;

public class LogbackWriter extends ReactContextBaseJavaModule {

@Override
public String getName() {
	return "LogbackCSV";
}

private static Logger LOG = LoggerFactory.getLogger(LogbackWriter.class);

private static boolean saveToCSV;

public static void main(String[] args) {

	integer r = ClassifierModule.measureRatio()
	int a = ClassifierModule.measureAlpha()
	int b = ClassifierModule.measureBeta()
	int d = ClassifierModule.measureDelta()
	int t = ClassifierModule.measureTheta()

	String Ratio = String.valueOf(r)
	String Alpha = String.valueOf(a)
	String Beta = String.valueOf(b)
	String Delta = String.valueOf(d)
	String Theta = String.valueOf(t)

}

   @ReactMethod
   public void saveCSV() {
       saveToCSV = true;
	String csvLine = String.join(",", "Ratio", "Alpha", "Beta", "Delta", "Theta");
	LOG.info(csvLine);
   }





   public boolean saveToCSV() {
       return saveToCSV;
   }

}

 

*Funkcję

boolean saveToCSV

utworzyłem do późniejszego wykorzystania przez react native przy zapisywaniu danych do pliku.

 

Niestety jak próbuję skompilować projekt to dostaję takie błędy:

 

> Task :app:compileDebugJavaWithJavac
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:31: error: ';' expected
               int r = ClassifierModule.measureRatio()
                                                      ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:32: error: ';' expected
               int a = ClassifierModule.measureAlpha()
                                                      ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:33: error: ';' expected
               int b = ClassifierModule.measureBeta()
                                                     ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:34: error: ';' expected
               int d = ClassifierModule.measureDelta()
                                                      ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:35: error: ';' expected
               int t = ClassifierModule.measureTheta()
                                                      ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:37: error: ';' expected
               String Ratio = String.valueOf(r)
                                               ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:38: error: ';' expected
               String Alpha = String.valueOf(a)
                                               ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:39: error: ';' expected
               String Beta = String.valueOf(b)
                                              ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:40: error: ';' expected
               String Delta = String.valueOf(d)
                                               ^
D:\Instalki\APK\Projekty\eeg-101-master\EEG101\android\app\src\main\java\com\eeg_project\components\csv\LogbackWriter.java:41: error: ';' expected
               String Theta = String.valueOf(ClassifierModule.measureTheta(t))
                                                                              ^
10 errors


FAILURE: Build failed with an exception.

 

Jak poprawnie utworzyć wartości string?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Polecam czytać błędy, bo one są po to, żeby powiedzieć, co jest źle. Jest napisane, że brakuje średników na końcu instrukcji. Poza tym, nie przekazujesz wartości do void saveCSV() i zawsze zapiszesz do pliku "Ratio,Alpha,Beta,Delta,Theta", a boolean saveToCSV nie ma sensu. Zacznij od podstaw Javy, bo nie rozumiesz, co robisz.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cóż, masz całkowitą rację, że nie bardzo kumam. Jednocześnie jestem Ci bardzo wdzięczny za pomoc! Co mam na swoją obronę? Polecę klasykiem z Kapitana Bomby - jestem samoukiem :D Czytam od jakichś dwóch tygodni po godzinach ile się da, pytam i jednocześnie próbuję coś sklecić. I tak sam się sobie dziwię, że coś z tego wychodzi, bo mój zawód nie ma nic wspólnego z programowaniem ;)

 

Tymczasem poprawiłem te błędy. Jeśli dobrze rozumiem to ten kawałek kodu powinien wyglądać tak:

 

String csvLine = String.join(",", "r", "a", "b", "d", "t");

 

Teraz tylko mam problem z importem metody z innego pliku:

 

public class ClassifierModule extends ReactContextBaseJavaModule implements BufferListener {

   public int measureRatio(double[] means){
       return (int) (means[3] / means[1]) ;
   }
}

 

Zawsze sypie błędami i nie jestem nawet pewien, czy użyłem dobrej metody:

 

int r = classifierModule.measureRatio(double[]);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja String.join użyłem tylko i wyłącznie jako przykład do zbudowania linii pliku csv. Ta funkcja łączy podane stringi przy pomocy podanego łącznika.

 

String.join(",", "a", "b", "c");

Zwraca "a", "b", "c" połączone przecinkami, czyli "a,b,c", co jest przykładową linijką csv. Ty potrzebujesz podać swoje wartości zamiast stringów "a", "b", "c". Wcześniej miałeś

 

int a = ClassifierModule.measureAlpha();
int b = ClassifierModule.measureBeta();
int d = ClassifierModule.measureDelta();
int t = ClassifierModule.measureTheta();

i to te wartości musisz pooddzielać przecinkami. Na przykład ręcznie:

 

String csvLine = a + "," + b, + "," + d + "," + t;

Można to też zrobić przy pomocy String.join(...), jeśli komuś wygogdniej, tylko trzeba wtedy najpierw inty pozamieniać na Stringi, których wymaga String.join(...).

 

 

 

 

Co do wywoływania metod z innych klas - jeśli są one statyczne wystarczy użyć

 

NazwaInnejKlasy.nazwaMetody(...)

z wymaganymi argumentami. Jeśli jest niestatyczna, to trzeba mieć gdzieś utworzony obiekt:

 

NazwaInnejKlasy obiekt = new NazwaInnejKlasy(...);
obiekt.nazwaMetody(...);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Siedziałem wczoraj nad tym do 3 rano i coś nie bardzo działa mi ten logback. Przeniosłem go do innego pliku, aby uniknąć importowania metod. Ustawiłem inty jako cyfry żeby w ogóle sprawdzić czy to działa.

 

Logback.xml mam skonfigurowany tak:

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <layout class="ch.qos.logback.classic.PatternLayout">
           <Pattern>
               %d{dd-MM-yyyy HH:mm:ss.SSS} %-5level [%thread] %logger - %msg%n
           </Pattern>
       </layout>
   </appender>
   <appender name="FILE-APPENDER" class="ch.qos.logback.core.FileAppender">
       <file>/storage/emulated/0/Download/Data.csv</file>
       <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
           <Pattern>
               %msg%n
           </Pattern>
       </encoder>
   </appender>
   <logger name="com.eeg_project.components.classifier.ClassifierModule" level="INFO" additivity="false">
       <appender-ref ref="FILE-APPENDER" />
   </logger>
   <root level="INFO">
       <appender-ref ref="STDOUT" />
   </root>
</configuration>

 

Sam kod wygląda tak (nie wklejałem całego):

 

package com.eeg_project.components.classifier;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ClassifierModule extends ReactContextBaseJavaModule implements BufferListener {

   // Logback
   private static Logger LOG = LoggerFactory.getLogger(ClassifierModule.class);

   @ReactMethod
   public void startSaveCSV() {

       int a = 2;//measureAlpha();
       int b = 2;//measureBeta();
       int d = 4;//measureDelta();
       int t = 2;//measureTheta();
       int r = 3;//measureRatio();

       String csvLine = a + "," + b + "," + d + "," + t + "," + r;
       LOG.info(csvLine);
   }
}

 

W react native wołam to za pomocą przycisku:

 

  
import Classifier from "../native/Classifier";

 startSave () {
   Classifier.startSaveCSV();
 }

  <SandboxButton onPress={this.startSave.bind(this)}>CSV</SandboxButton>

 

Apka się kompiluje, wszystko się uruchamia, ale jak klikam w przycisk to kompletnie nic się nie dzieje. W podanym katalogu ani nigdzie, nie pojawia się plik Dane.csv

 

Co z tym fantem zrobić?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Reacta znam tylko w podstawowym zakresie, a ReactNative w ogóle, więc nie powiem, co jest nie tak z przyciskiem. Spróbowałbym wyświetlić jakiś text/popup na ekran, żeby się upewnić, że przycisk w ogóle działa. Nie kumam też, czemu jakiś SandboxButton, a nie zwykły i nie widzę jego importu. Ale to tylko zgadywanie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ten sandboxbutton to wbudowany przycisk aplikacji, pod którym kryła się inna funkcja. Po prostu ją zmieniłem na tą, którą chcę wywołać. Popup zainicjowany w ten sposób działa normalnie. A import jest, nie wkleiłem go tylko na forum ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Problem rozwiązany ;) logback.xml był źle skonfigurowany. Jakby ktoś miał podobny problem to użyłem takich ustawień:

 

<configuration>
 <!-- Create a file appender for a log in the application's data directory -->
 <appender name="file" class="ch.qos.logback.core.FileAppender">
   <file>/data/data/com.eeg_project/files/log/data.log</file>
   <encoder>
     <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
   </encoder>
 </appender>

 <!-- Write INFO (and higher-level) messages to the log file -->
 <root level="INFO">
   <appender-ref ref="file" />
 </root>
</configuration>

 

Reszta kodu jak dwa posty wyżej. I tym oto sposobem można używac Logbacka w React Native ;) Jeszcze raz dziękuję Ci Karister za pomoc!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wg mnie teraz masz źle skonfigurowany ten logger. Będziesz miał zapisywane do pliku znacznie więcej od samych wartości oddzielonych przecinkami: info dotyczące godziny, nazwy wątku i poziomu logowania. Poza tym bez skierowanej całej reszty na stdout inne klasy też będą logowac do tego pliku csv. Wg mnie problem mogło rozwiązać podanie prawidłowej ścieżki do pliku. Reszta zmian nie wygląda dobrze.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W sumie masz rację, ale zajmę się tym potem, bo jak na razie walczę z tym, żeby uruchomić tego loggera w wewnętrznej klasie. Z zewnętrznej startuje normalnie, z wewnętrznej w ogóle, ehh. Masz może jakiś pomysł?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Bez kodu to jak wróżenie ze szklanej kuli. Jeśli używasz LoggerFactory.getLogger(...) w wewnętrznej klasie, nie możesz użyć NazwaKlasyWewnetrznej.class jako argumentu getLogger(...), bo getClass() zwraca "pakiet.KlasaZewn$KlasaWewn", a Logback wymaga wszystkiego pooddzielanego kropkami. Musisz ręcznie podać String: "pakiet.KlazaZewn.KlasaWewn". Aczkolwiek taka potrzeba prawdopodobnie oznacza zły design kodu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...