         hookTimeOut = millis();
         hookState = newHookState;
         Serial.print(hookState ? OFF_HOOK : ON_HOOK);
-    }    
+    }
+    
+    if (ringingState) {
+        switch (ringingState) {
+            case 1:
+                if ((millis() - ringingTimmer) > RING_ON_TIME) {
+                    ringingTimmer = millis();
+                    analogWrite(RINGER, 0);
+                    ringingState = 0;
+                }
+                break;
+                
+            case 0:
+                if ((millis() - ringingTimmer) > RING_OFF_TIME) {
+                    ringingTimmer = millis();
+                    analogWrite(RINGER, 128);
+                    ringingState = 1;
+                }
+                break;
+                
+            default:
+                break;
+        }
+    }
 }
 
 void hook()

uint8_t hookState = 0;
uint32_t hookTimeOut = 0;
uint8_t followState = 1;


void setup()

#define RINGER 11

#define HOOK_TIMEOUT 5
#define RING_ON_TIME 400
#define RING_OFF_TIME 200


int8_t incoming;
volatile uint8_t newHookState = 0;
