Thank you very much steve now I'm trying a new approachù; you'have been really helpful thank you again
2011/10/6 steve ayer <[email protected]> > peppe, > > i think that you're missing something here. please read the code > carefully: if the current buffer is 0, then where was the most recent data > written? > > another thing to consider is that you want to do as little as possible in > interrupt context (e.g. async events). adding a memcpy there is not > advisable unless it's absolutely necessary (it's not). > > you'll also have to change the code that "prepares" the radio packet. i > should point out that accelecg goes to a lot of trouble to build up a packet > with data that you don't really need; you might want to consider using > SimpleAccel as the basis for your development instead. it will be much > easier to modify correctly, it transmits only sampled data, and it will be > much more power-efficient than accelecg as it buffers 20 samples together in > one transmission rather than sending a packet for each sample. > > -steve > > > On 10/06/2011 04:46 AM, Peppe Scabellone wrote: > >> Thank you both for answering. >> >> So, if I need to capture the datas from the two ecg channels I only need >> to call >> >> call shimmerAnalogSetup.**addECGInputs(); >> call shimmerAnalogSetup.**finishADCSetup(sbuf0); >> >> in the Init() and then: >> >> >> async event void DMA0.transferDone(error_t success) { >> if(current_buffer == 0){ >> call DMA0.repeatTransfer((void*)**ADC12MEM0_, (void*)&sbuf1, >> NBR_ADC_CHANS); >> memcpy(ecgData, &sbuf1, sizeof(*sbuf1)*NBR_ADC_CHANS); >> current_buffer = 1; >> } >> else { >> call DMA0.repeatTransfer((void*)**ADC12MEM0_, (void*)&sbuf0, >> NBR_ADC_CHANS); >> memcpy(ecgData, &sbuf0, sizeof(*sbuf1)*NBR_ADC_CHANS); >> current_buffer = 0; >> } >> without making the >> call shimmerAnalogSetup.**addAccelInputs(); >> >> in this way in the array ecgData I will have the datas from the two >> channels? >> >> 2011/10/5 steve ayer <[email protected] <mailto:[email protected]>> >> >> >> hi peppe, >> >> for the record, i did not write this application, adrian burns did. >> i made a few latter-day mods to clean it up after creating a >> component for all of the analog-digital setup and conversion >> functionality. >> >> p_packet is a local variable used to walk the buffer that the >> bluetooth radio will send; it was not meant to be visible elsewhere. >> the buffer that it references is. >> >> as for "calling" transferDone, you don't call events; they are >> signaled from modules that are performing an operation to notify the >> receiving code that something related to an interface that it uses >> has happened (tinyos is an event-driven operating environment). >> >> finally, this application works splendidly and has been in use -- >> deployed clinically -- for a number of years. to get the data from >> the ECG, all you have to do is receive it over bluetooth on a host >> computer. >> >> if you're looking for the two ECG channels, by reading the comments >> at the top of the file, you'll see a detailed description of the >> radio packet's contents, which includes the size and location of all >> of the data produced by this application, in order to make it very >> simple to parse the incoming data on the host side. >> >> -steve >> >> >> >> On 10/05/2011 06:55 AM, Peppe Scabellone wrote: >> >> Hi , I was looking Steve Ayer's AccelECGC.nc file. >> I need to get datas from ECG and as I can see in that file the real >> datas are stored in p_packet array as you can see below: >> >> /* copy all the data samples into the outgoing packet */ >> *p_packet++ = *p_ADCsamples++; //tx_packet[8] >> *p_packet++ = *p_ADCsamples++; //tx_packet[10] >> *p_packet++ = *p_ADCsamples++; //tx_packet[12] >> *p_packet++ = *p_ADCsamples++; //tx_packet[14] >> *p_packet = *p_ADCsamples; //tx_packet[16] >> >> but this p_packet is never used in other part of the code. >> >> I need the two channels of ECG stored in one array >> uint16_t ecgData[2] >> >> so if I call >> >> async event void DMA0.transferDone(error_t success) { >> if(current_buffer == 0){ >> call DMA0.repeatTransfer((void*)__**ADC12MEM0_, >> >> (void*)&sbuf1, >> NBR_ADC_CHANS); >> memcpy(ecgData, &sbuf1, sizeof(*sbuf1)*NBR_ADC_CHANS); >> current_buffer = 1; >> } >> else { >> call DMA0.repeatTransfer((void*)__**ADC12MEM0_, >> >> (void*)&sbuf0, >> NBR_ADC_CHANS); >> memcpy(ecgData, &sbuf0, sizeof(*sbuf1)*NBR_ADC_CHANS); >> current_buffer = 0; >> } >> >> post preparePacket(); >> >> } >> >> and the method >> >> void preparePacket() { >> uint16_t *p_packet, *p_ADCsamples, crc; >> >> p_packet = (uint16_t *)&tx_packet[8]; >> >> if(current_buffer == 1) { >> p_ADCsamples = &sbuf0[0]; >> >> } >> else { >> p_ADCsamples = &sbuf1[0]; >> } >> >> /* copy all the data samples into the outgoing packet */ >> *p_packet++ = *p_ADCsamples++; //tx_packet[8] >> *p_packet++ = *p_ADCsamples++; //tx_packet[10] >> *p_packet++ = *p_ADCsamples++; //tx_packet[12] >> *p_packet++ = *p_ADCsamples++; //tx_packet[14] >> *p_packet = *p_ADCsamples; //tx_packet[16] >> >> } >> >> The Question is using these two methods I'll have the datas in >> ecgData >> array? or I have to intercept p_packet? >> >> Thank you. >> >> >> >> ______________________________**___________________ >> Shimmer-users mailing list >> [email protected] >> >> <mailto:Shimmer-users@eecs.**harvard.edu<[email protected]> >> > >> https://lists.eecs.harvard.__**edu/mailman/listinfo/shimmer-_**_users >> <https://lists.eecs.harvard.**edu/mailman/listinfo/shimmer-**users<https://lists.eecs.harvard.edu/mailman/listinfo/shimmer-users> >> > >> >> >>
_______________________________________________ Shimmer-users mailing list [email protected] https://lists.eecs.harvard.edu/mailman/listinfo/shimmer-users
