Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #define GET_BIT(X,N) ( ( (X) >> (N) ) & 1 )
- double ref = 2.5;
- uint32_t raw_code = 0;
- double voltage = -1;
- void ad7771_data_to_voltage(double ref, uint32_t *raw_code, double *voltage) {
- if((*raw_code <= 0x7FFFFF) && (*raw_code >= 0x00)) {
- *voltage = (double)(*raw_code * (ref/16777216.0));
- }
- else {
- *voltage = (double)((*raw_code * (ref/16777216.0))-ref);
- }
- }
- timespec diff(timespec start, timespec end){
- timespec temp;
- if ((end.tv_nsec-start.tv_nsec)<0) {
- temp.tv_sec = end.tv_sec-start.tv_sec-1;
- temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
- } else {
- temp.tv_sec = end.tv_sec-start.tv_sec;
- temp.tv_nsec = end.tv_nsec-start.tv_nsec;
- }
- return temp;
- }
- int main() {
- int pipefd[2];
- if (pipe(pipefd) == -1) {
- perror("pipe");
- return 1;
- }
- pid_t pid = fork();
- if (pid == -1) {
- perror("fork");
- return 1;
- }
- if (pid == 0) { // Child process
- close(pipefd[0]); // Close read end
- dup2(pipefd[1], STDOUT_FILENO);
- const char* command = "arecord -c 8 -r 192 -f S32 -t raw -D hw";
- FILE* output_stream = popen(command, "r");
- if (output_stream == nullptr) {
- perror("popen");
- return 1;
- }
- char buf[32768];
- ssize_t bytesRead;
- bytesRead = read(pipefd[0], buf, sizeof(buf));
- timespec time1_, time2_;
- clock_gettime(CLOCK_REALTIME, &time1_);
- for (int i1 = 0; i1 < 125; ++i1) { //125 readings should give 125*1/128000*1024 = 1 second period
- bytesRead = read(pipefd[0], buf, sizeof(buf));
- }
- clock_gettime(CLOCK_REALTIME, &time2_);
- std::cout<< "Data read took s ns: "<<diff(time1_,time2_).tv_sec <<" "<< diff(time1_,time2_).tv_nsec << std::endl;
- uint32_t adcRawValues0 = (buf[2] << 16) | (buf[1] << 8) | (buf[0] << 0);
- uint8_t channelId0 = GET_BIT(buf[3], 4) + GET_BIT(buf[3], 5) * 2 + GET_BIT(buf[3], 6) * 4;
- uint8_t channelError0 = GET_BIT(buf[3], 7);
- uint32_t adcRawValues1 = (buf[18] << 16) | (buf[17] << 8) | (buf[16] << 0);
- uint8_t channelId1 = GET_BIT(buf[19], 4) + GET_BIT(buf[19], 5) * 2 + GET_BIT(buf[19], 6) * 4;
- uint8_t channelError1 = GET_BIT(buf[19], 7);
- uint32_t adcRawValues2 = (buf[6] << 16) | (buf[5] << 8) | (buf[4] << 0);
- uint8_t channelId2 = GET_BIT(buf[7], 4) + GET_BIT(buf[7], 5) * 2 + GET_BIT(buf[7], 6) * 4;
- uint8_t channelError2 = GET_BIT(buf[7], 7);
- uint32_t adcRawValues3 = (buf[22] << 16) | (buf[21] << 8) | (buf[20] << 0);
- uint8_t channelId3 = GET_BIT(buf[23], 4) + GET_BIT(buf[23], 5) * 2 + GET_BIT(buf[23], 6) * 4;
- uint8_t channelError3 = GET_BIT(buf[23], 7);
- uint32_t adcRawValues4 = (buf[10] << 16) | (buf[9] << 8) | (buf[8] << 0);
- uint8_t channelId4 = GET_BIT(buf[11], 4) + GET_BIT(buf[11], 5) * 2 + GET_BIT(buf[11], 6) * 4;
- uint8_t channelError4 = GET_BIT(buf[11], 7);
- uint32_t adcRawValues5 = (buf[26] << 16) | (buf[25] << 8) | (buf[24] << 0);
- uint8_t channelId5 = GET_BIT(buf[27], 4) + GET_BIT(buf[27], 5) * 2 + GET_BIT(buf[27], 6) * 4;
- uint8_t channelError5 = GET_BIT(buf[27], 7);
- uint32_t adcRawValues6 = (buf[14] << 16) | (buf[13] << 8) | (buf[12] << 0);
- uint8_t channelId6 = GET_BIT(buf[15], 4) + GET_BIT(buf[15], 5) * 2 + GET_BIT(buf[15], 6) * 4;
- uint8_t channelError6 = GET_BIT(buf[15], 7);
- uint32_t adcRawValues7 = (buf[30] << 16) | (buf[29] << 8) | (buf[28] << 0);
- uint8_t channelId7 = GET_BIT(buf[31], 4) + GET_BIT(buf[31], 5) * 2 + GET_BIT(buf[31], 6) * 4;
- uint8_t channelError7 = GET_BIT(buf[31], 7);
- ad7771_data_to_voltage(ref, &adcRawValues0, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[3],buf[2],buf[1],buf[0], channelId0,voltage,channelError0, adcRawValues0);
- ad7771_data_to_voltage(ref, &adcRawValues1, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[19],buf[18],buf[17],buf[16], channelId1,voltage,channelError1, adcRawValues1);
- ad7771_data_to_voltage(ref, &adcRawValues2, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[7],buf[6],buf[5],buf[4], channelId2,voltage,channelError2, adcRawValues2);
- ad7771_data_to_voltage(ref, &adcRawValues3, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[23],buf[22],buf[21],buf[20], channelId3,voltage,channelError3, adcRawValues3);
- ad7771_data_to_voltage(ref, &adcRawValues4, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[11],buf[10],buf[9],buf[8], channelId4,voltage,channelError4, adcRawValues4);
- ad7771_data_to_voltage(ref, &adcRawValues5, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[27],buf[26],buf[25],buf[24], channelId5,voltage,channelError5, adcRawValues5);
- ad7771_data_to_voltage(ref, &adcRawValues6, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[15],buf[14],buf[13],buf[12], channelId6,voltage,channelError6, adcRawValues6);
- ad7771_data_to_voltage(ref, &adcRawValues7, &voltage);
- printf("HEADER: %hhX %hhX %hhX %hhX CH: %d Volts: %.6f Error: %d Value: %d\n", buf[21],buf[20],buf[19],buf[18], channelId7,voltage,channelError7, adcRawValues7);
- // Close the write end of the pipe after the program is done
- pclose(output_stream);
- }
- else { // Parent process
- close(pipefd[1]); // Close write end
- // Read data from the read end of the pipe
- char buffer[1024];
- ssize_t bytesRead;
- while ((bytesRead = read(pipefd[0], buffer, sizeof(buffer))) > 0) {
- // Process or use the data as needed
- // Here, we just print it to the console
- std::cout.write(buffer, bytesRead);
- }
- close(pipefd[0]); // Close read end after reading is done
- wait(NULL); // Wait for the child process to finish
- }
- return 0;
- }
- root@BeagleBone:/home/debian# g++ -oread_stream read_stream.cpp && ./read_stream
- Recording raw data 'stdin' : Signed 32 bit Little Endian, Rate 192000 Hz, Channels 8
- Data read took s ns: 0 999621565
- HEADER: 89 7F F0 DB CH: 0 Volts: 1.249422 Error: 1 Value: 8384731
- HEADER: 94 FF FF F2 CH: 1 Volts: -0.000002 Error: 1 Value: 16777202
- HEADER: A2 0 0 5A CH: 2 Volts: 0.000013 Error: 1 Value: 90
- HEADER: B9 FF FF D4 CH: 3 Volts: -0.000007 Error: 1 Value: 16777172
- HEADER: C5 0 0 52 CH: 4 Volts: 0.000012 Error: 1 Value: 82
- HEADER: D0 FF FF FC CH: 5 Volts: -0.000001 Error: 1 Value: 16777212
- HEADER: EE 0 0 47 CH: 6 Volts: 0.000011 Error: 1 Value: 71
- HEADER: FF D4 94 FF CH: 7 Volts: -0.000008 Error: 1 Value: 16777159
Advertisement
Add Comment
Please, Sign In to add comment