mirror of https://github.com/lumapu/ahoy.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							108 lines
						
					
					
						
							2.6 KiB
						
					
					
				| /* based on "gettingstarted.cpp" by 2bdy5 */ | |
| 
 | |
| /** | |
|  * Behave like we expect a Hoymiles microinverter to behave. | |
|  */ | |
| #include <ctime>       // time() | |
| #include <iostream>    // cin, cout, endl | |
| #include <iomanip> | |
| #include <string>      // string, getline() | |
| #include <vector> | |
| #include <sstream> | |
| #include <time.h>      // CLOCK_MONOTONIC_RAW, timespec, clock_gettime() | |
| #include <RF24/RF24.h> // RF24, RF24_PA_LOW, delay() | |
| #include <unistd.h>    // usleep() | |
|  | |
| using namespace std; | |
| 
 | |
| #include "common.hpp" | |
|  | |
| // Generic: | |
| RF24 radio(22, 0, 1000000); | |
| // See http://nRF24.github.io/RF24/pages.html for more information on usage | |
|  | |
| 
 | |
| /** Receive forever | |
|  */ | |
| void receiveForever(int ch, string myaddr) | |
| { | |
|     uint8_t buf[30]; | |
| 
 | |
|     radio.setChannel(ch); | |
|     radio.enableDynamicPayloads(); | |
|     radio.setAutoAck(true); | |
| 
 | |
|     radio.setPALevel(RF24_PA_MAX); | |
|     radio.setDataRate(RF24_250KBPS); | |
|     radio.openWritingPipe((const uint8_t *)"dummy"); | |
|     radio.flush_rx(); | |
|     radio.flush_tx(); | |
|     radio.openReadingPipe(1, (const uint8_t *)myaddr.c_str()); | |
|     radio.startListening(); | |
|     radio.printPrettyDetails(); | |
|   | |
|     cout << endl << "I'm listening..." << endl; | |
| 
 | |
|     while (true) | |
|     { | |
|         uint8_t pipe; | |
| 	usleep(500000); | |
| 	if (radio.failureDetected) { | |
| 		cout << "!f! " << flush; | |
| 	} | |
| 	if (radio.rxFifoFull()) { | |
| 		cout << "!F! " << flush; | |
| 	} | |
|         if (radio.available(&pipe))  | |
|         { | |
|             uint8_t bytes = radio.getDynamicPayloadSize();          // get the size of the payload | |
|             cout << "I was notified of having received " << dec << (unsigned int)bytes; | |
|             cout << " bytes on pipe " << (unsigned int)pipe << ": " << flush; | |
|             radio.read(buf, bytes);                     // fetch payload from FIFO | |
|             for(int i=0; i<bytes; i++) | |
| 	    { | |
| 		cout << " " << hex << setfill('0') << setw(2) << (int)buf[i]; | |
| 	    } | |
| 	    cout << " '"; | |
|             for(int i=0; i<bytes; i++) | |
| 	    { | |
| 		cout << buf[i]; | |
| 	    } | |
| 	    cout << "'" << endl; | |
|             //radio.printPrettyDetails(); | |
|        } | |
|     } | |
| } | |
| 
 | |
| 
 | |
| int main(int argc, char** argv)  | |
| { | |
|     delay(200); | |
|     if (!radio.begin()) { | |
|         cout << "radio hardware is not responding!!" << endl; | |
|         return 0; // quit now | |
|     } | |
| 
 | |
|     if(!radio.isPVariant()) | |
|     { | |
|     	printf("not nRF24L01+\n"); | |
|         return 0; | |
|     } | |
| 
 | |
|     if(!radio.isChipConnected()) | |
|     { | |
|     	printf("not connected\n"); | |
|         return 0; | |
|     } | |
| 
 | |
|     // TODO  | |
|     // we probably want | |
|     // - do we need/want "custom ack payloads"? | |
|     // - use isAckPayloadAvailable() once we've actually contacted an inverter successfully! | |
|  | |
|     string addr = serno2shockburstaddrbytes(114174608177); | |
|     receiveForever(9, "2Node"); | |
| 
 | |
|     return 0; | |
| } | |
| 
 | |
| 
 |