promote Pwm functions to a new class that overloads Pin, alter use of Pwm in Temperat...
[clinton/Smoothieware.git] / src / libs / Pin.cpp
1 #include "Pin.h"
2
3 Pin::Pin(){}
4
5 Pin* Pin::from_string(std::string value)
6 {
7 LPC_GPIO_TypeDef* gpios[5] ={LPC_GPIO0,LPC_GPIO1,LPC_GPIO2,LPC_GPIO3,LPC_GPIO4};
8 if ( value.find_first_of("n")!=std::string::npos ? true : false )
9 {
10 this->port_number = 0;
11 this->port = gpios[(unsigned int) this->port_number];
12 this->inverting = false;
13 this->pin = 255;
14 }
15 else
16 {
17 this->port_number = atoi(value.substr(0,1).c_str());
18 this->port = gpios[(unsigned int) this->port_number];
19 this->inverting = ( value.find_first_of("!")!=std::string::npos ? true : false );
20 this->pin = atoi( value.substr(2, value.size()-2-(this->inverting?1:0)).c_str() );
21 this->port->FIOMASK &= ~(1 << this->pin);
22 }
23 return this;
24 }
25
26 Pin* Pin::as_open_drain()
27 {
28 if (this->pin >= 32) return this;
29 if( this->port_number == 0 ){ LPC_PINCON->PINMODE_OD0 |= (1<<this->pin); }
30 if( this->port_number == 1 ){ LPC_PINCON->PINMODE_OD1 |= (1<<this->pin); }
31 if( this->port_number == 2 ){ LPC_PINCON->PINMODE_OD2 |= (1<<this->pin); }
32 if( this->port_number == 3 ){ LPC_PINCON->PINMODE_OD3 |= (1<<this->pin); }
33 if( this->port_number == 4 ){ LPC_PINCON->PINMODE_OD4 |= (1<<this->pin); }
34 return this;
35 }
36
37 Pin* Pin::pull_up()
38 {
39 if (this->pin >= 32) return this;
40 // Set the two bits for this pin as 00
41 if( this->port_number == 0 && this->pin < 16 ){ LPC_PINCON->PINMODE0 &= ~(3<<( this->pin *2)); }
42 if( this->port_number == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 &= ~(3<<((this->pin-16)*2)); }
43 if( this->port_number == 1 && this->pin < 16 ){ LPC_PINCON->PINMODE2 &= ~(3<<( this->pin *2)); }
44 if( this->port_number == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 &= ~(3<<((this->pin-16)*2)); }
45 if( this->port_number == 2 && this->pin < 16 ){ LPC_PINCON->PINMODE4 &= ~(3<<( this->pin *2)); }
46 if( this->port_number == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 &= ~(3<<((this->pin-16)*2)); }
47 if( this->port_number == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 &= ~(3<<((this->pin-16)*2)); }
48 return this;
49 }
50
51 Pin* Pin::pull_down()
52 {
53 if (this->pin >= 32) return this;
54 // Set the two bits for this pin as 11
55 if( this->port_number == 0 && this->pin < 16 ){ LPC_PINCON->PINMODE0 |= (3<<( this->pin *2)); }
56 if( this->port_number == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 |= (3<<((this->pin-16)*2)); }
57 if( this->port_number == 1 && this->pin < 16 ){ LPC_PINCON->PINMODE2 |= (3<<( this->pin *2)); }
58 if( this->port_number == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 |= (3<<((this->pin-16)*2)); }
59 if( this->port_number == 2 && this->pin < 16 ){ LPC_PINCON->PINMODE4 |= (3<<( this->pin *2)); }
60 if( this->port_number == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 |= (3<<((this->pin-16)*2)); }
61 if( this->port_number == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 |= (3<<((this->pin-16)*2)); }
62 return this;
63 }