Click here to Skip to main content
13,897,583 members
Click here to Skip to main content
Add your own
alternative version

Tagged as

Stats

8.8K views
23 downloads
1 bookmarked
Posted 7 Aug 2016
Licenced CPOL

Cool Head: Intel Edison Smart Helmet with Climate Control, Automatic Indication and Accident Notification

Rate this:
Please Sign up or sign in to vote.
Novel Intel Edison smart helmet with portable air conditioner that can notify the relatives when a rider meets an accident, can automatically trigger the indicators based on head movement.

 

A Intel Edison based smart helmet that

  • Changes In-Helmet temperature using Peltier based cooling system
  • The cooling is based on temperature sensing
  • Triggers indicator automatically when user moves his head in left or right direction
  • Detects accident and notifies about the accident using Gmail and over Mqtt
  • Cmpletely battery driven and working prototype

 Motivation

In many places, in INDIA like Kalaburagi, people tend to avoid the helmets due to excessive heat and severe irritation and discomfort, resulting from the heat. The country also suffers from rash driving & negligence. Many a time, such negligence by the riders for not using dippers and indicators results in road mishaps. Further we do not have a great accident support system. Hence many a times a rider loses his life because he remains unattended for a long time even after the accident. The major motivation for the work is to address a solution that can keep riders head cool, trigger the indicators automatically when he turns and notifies any authority or relatives when rider meets an accident. Our main goal is to save millions of lives that have been lost every year, not using the helmet, not using the indicators.

Introduction

Street car/bike accidents take the lives of about 1.3 million consistently and harm 20-50 million more on the planet. Refusal to utilize legitimate cruiser protective caps is among the fundamental variable adding to pass from street crashes - WHO said this in its report on 'Decade of Action for Road Safety '2010-2011'. All the more exasperatingly, an extensive number of passing from street mischances are borne by helpless Street clients, for example, people on foot, cyclists and motorcyclists.

Around 13% of the casualties from street related passing are people on foot in India when contrasted with 15% of mischances from traveller cars, autos and taxis and 27% from riders of mechanized two-or-three wheelers. So in the event that it can be made required to make the general people wear the protective cap when they ride the bike then the rates of these mishaps can be relied upon to fall. Overall most governments have officially made stringent laws with respect to wear the protective cap. In any case, regardless of the laws such cases are still on an ascent due to the absence of legitimate execution. As of recently just the laws have been shaped however no mechanical work has been done in such manner.

This is a circumstance we see in our everyday life, a considered discovering some answer for determination this issue we concocted this thought of giving the data about the mishap at the earliest opportunity and in TIME….!! Because after record-breaking matters a great deal, if everything is done in time, at any rate we can spare a large portion of the lives that are lost because of bike mischances.

  • Considering three main considerations for keeping away from the mishap causes, for example,
  1. Make wearing the protective cap mandatory.
  2. Avoid drink and drive.
  3. If an individual is met with a mischance and if nobody is there to help him. Rather than basically leaving or overlooking the individual he may bite the dust (Die). In such circumstance, advising to an emergency vehicle or relatives through smart phone to safeguard him to a degree.

In this work, we exhibit the configuration of the model we redesigned the head protector cap with Peltier module and GPS. With stock incorporated into head protector, agreeable temperature can be kept up in the cap by utilizing the Peltier module which deals with the premise of thermoelectric impact. In the event of street mishaps the exact area of the rider can be followed out utilizing GPS framework and gives the message to crisis vehicle. Also if any draining of blood happen can be coagulated by the thermoelectric module with the goal that individual can be safeguarded from basic conditions.

 

  Problem 

Few of the past works have proposed various embedded based solutions for helmets. Most of the past solutions adapt GPRS for generating the notification. One of the major problems with SMS (GSM) and web (GPRS) based notification is that the messaging is costly and secondly the web protocol is multitudes of time slower in comparison to M2M protocols being offered by IoT. Also, most of the past works are based on microcontroller architecture which has a serious limitation as far as parallel programming is concerned. Therefore parallel monitoring and controlling of the temperature, accident and indicators becomes very slow in the context of real time scenario. This problem can be addressed by replacing GPRS with IoT gateway, microcontroller with powerful microprocessors and using low latency sensors over conventional sensors.

The challenge of fast communication, scalable messaging, channelling of the messages and alarm and better event trigger is solved by the proposed solution. We use Intel Edison with Arduino compatible extension board to increase the speed of prototyping. We used Wi-fi connectivity to connect the IoT board with internet. We have used I2C based Accelerometer sensor, which has got significant performance improvement over serial communication based on conventional Accelerometers. The notification system puts the data into Google cloud through which it can be channelled to other platforms like Facebook, Twitter through IFTTT’s cloud based event and message routing. We have also used MQTT protocol which betters the response time of both web services and http. As MQTT from core offers QOAS support, the delivery of every packet with optimal latency is guaranteed. The detailed architecture of the proposed system is explained in detail in the methodology section.   

Highlights

The objective of the work is to offer cutting edge near real time solution for road safety, head comfort, riding assistance to a rider through a smart helmet powered by new generation IoT processors and protocol structures. The overall objective can be summarized into below specifics.

  1. Maintaining a comfortable temperature for the rider and in case of head injury due to an accident, to accelerate the blood clotting process by rapidly reducing the temperature of the Peltier module.
  2. Besides this locating the precise location(civic address) of the rider in case of an accident and at the same time intimating it to a preset mobile number and also since the data is collected through the cloud via MQTT ,the real time civic address will be broadcasted to social media applications like Facebook, Twitter, Gmail etc via an IFTTT application to address it to the family members.
  3. Based on the movement of the head of a rider for certain duration, this device actuates indicators placed on helmet sensed by the Groove accelerometer sensor.

 

    Specifications

  • Hardware Specifications
  1. Intel Edison
  2. Arduino  Compatible Breakout board for Intel Edison
  3. Sensors(Vibration, Accelerometer
  4. Peltier module with Heat Sink
  5. 12v External power supply/ Mobile Power Bank
  6. Internet Connectivity(Wi-Fi), 3G
  7. Android Mobile (Android version 4.0 and above)
  8. SeedStudio Groove Kit

 

  • Software Specifications
  1. Linux Yocto Operating System for Edison
  2. Node.js
  3. IDE: Intel XDK IoT edition
  4. Language: JavaScript ( Node.js)
  5. PuTTY
  6. IP Gateway:  IFTTT
  7.  protocols: MQTT.SMTP
  8. Client IDE: Android Studio

 

 

Components

In this section we will elaborate about the sensors and other components being used in this project

 

  • Grove Peizo Vibration Sensor  - For Accident detection

You can learn more about the sensor in this wiki link

 

 

  • Grove temperature Sensor - For temperature detection and triggering cooling unit

Grove temperature sensor is an electronic grove device that is basically used to sense the temperature changes in the surrounding.

The Grove-Temperature Sensor utilizes a thermistor to identify the encompassing temperature. The resistance of a thermistor will be increment when the encompassing temperature diminishes. It's this trademark we use to compute the surrounding temperature. The recognizable scope of this sensor is -40 - 125ºc, and the precision is ±1.5ºc

  • Following are the specifications of the sensor:
  1. Voltage: 3.3 ~ 5v
  2. Max power rating at 25 ºc:300mW
  3. Zero power resistance: 10KΩ
  4. Operating temperature range:-40 to 125 ºc

  • 3-Axis Accelerometer -  For Head movement detection and automatic indication

The 3-axis Accelerometer grove device basically uses a MMA7660FC and Digital Output I2C. This Grove device is basically applied for sensing the changes in the data, production direction and motion recognition via an interrupt pin (INT). This module uses less power and has a lower profile capacitive MEMS sensing element.

  • Following are the features of the 3-axis accelerometer sensor:
  1. Grove compatible interface
  2. Axis motion/orientation sensing
  3. Digital Output (I2C)
  4. 10,000g shock survival
  5. RoHS/WEEE lead-free compliant
  6. 5V DC input

  • Grove Relay -  For switching the Peltier module                                                                                            The Grove-Relay module is a computerized typically open switch. Through it, we can control circuit of high voltage with low voltage, say 5V on the controller. There is a pointer LED on the board, which will illuminate when the controlled terminals get shut.

In my work the use of Grove relay is to switch on the Peltier module or the fan when the value of the temperature rises above some threshold value set. It will be triggered by the MCU.

  • Specifications
  1. Operating voltage: 3.3V~5V
  2. Operating current:100mA
  3. Relay Life:100,000 Cycle
  4. Max switching voltage:250VAC/30VDC
  5. Max switching current:5A

  • Grove RGB LCD Backlight -  For display (Ok, IoT device doesn't look good without a display :) )

This Grove empowers you to set the shading to whatever you like by means of the basic and compact Grove interface. It takes I2C as specialized strategy for the microcontroller. So the number of pins required for information trade and backdrop illumination control contracts from ~10 to 2, diminishing IOs for other testing errands. Moreover, Grove - LCD RGB Backlight underpins user characterized characters.

In my work, it is basically used to display the live temperature information with the green colour and once when the temperature rises above the threshold value it changes it colour to red and starts blinking. Similarly it displays the state of the rider. In case if the rider meets with an accident it changes it colour to red and starts blinking.

  • Specifications
  1. Vcc Voltage: 5V
  2. I/O Voltage: 3.3/5V
  3. Operating Current<60mA
  4. CGROM: 10880 bit
  5. CGRAM: 64*8 bit
  6. Colorful RGB Backlight
  7. Built-in English and Japanese fonts
  8. I2C communication, uses only two IOs
  9. Automatic power-on reset

 

  • Peltier Module

Peltier is a  thermoelectric effect (TEE) device where thermal properties can be controlled using electrical signal.

  • Basically there are two effects they are :
  1. Peltier effect
  2. Seebeck effect

TE coolers, TE heaters and heat pumpers are all the devices that work on TEE and all these devices are referred to as the Peltier Effect. Peltier device is not a heat absorber. Rather it’s a heat driver. The heat that is driven out from the cooler side is accumulated on the hotter side of the device and it has to be debauched in one or the other way. Otherwise the device the device may tend to stop working and it may tend to increase the temperature at the cooler side which is practically not feasible.[Wiki]

  • Heat Sink

The heat dropper has to be taken as an essential part of the pettier device for cooling purpose. All its performance distinctiveness of the Peltier module change as the utility of the heat dropper temperature. Hence the ultimate heat droppers should have a capability of sponging in unlimited quantity of heat exclusive of increasing the device temperature. In general, we need to consider a heat dropper that can soak up the entire residual heat of the device and help in not increasing the temperature above the acceptable point. Hence in practice we can use a heat dropper that can increase the temperature of the device in the series of 5 to 15 ºC higher than the bearable temperature that is sensible.

  • Operating Voltage: Utmost 13.5V.
  • Voltage can be in both the directions. The only change is that the face that will rise in temperature or cool in temperature.
  • Rating: Utmost 4.4 amps
  • Power: Utmost 36 watts
  • Temperature change: Utmost 59ºC at the normal temperature of 30ºC and with no stack.
  • Number of p-n junctions: 127
  • Footprint: 4 cm x 4 cm
  • Thickness: 4mm
  • Weight: 28 grams
  • Module Factory Number: TEC1-12704
  • The ground of the Peltier module is connected to one contact of the relay. When the temperature sensor reaches the threshold value set say 30ºC then the sensor will trigger the MCU to supply power to the grove relay switch and hence completing the circuit and allowing the base current to flow and hence switching the Peltier module to start cooling inside the helmet and hence providing the comfortable temperature for the rider.

Design

Block Diagram

 

 

  • Intel Edison will be connected with a pelting module through transistor as a switch.
  • Peter is a temperature cooling solution that is driven by a 12v power supply. The supply will be given by a 12v battery pack. The ground of the poultice will be connected to one of the input of the grove relay. When the MCU provides supply to the relay and triggers it. This will activate pettier and trigger cooling.
  • MCU will keep monitoring temperature through Grove temperature measurement sensor. When the inside temperature is high, the poultice will be activated using the method mentioned in step2.
  • MCU will be integrated with Cloud through MQTT IoT gateway. Rider’s mobility will be integrated with the cloud using MQTT gateway. The mobile will keep on tracking the GPS data which will be sent back to Google cloud to obtain Civic Address for the latitude, longitude GPS data.
  • MCU will keep tracking of the impact through Grove vibration sensor. In case of an accident, the sensor will generate a signal which will trigger a notification.GPS civic address with this notification will be pushed to the cloud. This can then mitigate the notification to Facebook/Twitter or any other channel through IFTTT gateway.
  • Accelerometer will monitor the movement of the head. When the rider is looking at right/left for a long time, in helmet indicator can be triggered.    

Circuit Schematic

 

Sequence Diagram

Algorithm

    Actor Edison
participant Vibration
            loop
 (Till Ride Completes)
Vibration -> Edison: Vibration Value
participant MqTT
Activate MqTT
alt Vibration Value gt 1000
 Edison -> LCD : RED
 Edison -> Buzzer : ON
 Edison -> MqTT: Accident Message
else Normal
 Edison -> Edison: Keep Monitoring
end
Deactivate MqTT
Accelerometer -> Edison : (x,y,z)
alt x gt +5
 Edison -> Buzzer : ON
 Edison -> LeftIndicator: ON
else 
alt x lt -5
 Edison -> RightIndicator: ON
Edison -> Buzzer : ON
Else    Edison->RightIndicator: OFF
   Edison -> Buzzer : OFF
    end
 Edison -> LeftIndicator : OFF
 Edison -> Buzzer : OFF
 end
 TemperatureSensor -> Edison : Temparature
alt Temperature gt 40
Edison -> LCD : RED
Edison -> Relay_Peltier: ON
 Edison -> Buzzer : ON
else Normal
 Edison -> LCD : GREEN
 Edison -> Relay_Peltier: OFF
 Edison -> Buzzer: OFF
end
Edison -> LCD : Display Temperature
end

 

Using the code

Having understood the entire concept of design and the components, it is finally time to code our Intel Edison board. Recall that we need to develop code for :

  •  Accident Detection Using Vibration Sensor
  • Generate a Gmail Notification on Accident
  • Detect Left and Right Movement of the Head using Accelerometer
  • Trigger Left and Right Indicator using based on the accelerometer data
  • Measure temperature
  • Swicth on the Peltier when temperature crosses threshold
  • Turn off Peltier when temperature comes to normalcy
  • Display the data in LCD
  • Trigger a buzzer for certain interval upon an even occourance

Let us first look at the entire code which is divided into segments:

  //////////////////////////// 1. Accelerometer for Indication/////////
var digitalAccelerometer = require('jsupm_mma7660');

// Instantiate an MMA7660 on I2C bus 0
var myDigitalAccelerometer = new digitalAccelerometer.MMA7660(
          digitalAccelerometer.MMA7660_I2C_BUS, 
          digitalAccelerometer.MMA7660_DEFAULT_I2C_ADDR);

// place device in standby mode so we can write registers
myDigitalAccelerometer.setModeStandby();

// enable 64 samples per second
myDigitalAccelerometer.setSampleRate(digitalAccelerometer.MMA7660.AUTOSLEEP_64);

// place device into active mode
myDigitalAccelerometer.setModeActive();

var x, y, z;
x = digitalAccelerometer.new_intp();
y = digitalAccelerometer.new_intp();
z = digitalAccelerometer.new_intp();

var ax, ay, az;
ax = digitalAccelerometer.new_floatp();
ay = digitalAccelerometer.new_floatp();
az = digitalAccelerometer.new_floatp();

var outputStr;

var myInterval = setInterval(function()
{
  myDigitalAccelerometer.getRawValues(x, y, z);

  outputStr = "Raw values: x = " + digitalAccelerometer.intp_value(x) +
  " y = " + digitalAccelerometer.intp_value(y) +
  " z = " + digitalAccelerometer.intp_value(z);

 //-------------------- LEFT AND RIGHT For INDICATION-----------------------//
var X= digitalAccelerometer.intp_value(x);

if(X<0) //<- Left Condition
  {

    if(Math.abs(X)>5)
    {
     buzzPin.write(1);
     console.log("LEFT.................");
     lPin.write(1);   // Left Indicator On
     rPin.write(0);   // Right Indicator Off
    }
    else
    {
     buzzPin.write(0); // When Head is in left position but becoming straight, switch off the indicator
     lPin.write(0);
    }
  }
  if(X>0) // <- Right Condition
  {
    if(X>5)
    {
    rPin.write(1);
    lPin.write(0);
    buzzPin.write(1);
    console.log("RIGHT..........");
    }
    else
    {
   rPin.write(0);
  buzzPin.write(0);
    }
  
  }
}, 500); //<- Keep Measuring accelerometer in every 500ms
//--------------------------- Accelerometer Processing Ends Here----------------/

// round off output to match C example, which has 6 decimal places
function roundNum(num, decimalPlaces)
{
  var extraNum = (1 / (Math.pow(10, decimalPlaces) * 1000));
  return (Math.round((num + extraNum) 
    * (Math.pow(10, decimalPlaces))) / Math.pow(10, decimalPlaces));
}
//////////////////2. Mqtt Initialization  ////////////////////////////
var mraa=require('mraa');
var nodemailer = require('nodemailer');



//////////3.  Setting Gmail for package nodemailer/////////////

//var transporter = nodemailer.createTransport('smtps://gmail.com');
var smtpConfig = {
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL
    auth: {
        user: 'yourmailId@gmail.com',

        pass: 'your_gamil_password'
    }
};
var transporter = nodemailer.createTransport(smtpConfig);



var mailOptions = {
    from: '"Your Name"<yournames@gmail.com>', // sender address
    to: 'receiver1smail@gmail.com','receiver2smail@gmail.com'// list of receivers( your friend/relative)
    subject: 'Helmet Project Accident Notification', // Subject line
    text: 'Accident Happened ', // plaintext body
    html: '<b>Accident </b>' // html body
};

//////////////////////4. Sensors and Pin Initialization////////////////////////////////////////
var vibSensor=new mraa.Aio(1);
var tempPin = new mraa.Aio(0);
var buzzPin=new mraa.Gpio(7);
buzzPin.dir(mraa.DIR_OUT);
var fanPin=new mraa.Gpio(6);
fanPin.dir(mraa.DIR_OUT);
var lPin=new mraa.Gpio(4);
var rPin=new mraa.Gpio(2);
rPin.dir(mraa.DIR_OUT);
lPin.dir(mraa.DIR_OUT);

fanPin.write(0);//Peltier Relay
//////////////////////////////////////////////////////////////////////

var at=0; //accident timer;
var mqtt    = require('mqtt');
var client  = mqtt.connect('mqtt://iot.eclipse.org');



var LCD = require('jsupm_i2clcd');
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
var B=3975;   

Loop();
var avgTemp=0;
var n=1;
function Loop()//<--- This function continuesly runs, detects accident notifies
{



//------------------------- 5. Read Temperature-----------------------------

var tempValue=tempPin.read();
var resistance=(1023.0-tempValue)*10000.0/tempValue; //get the resistance of the sensor;
var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;//convert to temperature via datasheet
temperature=Math.floor((temperature )* 100) / 100;
//console.log(temperature);
avgTemp=avgTemp+temperature;
n=n+1;
//----------------------------------------------------------------


//---------------------- 6. Vibration sensor for Accident detection----------------
var vibVal=vibSensor.read();


//console.log("\n==========\nAccident Trigger: "+vibVal+"\n==========\n");
if(vibVal>800 ) // <- Threshold for Accident
{
console.log("\n==========\nAccident Trigger: "+vibVal+"\n==========\n");
myLCD.setColor(255,0,0);
myLCD.setCursor(1,0);
myLCD.write("Accident");
buzzPin.write(1);
at=10;
client.publish('rupam/Accident', 'Accident Happened....'); //<- Mqtt notification on Accident

transporter.sendMail(mailOptions, function(error, info){
    if(error){
        return console.log(error);
    }
    console.log('Message sent: ' + info.response);
}); //<-- Gmail Notification on Accident
myLCD.setColor(0,255,0);
}

//--------------------------- End of Accident Module--------------------------------
if(n>=10)
{
myLCD.clear();
 myLCD.setCursor(0,0);
myLCD.write("Temp: ");
//console.log(at);
if(at==0)
{
buzzPin.write(0);
myLCD.setColor(0,255,0);
}
else
{
if(at>0)
{
myLCD.setColor(255,0,0);
at--;
}
}
myLCD.setCursor(0,6);

//myLCD.write(""+avgTemp);
//myLCD.setCursor(1,0);

avgTemp=avgTemp/n;
avgTemp=Math.floor((avgTemp )* 100) / 100;
myLCD.write(""+avgTemp);
myLCD.setCursor(1,0);

//-------------------------- 7. Controlling Peltier--------------------------------
//console.log("Pwm Duty cycle="+roundNum(fanSpeed*100,2));

if(avgTemp>=30) // <- Above 30'c cooling will start
{
at=10; // at will be decremented at every Loop call. When it is 0, the buzzer is Off. So buzzer doesn't
// go on for ever. Only a short 2 sec buzzing

fanPin.write(1);
myLCD.setCursor(1,0);
myLCD.setColor(255,0,0);
myLCD.write("HOT");
}
else
{
fanPin.write(0); //<-- Cooling stops once temperature is Normal
myLCD.setColor(0,255,0);
myLCD.setCursor(1,0);
myLCD.write("Normal");
}
//---------------------------------- End of Peltier Control Part--------------------------


n=1;
console.log("Temperature="+avgTemp+" 'C");
avgTemp=0;
}
setTimeout(Loop,1000);
} 
//-------------------- End of Loop--------------------------------
<rupam.iics@gmail.com>
</rupam.iics@gmail.com>

Results

 

Vibration Sensor

 

Temperature Sensor

 

LED indication for temperature

Hot                                                                                       Normal

Accelerometer Based Indicator trigger

  Left Indicator                                                                      Right Indicator

Co-Author wearing the smart helmet

 

Conclusion

This is our effort towards creating better and smarter helmets that are connected to cloud. The helmet can  improved with better battery and power unit design to make it more sleek. We can add a GPS sensor or can use an Android companion app to collect corrent GPS address to notify the relative about an accident scenerio along with the exact address of the accident. We plan to continue to develop this project. Do let us know about your thoughts and valuable suggestion.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Authors

Grasshopper.iics
CEO Integrated Ideas
India India
gasshopper.iics is a group of like minded programmers and learners in codeproject. The basic objective is to keep in touch and be notified while a member contributes an article, to check out with technology and share what we know. We are the "students" of codeproject.

This group is managed by Rupam Das, an active author here. Other Notable members include Ranjan who extends his helping hands to invaluable number of authors in their articles and writes some great articles himself.

Rupam Das is mentor of Grasshopper Network,founder and CEO of Integrated Ideas Consultancy Services, a research consultancy firm in India. He has been part of projects in several technologies including Matlab, C#, Android, OpenCV, Drupal, Omnet++, legacy C, vb, gcc, NS-2, Arduino, Raspberry-PI. Off late he has made peace with the fact that he loves C# more than anything else but is still struck in legacy style of coding.
Rupam loves algorithm and prefers Image processing, Artificial Intelligence and Bio-medical Engineering over other technologies.

He is frustrated with his poor writing and "grammer" skills but happy that coding polishes these frustrations.
Group type: Organisation

116 members


Abhishek Nandy
Software Developer
India India
I am into software Development for less than a year and i have participated in 2 contests here at Codeproject:-Intel App Innovation Contest 2012 and Windows Azure Developer Challenge and been finalist at App Innovation contest App Submission award winner as well won two spot prizes for Azure Developer Challenge.I am also a finalist at Intel Perceptual Challenge Stage 2 with 6 entries nominated.I also won 2nd prize for Ultrabook article contest from CodeProject
Link:-
http://www.codeproject.com/Articles/523105/Ultrabook-Development-My-Way

Microsoft MVA Fast Track Challenge Global Winner.
Ocutag App Challenge 2013 Finalist.

My work at Intel AppUp Store:-

UltraSensors:-
http://www.appup.com/app-details/ultrasensors
UltraKnowHow:-
http://www.appup.com/app-details/ultraknowhow

You may also be interested in...

Pro

Comments and Discussions

 
GeneralMy Vote 5 Pin
Chrris Dale7-Aug-16 13:24
memberChrris Dale7-Aug-16 13:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web04 | 2.8.190306.1 | Last Updated 7 Aug 2016
Article Copyright 2016 by Grasshopper.iics, Abhishek Nandy
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid