#include <iostream>
#include <atomic>
#include <typeinfo>
using namespace std;

namespace SmartTech{
	volatile int hardwareEmergencySignal=0;
	std::atomic<int> totalDataPacketsSent(0);
	inline double celsiusToFahrenheit(double c){
		return (c*9.0/5.0)+32.0;
	}
	class Sensor{
		public:
			static int activeSensorsCount;
			Sensor(double temp){
				temperature=temp;
				activeSensorsCount++;
			}
			double getTemperature(){return temperature;}
			void transmitData(){totalDataPacketsSent++;}
		private:
			double temperature;
	};
	int Sensor::activeSensorsCount=0;
}

auto calculateAverage(double a,double b){
	return (a+b)/2.0;
}

int main(){
	using namespace SmartTech;
	Sensor s1(25.5);
	Sensor s2(30.0);
	Sensor s3(15.2);
	cout<<"Active Sensors: "<<Sensor::activeSensorsCount<<endl;
	auto tempC=s1.getTemperature();
	auto tempF=celsiusToFahrenheit(tempC);
	cout<<"Sensor 1 - Celsius: "<<tempC<<" | Fahrenheit: "<<tempF<<endl;
	cout<<"SOS: "<<hardwareEmergencySignal<<endl;
	s1.transmitData();
	s2.transmitData();
	s3.transmitData();
	s1.transmitData();
	cout<<"Total Packets Sent: "<<totalDataPacketsSent<<endl;
	auto avgTemp=calculateAverage(s1.getTemperature(),s2.getTemperature());
	cout<<"Average Temperature (Sensors 1 & 2): "<<avgTemp<<endl;
	decltype(avgTemp) backupTemp=40.5;
	cout<<"Data Type of backupTemp: "<<typeid(backupTemp).name()<<" ('d' means double)"<<endl;
	return 0;
}
