mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 02:50:04 +00:00 
			
		
		
		
	Refactoring generic message components to awips namespace
This commit is contained in:
		
							parent
							
								
									a76103650e
								
							
						
					
					
						commit
						7a9582a689
					
				
					 14 changed files with 64 additions and 65 deletions
				
			
		
							
								
								
									
										124
									
								
								wxdata/include/scwx/awips/message.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								wxdata/include/scwx/awips/message.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,124 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <array> | ||||
| #include <execution> | ||||
| #include <istream> | ||||
| #include <map> | ||||
| #include <string> | ||||
| 
 | ||||
| #ifdef WIN32 | ||||
| #   include <WinSock2.h> | ||||
| #else | ||||
| #   include <arpa/inet.h> | ||||
| #endif | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace awips | ||||
| { | ||||
| 
 | ||||
| class MessageImpl; | ||||
| 
 | ||||
| class Message | ||||
| { | ||||
| protected: | ||||
|    explicit Message(); | ||||
| 
 | ||||
|    Message(const Message&) = delete; | ||||
|    Message& operator=(const Message&) = delete; | ||||
| 
 | ||||
|    Message(Message&&) noexcept; | ||||
|    Message& operator=(Message&&) noexcept; | ||||
| 
 | ||||
|    virtual bool ValidateMessage(std::istream& is, size_t bytesRead) const; | ||||
| 
 | ||||
| public: | ||||
|    virtual ~Message(); | ||||
| 
 | ||||
|    virtual size_t data_size() const = 0; | ||||
| 
 | ||||
|    virtual bool Parse(std::istream& is) = 0; | ||||
| 
 | ||||
|    static void ReadBoolean(std::istream& is, bool& value) | ||||
|    { | ||||
|       std::string data(4, ' '); | ||||
|       is.read(reinterpret_cast<char*>(&data[0]), 4); | ||||
|       value = (data.at(0) == 'T'); | ||||
|    } | ||||
| 
 | ||||
|    static void ReadChar(std::istream& is, char& value) | ||||
|    { | ||||
|       std::string data(4, ' '); | ||||
|       is.read(reinterpret_cast<char*>(&data[0]), 4); | ||||
|       value = data.at(0); | ||||
|    } | ||||
| 
 | ||||
|    static float SwapFloat(float f) | ||||
|    { | ||||
|       return ntohf(*reinterpret_cast<uint32_t*>(&f)); | ||||
|    } | ||||
| 
 | ||||
|    template<size_t _Size> | ||||
|    static void SwapArray(std::array<float, _Size>& arr, size_t size = _Size) | ||||
|    { | ||||
|       std::transform(std::execution::par_unseq, | ||||
|                      arr.begin(), | ||||
|                      arr.begin() + size, | ||||
|                      arr.begin(), | ||||
|                      [](float f) { return SwapFloat(f); }); | ||||
|    } | ||||
| 
 | ||||
|    template<size_t _Size> | ||||
|    static void SwapArray(std::array<int16_t, _Size>& arr, size_t size = _Size) | ||||
|    { | ||||
|       std::transform(std::execution::par_unseq, | ||||
|                      arr.begin(), | ||||
|                      arr.begin() + size, | ||||
|                      arr.begin(), | ||||
|                      [](int16_t u) { return ntohs(u); }); | ||||
|    } | ||||
| 
 | ||||
|    template<size_t _Size> | ||||
|    static void SwapArray(std::array<uint16_t, _Size>& arr, size_t size = _Size) | ||||
|    { | ||||
|       std::transform(std::execution::par_unseq, | ||||
|                      arr.begin(), | ||||
|                      arr.begin() + size, | ||||
|                      arr.begin(), | ||||
|                      [](uint16_t u) { return ntohs(u); }); | ||||
|    } | ||||
| 
 | ||||
|    template<size_t _Size> | ||||
|    static void SwapArray(std::array<uint32_t, _Size>& arr, size_t size = _Size) | ||||
|    { | ||||
|       std::transform(std::execution::par_unseq, | ||||
|                      arr.begin(), | ||||
|                      arr.begin() + size, | ||||
|                      arr.begin(), | ||||
|                      [](uint32_t u) { return ntohl(u); }); | ||||
|    } | ||||
| 
 | ||||
|    template<typename T> | ||||
|    static void SwapMap(std::map<T, float>& m) | ||||
|    { | ||||
|       std::for_each(std::execution::par_unseq, | ||||
|                     m.begin(), | ||||
|                     m.end(), | ||||
|                     [](auto& p) { p.second = SwapFloat(p.second); }); | ||||
|    } | ||||
| 
 | ||||
|    static void SwapVector(std::vector<uint16_t>& v) | ||||
|    { | ||||
|       std::transform(std::execution::par_unseq, | ||||
|                      v.begin(), | ||||
|                      v.end(), | ||||
|                      v.begin(), | ||||
|                      [](uint16_t u) { return ntohs(u); }); | ||||
|    } | ||||
| 
 | ||||
| private: | ||||
|    std::unique_ptr<MessageImpl> p; | ||||
| }; | ||||
| 
 | ||||
| } // namespace awips
 | ||||
| } // namespace scwx
 | ||||
							
								
								
									
										53
									
								
								wxdata/include/scwx/awips/wmo_header.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								wxdata/include/scwx/awips/wmo_header.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
| namespace awips | ||||
| { | ||||
| 
 | ||||
| class WmoHeaderImpl; | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief The WMO Header is defined in WMO Manual No. 386, with additional codes | ||||
|  * defined in WMO Codes Manual 306.  The NWS summarizes the relevant | ||||
|  * information. | ||||
|  * | ||||
|  * <https://www.roc.noaa.gov/WSR88D/Level_III/Level3Info.aspx>
 | ||||
|  * <https://www.weather.gov/tg/head>
 | ||||
|  * <https://www.weather.gov/tg/headef>
 | ||||
|  * <https://www.weather.gov/tg/bbb>
 | ||||
|  * <https://www.weather.gov/tg/awips>
 | ||||
|  */ | ||||
| class WmoHeader | ||||
| { | ||||
| public: | ||||
|    explicit WmoHeader(); | ||||
|    ~WmoHeader(); | ||||
| 
 | ||||
|    WmoHeader(const WmoHeader&) = delete; | ||||
|    WmoHeader& operator=(const WmoHeader&) = delete; | ||||
| 
 | ||||
|    WmoHeader(WmoHeader&&) noexcept; | ||||
|    WmoHeader& operator=(WmoHeader&&) noexcept; | ||||
| 
 | ||||
|    const std::string& sequence_number() const; | ||||
|    const std::string& data_type() const; | ||||
|    const std::string& geographic_designator() const; | ||||
|    const std::string& bulletin_id() const; | ||||
|    const std::string& icao() const; | ||||
|    const std::string& date_time() const; | ||||
|    const std::string& bbb_indicator() const; | ||||
|    const std::string& product_category() const; | ||||
|    const std::string& product_designator() const; | ||||
| 
 | ||||
|    bool Parse(std::istream& is); | ||||
| 
 | ||||
| private: | ||||
|    std::unique_ptr<WmoHeaderImpl> p; | ||||
| }; | ||||
| 
 | ||||
| } // namespace awips
 | ||||
| } // namespace scwx
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat