FongBluetooth01 calling FongInt01 tested OK

***** FongBlueTooth01 – Test Bluetooth Module – 2014sep02hkt2212 *****

0 = Power reset, …
1 = Set All modules AT Key HIGH, …
2 = Set All modules AT Key LOW, …
3 = Ask All modules if OK, …
4 = Ask All modules address, …
5 = Set All modules slave, …
6 = Set All modules master, …
7 = Set Modules 0~3 master, 4~6 slave …
8 = Ask All modules role, …
9 = Ask All modules state, …
a = Set All modules name tlfong01, …
b = Ask All modules name, …
c = Read all analog pins, …
d = Test 4 external interrupts, …

t = Test Dio Pins, …
u = Test Aio Pins, …
v = Test individual module parameters, …
w = Help.

x = eXit menu.

Enter you selection number now, …

*** Command = d
Start testing interrupt, … ***

Interrupt = 0 Count = 1
Interrupt = 0 Count = 2
Interrupt = 1 Count = 1
Interrupt = 1 Count = 2
Interrupt = 2 Count = 1
Interrupt = 2 Count = 2
Interrupt = 3 Count = 1
Interrupt = 3 Count = 2
Interrupt = 2 Count = 3
Interrupt = 2 Count = 4
Interrupt = 3 Count = 3
Interrupt = 2 Count = 5
Interrupt = 2 Count = 6
Interrupt = 2 Count = 7
Interrupt = 2 Count = 8
Interrupt = 2 Count = 9
Interrupt = 2 Count = 10

*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***

// *** FongBlueTooth01.cpp *******

// ********************************************************************
// Library – FongBlueTooth01b
// Author – TL Fong
// Date – 2014sep02hkt1703
// License – Public domain
// ********************************************************************

// *** Includes ***
#include “HardwareSerial.h”
#include “SoftwareSerial.h”
#include “FongBuzzer01.h”
#include <FongSerialPort01>
#include <FongUart01.h>
#include <FongBlueTooth01.h>
#include <FongDio01.h>
#include <FongAio01.h>

// *** Constructors ***

FongBlueTooth01::FongBlueTooth01(FongBuzzer01 fbuz, FongUart01 *fut, \
FongDio01 *fdio, FongAio01 *faio, \
FongIsr01 *fisr, FongInt01 \
fint, int testNum)
{
_fbuz = fbuz;
_fut = fut;
_fdio = fdio;
_faio = faio;
_fisr = fisr;
_fint = fint;
setupBlueToothConfig(testNum);
_fdio->setDioPinLow(7);
}

// *** Functions ***

void FongBlueTooth01::testBlueTooth(int testNum)
{
int atCommandNum;
int blueToothModuleType;
int serialType;
int portNumber;
int printCount;
int moduleNum;
int moduleCount;
char charCommand = ‘h';
String atCommand;
int dioPinNum;

Serial.print(“\n***** FongBlueTooth01 – Test Bluetooth Module – 2014sep02hkt2212 *****”);
while (charCommand != ‘x’)
{
Serial.print(“\n\n0 = Power reset, …”);
Serial.print(“\n1 = Set All modules AT Key HIGH, …”);
Serial.print(“\n2 = Set All modules AT Key LOW, …”);
Serial.print(“\n3 = Ask All modules if OK, …”);
Serial.print(“\n4 = Ask All modules address, …”);
Serial.print(“\n5 = Set All modules slave, …”);
Serial.print(“\n6 = Set All modules master, …”);
Serial.print(“\n7 = Set Modules 0~3 master, 4~6 slave …”);
Serial.print(“\n8 = Ask All modules role, …”);
Serial.print(“\n9 = Ask All modules state, …”);
Serial.print(“\na = Set All modules name tlfong01, …”);
Serial.print(“\nb = Ask All modules name, …”);
Serial.print(“\nc = Read all analog pins, …”);
Serial.print(“\nd = Test 4 external interrupts, …”);

Serial.print(“\n\nt = Test Dio Pins, …”);
Serial.print(“\nu = Test Aio Pins, …”);
Serial.print(“\nv = Test individual module parameters, …”);
Serial.print(“\nw = Help.”);
Serial.print(“\n\nx = eXit menu.”);
Serial.print(“\n\nEnter you selection number now, …\n”);

while (Serial.available() == false)
{
}
charCommand = Serial.read();
Serial.print(“\n*** Command = “);
Serial.write(charCommand);
Serial.print(” ***\n”);

switch (charCommand)
{
case ‘0’:
powerReset();
break;
case ‘1’:
setAllModulesAtKeyHigh();
break;
case ‘2’:
setAllModulesAtKeyLow();
break;
case ‘3’:
execAtCommandAllModules(AskIfOk);
break;
case ‘4’:
execAtCommandAllModules(AskAddress);
break;
case ‘5’:
execAtCommandAllModules(SetSlaveRole);
break;
case ‘6’:
execAtCommandAllModules(SetMasterRole);
break;
case ‘7’:
setAllModulesAtKeyLow();
powerReset();
delay(1000);
setAllModulesAtKeyHigh();
// execAtCommand(0, SetMasterRole); // not working!!!
execAtCommand(0, 1, 1, commandStringArray, SetMasterRole);
execAtCommand(1, SetMasterRole);
execAtCommand(2, SetMasterRole);
execAtCommand(3, SetMasterRole);
execAtCommand(4, SetSlaveRole);
execAtCommand(5, SetSlaveRole);
execAtCommand(6, SetSlaveRole);
break;
case ‘8’:
execAtCommandAllModules(AskRole);
break;
case ‘9’:
execAtCommandAllModules(AskState);
break;
case ‘a':
execAtCommandAllModules(SetNameTlfong01);
break;
case ‘b':
execAtCommandAllModules(AskName);
break;
case ‘c':
_faio->analogReadAllAioPins();
_faio->printAioConfigDataStruct();
break;
case ‘d':
_fint->testInterrupt(testNum);
break;
case ‘t':
_fdio->testDio(testNum);
break;
case ‘u':
_faio->testAio(testNum);
break;
case ‘v':
blueToothModuleType = askBlueToothModuleType();
setupCommandStringArray(blueToothModuleType);
serialType = askSerialType();
portNumber = askPortNumber();
atCommandNum = askAtCommandNum();
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum);
break;
case ‘w': // *** Help ***
Serial.print(“\n\nSorry, Help not yet available, …\n”);
break;
}
if (charCommand == ‘x’)
break;
}
Serial.print(“\nEnd of program.\n\n”);
}

void FongBlueTooth01::setupBlueToothConfig(int testNum)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};
enum DioPinNum {DioPin0, DioPin1, DioPin2, DioPin3, DioPin4, DioPin5, DioPin6, DioPin7};

int moduleNum;
int ModuleTypeIndex = 0;
int SerialTypeIndex = 1;
int PortNumberIndex = 2;

moduleNum = 0;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin0;

moduleNum = 1;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin1;

moduleNum = 2;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin2;

moduleNum = 3;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port4;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin3;

switch (testNum)
{
case 0:
moduleNum = 4;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin4;

moduleNum = 5;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin5;

moduleNum = 6;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin6;

break;

case 1:
moduleNum = 4;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin4;

moduleNum = 5;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin5;

moduleNum = 6;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin6;

moduleNum = 7;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin7;

break;
}
}

void FongBlueTooth01::setupCommandStringArray(int blueToothModuleType)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};

switch (blueToothModuleType)
{
case WaveSenHm05:
commandStringArray[AskIfOk] = “AT\r\n”;
commandStringArray[AskVersion] = “AT+VERSION?\r\n”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0\r\n”;
commandStringArray[SetMasterRole] = “AT+ROLE=1\r\n”;
commandStringArray[AskRole] = “AT+ROLE?\r\n”;
commandStringArray[AskName] = “AT+NAME?\r\n”;
commandStringArray[SetNameHc05] = “AT+NAME=Hc-05\r\n”;
commandStringArray[SetNameTlfong01] = “AT+NAME=tlfong01\r\n”;
commandStringArray[AskCmode] = “AT+CMODE?\r\n”;
commandStringArray[SetCmodeAnyAddress] = “AT+CMODE=1\r\n”;
commandStringArray[SetCmodeSpecifiedAddress] = “AT+CMODE=0\r\n”;
commandStringArray[AskState] = “AT+STATE?\r\n”;
commandStringArray[AskPassWord] = “AT+PSWD?\r\n”;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234\r\n”;
commandStringArray[SetPassWord0001] = “AT+PSWD=0001\r\n”;
commandStringArray[AskAddress] = “AT+ADDR?\r\n”;
commandStringArray[AskBindAddress] = “AT+BIND?\r\n”;
commandStringArray[SetBindAddress123456abcdef] = “AT+BIND=1234,56,abcdef\r\n”;
commandStringArray[AskRemoteName000272od2224] = “AT+RNAME?0002,72,od2224\r\n”;
commandStringArray[AskPio89] = “AT+POLAR?\r\n”;
commandStringArray[SetPio8900] = “AT+POLAR=0,0\r\n”;
commandStringArray[SetPio8911] = “AT+POLAR=1,1\r\n”;
commandStringArray[AskDevice] = “AT+INQ\r\n”;
commandStringArray[ConnectDevice123456abcdef] = “AT+LINK=1234,56,abcdef\r\n”;
commandStringArray[DisconnectDevice] = “AT+DISC\r\n”;
commandStringArray[Reset] = “AT+RESET\r\n”;
commandStringArray[SetAccessCode9e8b3f] = “AT+IAC=9e8b3f\r\n”;
commandStringArray[AskAccessCode] = “AT+IAC?\r\n”;
commandStringArray[AskAccessCode] = “AT+IAC\r\n”;
commandStringArray[AskInquiryAccessCode] = “AT+INQM?\r\n”;
commandStringArray[SetInquiryAccessCode1948] = “AT+INQM=1,9,48\r\n”;
commandStringArray[CheckPair123456abcdef] = “AT+FSAD=1234,56,abcdef\r\n”;
commandStringArray[SetPair123456abcdef20] = “AT+PAIR=1234,56,abcdef,20\r\n”;
commandStringArray[AskSerialParameter] = “AT+UART?\r\n”;
commandStringArray[SetSerialParameter9600n81] =”AT+UART=9600,0,0\r\n”;
commandStringArray[SetDefaultParameter] = “AT+ORGL\r\n”;
break;

case CduinoHm09:
commandStringArray[AskIfOk] = “AT”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0″;
commandStringArray[SetMasterRole] = “AT+ROLE=1″;
commandStringArray[AskRole] = “AT+ROLE?”;
commandStringArray[SetPio8LedOffPio9LedOn] = “AT+POLAR=0,1″;
commandStringArray[SetPio8LedOnPio9LedOff] = “AT+POLAR=0,1″;
commandStringArray[AskPio8Pio9] = “AT+POLAR=?”;
commandStringArray[SetConnectAnyAddress] = “AT+CMODE=1″;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234″;
commandStringArray[AskPassWord] = “AT+PIN?”;
commandStringArray[AskState] = “AT+STATE?”;
commandStringArray[AskVersion] = “AT+VERSION?”;
commandStringArray[AskName] = “AT+NAME?”;
break;

case BolutekMdBc04:
commandStringArray[AskIfOk] = “AT\r\n”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0\r\n”;
commandStringArray[SetMasterRole] = “AT+ROLE=1\r\n”;
commandStringArray[AskRole] = “AT+ROLE\r\n”;
commandStringArray[SetPio8LedOffPio9LedOn] = “AT+POLAR=0,1\r\n”;
commandStringArray[SetPio8LedOnPio9LedOff] = “AT+POLAR=0,1\r\n”;
commandStringArray[AskPio8Pio9] = “AT+POLAR=\r\n”;
commandStringArray[SetConnectAnyAddress] = “AT+CMODE=1\r\n”;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234\r\n”;
commandStringArray[AskPassWord] = “AT+PIN\r\n”;
commandStringArray[AskState] = “AT+STATE\r\n”;
commandStringArray[AskVersion] = “AT+VERSION\r\n”;
commandStringArray[AskName] = “AT+NAME\r\n”;
break;
}
}

int FongBlueTooth01::askAtCommandNum()
{
int atCommandNum;

enum atCommandNum {AskIfOk, \
AskVersion, \
AskRole, \
SetSlaveRole, \
SetMasterRole, \
AskPassWord, \
SetPassWord1234, \
SetPassWord0001, \
AskName, \
SetNameHc05,\
SetNameTlfong01,\
AskCmode, \
SetCmodeAnyAddress, \
SetCmodeSpecifiedAddress, \
AskState, \
AskAddress, \
AskBindAddress, \
SetBindAddress123456abcdef,\
AskRemoteName000272od2224, \
AskPio89, \
SetPio8900, \
SetPio8911, \
AskDevice, \
ConnectDevice123456abcdef, \
DisconnectDevice, \
Reset, \
AskAccessCode, \
SetAccessCode9e8b3f, \
AskInquiryAccessCode, \
SetInquiryAccessCode1948, \
SetPair123456abcdef20, \
CheckPair123456abcdef, \
AskSerialParameter, \
SetSerialParameter9600n81, \
SetDefaultParameter, \
SetPio8LedOffPio9LedOn, SetPio8LedOnPio9LedOff, AskPio8Pio9, \
SetConnectAnyAddress, SetConnectSpeficiedAddress, AskConnectAddress};

Serial.print(“\n*** Select AT Command Number, … ***”);
Serial.print(“\n 0 = Ask OK”);
Serial.print(“\n 1 = Ask Version”);
Serial.print(“\n 2 = Ask Role”);
Serial.print(“\n 3 = Set Slave Role”);
Serial.print(“\n 4 = Set Master Role”);
Serial.print(“\n 5 = Ask Pass Word”);
Serial.print(“\n 6 = Set Pass Word = 1234″);
Serial.print(“\n 7 = Ask Address”);
Serial.print(“\nEnter AT command number now, … \n”);

while (Serial.available() == false)
{
}
atCommandNum = Serial.read();

switch (atCommandNum)
{
case ‘0’:
return AskIfOk;
break;
case ‘1’:
return AskVersion;
break;
case ‘2’:
return AskRole;
break;
case ‘3’:
return SetSlaveRole;
break;
case ‘4’:
return SetMasterRole;
break;
case ‘5’:
return AskPassWord;
break;
case ‘6’:
return SetPassWord1234;
break;
case ‘7’:
return AskAddress;
break;
}
}

int FongBlueTooth01::askPortNumber()
{
int portNumber;

Serial.print(“\n*** Select Port Number, … ***”);
Serial.print(“\n 1 = Port 1″);
Serial.print(“\n 2 = Port 2″);
Serial.print(“\n 3 = Port 3″);
Serial.print(“\n 4 = Port 4″);
Serial.print(“\nEnter serial type number now, … \n”);

while (Serial.available() == false)
{
}
portNumber = Serial.read();

switch (portNumber)
{
case ‘1’:
return 1;
break;
case ‘2’:
return 2;
break;
case ‘3’:
return 3;
break;
case ‘4’:
return 4;
break;
}
}

int FongBlueTooth01::askSerialType()
{
int serialType;

Serial.print(“\n*** Select Serial Type, … ***”);
Serial.print(“\n 0 = Hardware serial”);
Serial.print(“\n 1 = Software serial”);
Serial.print(“\nEnter serial type number now, … \n”);

while (Serial.available() == false)
{
}
serialType = Serial.read();

switch (serialType)
{
case ‘0’:
return 0;
break;
case ‘1’:
return 1;
break;
}
}

int FongBlueTooth01::askBlueToothModuleType()
{
int blueToothModuleType;
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};

Serial.print(“\n*** Select BlueTooth Module, … ***”);
Serial.print(“\n 0 = WaveSenHm05/GzHc05 (Master/Slave)”);
Serial.print(“\n 1 = WaveSenHm06/CduinoHm09 (Slave) “);
Serial.print(“\n 2 = BolutekMdBc04 (Master/Slave)”);
Serial.print(“\nEnter module number now, … \n”);

while (Serial.available() == false)
{
}
blueToothModuleType = Serial.read();

switch (blueToothModuleType)
{
case ‘0’:
return 0;
break;
case ‘1’:
return 1;
break;
case ‘2’:
return 2;
break;
}
}

void FongBlueTooth01::execAtCommand(int moduleNum, int atCommandNum)
{
enum blueToothConfigArrayIndex {ModuleTypeIndex, SerialTypeIndex, PortNumberIndex};
int blueToothModuleType;
int serialType;
int portNumber;
int dioPinNum;

blueToothModuleType = blueToothConfig[moduleNum][ModuleTypeIndex];
setupCommandStringArray(blueToothModuleType);
serialType = blueToothConfig[moduleNum][SerialTypeIndex];
portNumber = blueToothConfig[moduleNum][PortNumberIndex];
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum);
}

void FongBlueTooth01::execAtCommand(int moduleNum, int atCommandNum1, int atCommandNum2, \
int atCommandNum3)
{
enum blueToothConfigArrayIndex {ModuleTypeIndex, SerialTypeIndex, PortNumberIndex};
int blueToothModuleType;
int serialType;
int portNumber;

blueToothModuleType = blueToothConfig[moduleNum][ModuleTypeIndex];
setupCommandStringArray(blueToothModuleType);
serialType = blueToothConfig[moduleNum][SerialTypeIndex];
portNumber = blueToothConfig[moduleNum][PortNumberIndex];

execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum1);
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum2);
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum3);
}

void FongBlueTooth01::execAtCommand(int blueToothModuleType, \
int serialType, int portNumber, \
char* atCommandStringArray[], \
int atCommandNum)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};

String atCommandString;
atCommandString = atCommandStringArray[atCommandNum];

Serial.print(“\n*** Executing BlueTooth AT Command ***”);

switch (blueToothModuleType)
{
case WaveSenHm05:
Serial.print(“\nModule Type = WaveSenHM05″);
break;
case CduinoHm09:
Serial.print(“\nModule Type = CduinoHm09″);
break;
}

switch (serialType)
{
case HardwareSerial:
Serial.print(“\nSerial Type = Hardware”);
Serial.print(“\nPort Number = “);
Serial.print(portNumber);
Serial.print(“\n”);
(*_fut).hardwareSerialWriteRead(portNumber, atCommandString);
break;

case SoftwareSerial:
Serial.print(“\nSerial Type = Software”);
Serial.print(“\nPort Number = “);
Serial.print(portNumber);
Serial.print(“\n”);
(*_fut).softwareSerialWriteRead(portNumber, atCommandString);;
break;
}
}

void FongBlueTooth01::setModuleAtKeyHigh(int moduleNum)
{
int dioPinNum;
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinHigh(dioPinNum);
}

void FongBlueTooth01::setModuleAtKeyLow(int moduleNum)
{
int dioPinNum;
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinLow(dioPinNum);
}

// *** To move !! ***

void FongBlueTooth01::testRepeatPrintChar08(char* atCommandStringArray[], \
int atCommandNum, \
int serialType, int portNumber, \
int printCount)
{
enum SerialType {HardwareSerial = 0, SoftwareSerial, SIZE_OF_SERIAL_PORT_TYPE_ENUM};
String atCommandString;
atCommandString = atCommandStringArray[atCommandNum];

Serial.print(“\nRepeat printing character, …”);
int i;

switch (serialType)
{
case HardwareSerial:
for (i = 0; i < printCount; i++)
{
(*_fut).hardwareWriteString(portNumber, atCommandString);
}
break;

case SoftwareSerial:
for (i = 0; i < printCount; i++)
{
(*_fut).softwareWriteString(portNumber, atCommandString);
}
break;
}
}

void FongBlueTooth01::powerReset()
{
_fdio->setDioPinHigh(PowerPin);
delay(500);
_fdio->setDioPinLow(PowerPin);
}

void FongBlueTooth01::setAllModulesAtKeyHigh()
{
int moduleNum;
int dioPinNum;
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinHigh(dioPinNum);
}
}

void FongBlueTooth01::setAllModulesAtKeyLow()
{
int moduleNum;
int dioPinNum;
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinLow(dioPinNum);
}
}

void FongBlueTooth01::execAtCommandAllModules(int atCommandNum)
{
int moduleNum;
setAllModulesAtKeyLow();
powerReset();
delay(1000);
setAllModulesAtKeyHigh();
execAtCommand(0, 1, 1, commandStringArray, atCommandNum);
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
execAtCommand(moduleNum, atCommandNum);
}
}

void FongBlueTooth01::testInterrupt(int testNum)
{
handleInterrupts(_fisr);
}

void FongBlueTooth01::handleInterrupts(FongIsr01 *fisr)
{
Serial.println(“\n\n *** Start testing interrupt, … ***”);
int interruptCount[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int i;
while (true)
{
for (i = 0; i < 7; i++)
if (fisr->globalInterruptFlagArray[i] == InterruptOn)
{
interruptCount[i]++;
Serial.print(“\n Interrupt = “);
Serial.print(i);
Serial.print(” Count = “);
Serial.print(interruptCount[i]);
if (interruptCount[i] > 9)
break; // exit for loop
delay(200); // debouncing 200 mS
noInterrupts(); // disable interrupt
fisr->globalInterruptFlagArray[i] = InterruptOff;
interrupts(); // restart interrupt
}
if (interruptCount[i] > 9)
break; // exit while loop
}
Serial.println(“\n\n*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***\n\n\n”);
while (true) {}; // loop forever
}

// *** End ***

// *** FongInt01.cpp *******

// ********************************************************************
// Library – FongInt01b
// Author – TL Fong
// Date – 2014sep02hkt2109
// License – Public domain
// ********************************************************************

#include <FongInt01.h>

// *** Constructors ***

FongInt01::FongInt01(FongIsr01 *fisr, int testNum)
{
_fisr = fisr;
setupPinChangeInterruptArduinoPins();
// handleInterrupts(_fisr);
}

void FongInt01::setupPinChangeInterruptArduinoPins()
{
// pinMode(ledPin, OUTPUT);
// pinMode(PcIntPin0, INPUT);
// pinMode(PcIntPin1, INPUT);
// pinMode(PcIntPin2, INPUT);
}

void FongInt01::testInterrupt(int testNum)
{
handleInterrupts(_fisr);
}

void FongInt01::handleInterrupts(FongIsr01 *fisr)
{
Serial.begin(9600);
Serial.println(“*** Start testing interrupt, … ***”);
int interruptCount[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int i;
while (true)
{
for (i = 0; i < 7; i++)
if (fisr->globalInterruptFlagArray[i] == InterruptOn)
{
interruptCount[i]++;
Serial.print(“\n Interrupt = “);
Serial.print(i);
Serial.print(” Count = “);
Serial.print(interruptCount[i]);
if (interruptCount[i] > 9)
break; // exit for loop
delay(200); // debouncing 200 mS
noInterrupts(); // disable interrupt
fisr->globalInterruptFlagArray[i] = InterruptOff;
interrupts(); // restart interrupt
}
if (interruptCount[i] > 9)
break; // exit while loop
}
Serial.println(“\n\n*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***\n\n\n”);
while (true) {}; // loop forever
}

// *** End ***

Leave a comment

Filed under Uncategorized

The double dilemma dealt to Hong Kong democrats – David Pilling

The double dilemma dealt to Hong Kong democrats – David Pilling, FT 2004Sep01

http://blogs.ft.com/the-world/2014/09/the-double-dilemma-dealt-to-hong-kongs-democrats/

Henry Ford is supposed to have said that his customers could choose any colour of car they wanted “so long as it’s black”. On Sunday night, the Chinese government ended months of speculation about elections for Hong Kong’s chief executive, the city’s equivalent of mayor, by declaring that Hongkongers could vote for anyone they liked – so long as they are red.

In more prosaic language, what the National People’s Congress actually said was that candidates for the 2017 election must be backed by at least 50 per cent of a 1,200-member nominating committee. That committee, which is elected by some 250,000 individual and corporate voters, is largely pro-Beijing in make-up. The ruling thus guarantees that candidates deemed antagonistic to Beijing or the Chinese Communist party will fall at the first hurdle. Only those that “love China” need apply. Candidates who make it through the nominating committee will then go on to an election determined by universal suffrage, or one person, one vote.

Theoretically, at least, Beijing could have given more ground. It might, for example, have said that candidates with 30 per cent approval from the nominating committee could stand. It could also have ruled that the composition of the nominating committee itself be widened so as better to reflect the make-up of Hong Kong’s people. It chose neither.

Beijing could have taken a bigger gamble. After all, it has the final say in approving the Hong Kong chief executive. In the last instance it could have vetoed Hongkongers’ choice – although that could, of course, have sparked a political crisis. However, that’s a moot point. In practice, as many have pointed out, Hong Kong’s keenly pragmatic electorate is very unlikely to jeopardise the city’s prosperity by electing anyone openly hostile to Beijing.

Beijing has, nonetheless, been rattled by radical talk from Hong Kong. Sunday’s ruling presents those pushing for more genuine democracy with two dilemmas. The first is whether legislators belonging to the so-called Pan-Democrats should vote down Beijing’s proposals. If they all vote No, that would be enough to scupper the electoral reform plan, which needs a two-thirds majority to pass through Hong Kong’s mini-parliament. In that case, there would be no universal suffrage and the 2017 election would be conducted under present rules. Beijing has offered democrats a Hobson’s choice between an unacceptable option – or nothing.

The second dilemma confronts members of Occupy Central, a loose coalition of pro-democracy activists who have threatened a campaign of civil disobedience if rules for universal suffrage fail to meet what they deem to be international standards. Their threats to bring the business district to a standstill have been brusquely rejected as illegal by Beijing. They have also antagonised more moderate Hongkongers who worry that unrest – even violence – on the streets of Hong Kong could undermine the city’s position as an international financial centre.

Occupy Central did not take to the streets in large numbers on Monday. Benny Tai, one of its organisers, says it will gradually build up the level of protests in coming weeks. Still, some pro-democracy activists fear that momentum may have already been lost.

It is now crystal-clear – if it wasn’t before – that Beijing is only prepared to indulge Hong Kong so much. It is in Beijing’s interest to maintain the framework of “one country, two systems” agreed with the British at handover in 1997. To destroy that would be to risk severe international criticism as well as Hong Kong’s status as financial centre – not to mention a convenient place to park small fortunes made on the mainland. The “two systems” bit of the equation is supposed to give Hong Kong a “high degree of autonomy”. But in case anyone was in doubt, “two systems” is always trumped by “one country”.

.END

Leave a comment

Filed under Uncategorized

FongBlueTooth01 + FongIsr01 refactoring notes

// *** fongTest01Example_2014sep0104 ****

// ********************************************************************
// Program – FongTest01
// Purpose – Testing external and pin change interrupts
// Author – tlfong01.com
// Date – 2014sep02hkt1506
// License – Public domain
// ********************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
#include <FongIsr01.h>
#include <FongInt01.h>
#include <FongAttachIsr01.h>
// #include <PinChangeInt.h> // vector assignment crashes with software serial!!!

#include “Arduino.h”
#include “HardwareSerial.h”
#include “SoftwareSerial.h”
#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongBlueTooth01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongInterrupt01.h>
#include <FongTest01.h>

FongIsr01 fisr1(0);
FONG_ATTACH_ISR(fisr1)

void setup()
{
fongAttachIsr();
}

void loop()
{
FongTest01 ft1(&fisr1, 0);
}

// *** End ***

// *** FongTest01.cpp *******

// ********************************************************************
// Library – FongTest01b
// Author – TL Fong
// Date – 2014sep02hkt1557
// License – Public domain
// ********************************************************************

#include <FongTest01.h>

FongTest01::FongTest01(FongIsr01 *fisr, int testNum)
{
_fisr = fisr;
testAll(testNum);
}

// *** Functions ***

void FongTest01::testAll(int testNum)
{
// *** Create serial ports **************************************************

Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
Serial3.begin(9600);

hardwareSerialPointerArray[1] = &Serial1;
hardwareSerialPointerArray[2] = &Serial2;
hardwareSerialPointerArray[3] = &Serial3;

int softwareSerialPortRxdPinArray[4] = {66, 67, 68, 69};
int softwareSerialPortTxdPinArray[4] = {62, 63, 64, 65};

pinMode(softwareSerialPortRxdPinArray[0], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[1], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[2], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[3], INPUT_PULLUP);

SoftwareSerial ss1(softwareSerialPortRxdPinArray[0], softwareSerialPortTxdPinArray[0]);
SoftwareSerial ss2(softwareSerialPortRxdPinArray[1], softwareSerialPortTxdPinArray[1]);
SoftwareSerial ss3(softwareSerialPortRxdPinArray[2], softwareSerialPortTxdPinArray[2]);
SoftwareSerial ss4(softwareSerialPortRxdPinArray[3], softwareSerialPortTxdPinArray[3]);

softwareSerialPointerArray[1] = &ss1;
softwareSerialPointerArray[2] = &ss2;
softwareSerialPointerArray[3] = &ss3;
softwareSerialPointerArray[4] = &ss4;

// *** Create objects **************************************************

FongBuzzer01 fbuz1(testNum);
FongDio01 fdio1(testNum);
FongAio01 faio1(testNum);
FongUart01 fuart1(softwareSerialPointerArray, hardwareSerialPointerArray);
FongInt01 fint1(_fisr, 0);
FongBlueTooth01 fbt1(&fbuz1, &fuart1, &fdio1, &faio1, _fisr, &fint1, testNum);
// FongInterrupt01 finterrupt1(&fbuz1, &fuart1, &fdio1, &faio1, &fbt1, testNum);

// *** Tests ****************************************************************
fbuz1.beginBeep();

// fbuz1.testBuzzer(); // OK
// fdio1.testDio(testNum); // OK
// faio1.testAio(testNum); // OK
// finterrupt1.testInterrupt(testNum);
// fint1.testInterrupt(testNum); // OK
fbt1.testBlueTooth(testNum); // OK

fbuz1.endBeep();
}

// *** End ***

// fbt1.testBlueTooth(testNum); // *** for debugging only, tested OK ***

// *** Create FongPicoNet01 object ***
// FongPicoNet01 fpn1(&fbt1, testNum);
// fpn1.testPicoNet(testNum); // *** for debugging only, tested OK ***

// *** Create FongPicoTalk01 object ***
// FongPicoTalk01 fpt1(&fpn1, testNum);
// fpt1.testPicoTalk(testNum); // to be modified and tested later !!!
// fpt1.testBlueToothSerialModule(testNum);

// *** End2 ***

// *** FongBlueTooth01.h *******

// ********************************************************************
// Library – FongBlueTooth01b
// Author – TL Fong
// Date – 2014sep02kt1703
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongBlueTooth01_h
#define FongBlueTooth01_h

#include “Arduino.h”
#include “HardwareSerial.h”
#include “SoftwareSerial.h”

#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongIsr01.h>
#include <FongInt01.h>

// *** Create global software serial objects ***

class FongBlueTooth01
{
public:

// *** Constructors ***

FongBlueTooth01(FongBuzzer01 *fbuz, FongUart01 *fut, FongDio01 *fdio, \
FongAio01 *faio, FongIsr01 *fisr, FongInt01 *fint, int testNum);

// *** Functions ***

void testBlueTooth(int testNum);
void setupBlueToothConfig(int blueToothNumber);
void setupCommandStringArray(int blueToothModuleType);
int askBlueToothModuleType();
int askSerialType();
int askPortNumber();
int askAtCommandNum();
void execAtCommand(int moduleNum, int atCommandNum);
void execAtCommand(int blueToothModuleType, int serialType, int portNumber, \
char* commandStringArray[], int atCommandNum);
void execAtCommand(int moduleNum, int atCommandNum1, int atCommandNum2, \
int atCommandNum3);

void testRepeatPrintChar08(char* atCommandStringArray[], \
int atCommandNum, \
int serialType, int portNumber, \
int printCount);
void setModuleAtKeyHigh(int moduleNum);
void setModuleAtKeyLow(int moduleNum);
void powerReset();
void setAllModulesAtKeyHigh();
void setAllModulesAtKeyLow();
void execAtCommandAllModules(int atCommandNum);
void handleInterrupts(FongIsr01 *fisr);
void testInterrupt(int testNum);

// *** Variables ***

FongBuzzer01 _fbuz;
FongUart01 *_fut;
FongDio01 *_fdio;
FongAio01 *_faio;
FongIsr01 *_fisr;
FongInt01 *_fint;
char
commandStringArray[32];

int blueToothConfig[8][4]; // 7 Bluetooth modules, each with serial type and port number

enum BlueToothConfigNumber {BlueToothConfig00, BlueToothConfig01, BlueToothConfig02};
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};
enum BlueToothModuleConfigIndex {ModuleTypeIndex, SerialTypeIndex, PortNumberIndex, AtKeyIndex};
enum PinName {PowerPin = 7};

enum atCommandNum {AskIfOk, \
AskVersion, \
AskRole, \
SetSlaveRole, \
SetMasterRole, \
AskPassWord, \
SetPassWord1234, \
SetPassWord0001, \
AskName, \
SetNameHc05,\
SetNameTlfong01,\
AskCmode, \
SetCmodeAnyAddress, \
SetCmodeSpecifiedAddress, \
AskState, \
AskAddress, \
AskBindAddress, \
SetBindAddress123456abcdef,\
AskRemoteName000272od2224, \
AskPio89, \
SetPio8900, \
SetPio8911, \
AskDevice, \
ConnectDevice123456abcdef, \
DisconnectDevice, \
Reset, \
AskAccessCode, \
SetAccessCode9e8b3f, \
AskInquiryAccessCode, \
SetInquiryAccessCode1948, \
SetPair123456abcdef20, \
CheckPair123456abcdef, \
AskSerialParameter, \
SetSerialParameter9600n81, \
SetDefaultParameter, \
SetPio8LedOffPio9LedOn, SetPio8LedOnPio9LedOff, AskPio8Pio9, \
SetConnectAnyAddress, SetConnectSpeficiedAddress, AskConnectAddress};
private:

};

#endif

// *** END ***

// *** FongBlueTooth01.cpp *******

// ********************************************************************
// Library – FongBlueTooth01b
// Author – TL Fong
// Date – 2014sep02hkt1703
// License – Public domain
// ********************************************************************

// *** Includes ***
#include “HardwareSerial.h”
#include “SoftwareSerial.h”
#include “FongBuzzer01.h”
#include <FongSerialPort01>
#include <FongUart01.h>
#include <FongBlueTooth01.h>
#include <FongDio01.h>
#include <FongAio01.h>

// *** Constructors ***

FongBlueTooth01::FongBlueTooth01(FongBuzzer01 *fbuz, FongUart01 *fut, FongDio01 *fdio, \
FongAio01 *faio, FongIsr01 *fisr, \
FongInt01 *fint, int testNum)
{
_fbuz = fbuz;
_fut = fut;
_fdio = fdio;
_faio = faio;
_fint = fint;
_fisr = fisr;
setupBlueToothConfig(testNum);
_fdio->setDioPinLow(7);
}

// *** Functions ***

void FongBlueTooth01::testBlueTooth(int testNum)
{
int atCommandNum;
int blueToothModuleType;
int serialType;
int portNumber;
int printCount;
int moduleNum;
int moduleCount;
char charCommand = ‘h';
String atCommand;
int dioPinNum;

Serial.print(“\n***** FongBlueTooth01 – Test Bluetooth Module – 2014aug09hkt1228 *****”);
while (charCommand != ‘x’)
{
Serial.print(“\n\n0 = Power reset, …”);
Serial.print(“\n1 = Set All modules AT Key HIGH, …”);
Serial.print(“\n2 = Set All modules AT Key LOW, …”);
Serial.print(“\n3 = Ask All modules if OK, …”);
Serial.print(“\n4 = Ask All modules address, …”);
Serial.print(“\n5 = Set All modules slave, …”);
Serial.print(“\n6 = Set All modules master, …”);
Serial.print(“\n7 = Set Modules 0~3 master, 4~6 slave …”);
Serial.print(“\n8 = Ask All modules role, …”);
Serial.print(“\n9 = Ask All modules state, …”);
Serial.print(“\na = Set All modules name tlfong01, …”);
Serial.print(“\nb = Ask All modules name, …”);
Serial.print(“\nc = Read all analog pins, …”);
Serial.print(“\nd = Test external interrupts, …”);

Serial.print(“\n\nt = Test Dio Pins, …”);
Serial.print(“\nu = Test Aio Pins, …”);
Serial.print(“\nv = Test individual module parameters, …”);
Serial.print(“\nw = Help.”);
Serial.print(“\n\nx = eXit menu.”);
Serial.print(“\n\nEnter you selection number now, …\n”);

while (Serial.available() == false)
{
}
charCommand = Serial.read();
Serial.print(“\n*** Command = “);
Serial.write(charCommand);
Serial.print(” ***\n”);

switch (charCommand)
{
case ‘0’:
powerReset();
break;
case ‘1’:
setAllModulesAtKeyHigh();
break;
case ‘2’:
setAllModulesAtKeyLow();
break;
case ‘3’:
execAtCommandAllModules(AskIfOk);
break;
case ‘4’:
execAtCommandAllModules(AskAddress);
break;
case ‘5’:
execAtCommandAllModules(SetSlaveRole);
break;
case ‘6’:
execAtCommandAllModules(SetMasterRole);
break;
case ‘7’:
setAllModulesAtKeyLow();
powerReset();
delay(1000);
setAllModulesAtKeyHigh();
// execAtCommand(0, SetMasterRole); // not working!!!
execAtCommand(0, 1, 1, commandStringArray, SetMasterRole);
execAtCommand(1, SetMasterRole);
execAtCommand(2, SetMasterRole);
execAtCommand(3, SetMasterRole);
execAtCommand(4, SetSlaveRole);
execAtCommand(5, SetSlaveRole);
execAtCommand(6, SetSlaveRole);
break;
case ‘8’:
execAtCommandAllModules(AskRole);
break;
case ‘9’:
execAtCommandAllModules(AskState);
break;
case ‘a':
execAtCommandAllModules(SetNameTlfong01);
break;
case ‘b':
execAtCommandAllModules(AskName);
break;
case ‘c':
testInterrupt(testNum);
_faio->analogReadAllAioPins();
_faio->printAioConfigDataStruct();
break;
case ‘d':
testInterrupt(testNum);
// _fint->testInterrupt(testNum);
// _fint->handleInterrupts(_fisr);
// handleInterrupts(_fisr);

break;
case ‘t':
_fdio->testDio(testNum);
break;
case ‘u':
_faio->testAio(testNum);
break;
case ‘v':
blueToothModuleType = askBlueToothModuleType();
setupCommandStringArray(blueToothModuleType);
serialType = askSerialType();
portNumber = askPortNumber();
atCommandNum = askAtCommandNum();
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum);
break;

case ‘w': // *** Help ***
Serial.print(“\n\nSorry, Help not yet available, …\n”);
break;
}
if (charCommand == ‘x’)
break;
}
Serial.print(“\nEnd of program.\n\n”);

}

void FongBlueTooth01::setupBlueToothConfig(int testNum)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};
enum DioPinNum {DioPin0, DioPin1, DioPin2, DioPin3, DioPin4, DioPin5, DioPin6, DioPin7};

int moduleNum;
int ModuleTypeIndex = 0;
int SerialTypeIndex = 1;
int PortNumberIndex = 2;

moduleNum = 0;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin0;

moduleNum = 1;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin1;

moduleNum = 2;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin2;

moduleNum = 3;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = SoftwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port4;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin3;

switch (testNum)
{
case 0:
moduleNum = 4;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin4;

moduleNum = 5;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin5;

moduleNum = 6;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin6;

break;

case 1:
moduleNum = 4;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port1;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin4;

moduleNum = 5;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port2;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin5;

moduleNum = 6;
blueToothConfig[moduleNum][ModuleTypeIndex] = CduinoHm09;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin6;

moduleNum = 7;
blueToothConfig[moduleNum][ModuleTypeIndex] = WaveSenHm05;
blueToothConfig[moduleNum][SerialTypeIndex] = HardwareSerial;
blueToothConfig[moduleNum][PortNumberIndex] = Port3;
blueToothConfig[moduleNum][AtKeyIndex] = DioPin7;

break;
}
}

void FongBlueTooth01::setupCommandStringArray(int blueToothModuleType)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};

switch (blueToothModuleType)
{
case WaveSenHm05:
commandStringArray[AskIfOk] = “AT\r\n”;
commandStringArray[AskVersion] = “AT+VERSION?\r\n”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0\r\n”;
commandStringArray[SetMasterRole] = “AT+ROLE=1\r\n”;
commandStringArray[AskRole] = “AT+ROLE?\r\n”;
commandStringArray[AskName] = “AT+NAME?\r\n”;
commandStringArray[SetNameHc05] = “AT+NAME=Hc-05\r\n”;
commandStringArray[SetNameTlfong01] = “AT+NAME=tlfong01\r\n”;
commandStringArray[AskCmode] = “AT+CMODE?\r\n”;
commandStringArray[SetCmodeAnyAddress] = “AT+CMODE=1\r\n”;
commandStringArray[SetCmodeSpecifiedAddress] = “AT+CMODE=0\r\n”;
commandStringArray[AskState] = “AT+STATE?\r\n”;
commandStringArray[AskPassWord] = “AT+PSWD?\r\n”;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234\r\n”;
commandStringArray[SetPassWord0001] = “AT+PSWD=0001\r\n”;
commandStringArray[AskAddress] = “AT+ADDR?\r\n”;
commandStringArray[AskBindAddress] = “AT+BIND?\r\n”;
commandStringArray[SetBindAddress123456abcdef] = “AT+BIND=1234,56,abcdef\r\n”;
commandStringArray[AskRemoteName000272od2224] = “AT+RNAME?0002,72,od2224\r\n”;
commandStringArray[AskPio89] = “AT+POLAR?\r\n”;
commandStringArray[SetPio8900] = “AT+POLAR=0,0\r\n”;
commandStringArray[SetPio8911] = “AT+POLAR=1,1\r\n”;
commandStringArray[AskDevice] = “AT+INQ\r\n”;
commandStringArray[ConnectDevice123456abcdef] = “AT+LINK=1234,56,abcdef\r\n”;
commandStringArray[DisconnectDevice] = “AT+DISC\r\n”;
commandStringArray[Reset] = “AT+RESET\r\n”;
commandStringArray[SetAccessCode9e8b3f] = “AT+IAC=9e8b3f\r\n”;
commandStringArray[AskAccessCode] = “AT+IAC?\r\n”;
commandStringArray[AskAccessCode] = “AT+IAC\r\n”;
commandStringArray[AskInquiryAccessCode] = “AT+INQM?\r\n”;
commandStringArray[SetInquiryAccessCode1948] = “AT+INQM=1,9,48\r\n”;
commandStringArray[CheckPair123456abcdef] = “AT+FSAD=1234,56,abcdef\r\n”;
commandStringArray[SetPair123456abcdef20] = “AT+PAIR=1234,56,abcdef,20\r\n”;
commandStringArray[AskSerialParameter] = “AT+UART?\r\n”;
commandStringArray[SetSerialParameter9600n81] =”AT+UART=9600,0,0\r\n”;
commandStringArray[SetDefaultParameter] = “AT+ORGL\r\n”;
break;

case CduinoHm09:
commandStringArray[AskIfOk] = “AT”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0″;
commandStringArray[SetMasterRole] = “AT+ROLE=1″;
commandStringArray[AskRole] = “AT+ROLE?”;
commandStringArray[SetPio8LedOffPio9LedOn] = “AT+POLAR=0,1″;
commandStringArray[SetPio8LedOnPio9LedOff] = “AT+POLAR=0,1″;
commandStringArray[AskPio8Pio9] = “AT+POLAR=?”;
commandStringArray[SetConnectAnyAddress] = “AT+CMODE=1″;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234″;
commandStringArray[AskPassWord] = “AT+PIN?”;
commandStringArray[AskState] = “AT+STATE?”;
commandStringArray[AskVersion] = “AT+VERSION?”;
commandStringArray[AskName] = “AT+NAME?”;
break;

case BolutekMdBc04:
commandStringArray[AskIfOk] = “AT\r\n”;
commandStringArray[SetSlaveRole] = “AT+ROLE=0\r\n”;
commandStringArray[SetMasterRole] = “AT+ROLE=1\r\n”;
commandStringArray[AskRole] = “AT+ROLE\r\n”;
commandStringArray[SetPio8LedOffPio9LedOn] = “AT+POLAR=0,1\r\n”;
commandStringArray[SetPio8LedOnPio9LedOff] = “AT+POLAR=0,1\r\n”;
commandStringArray[AskPio8Pio9] = “AT+POLAR=\r\n”;
commandStringArray[SetConnectAnyAddress] = “AT+CMODE=1\r\n”;
commandStringArray[SetPassWord1234] = “AT+PSWD=1234\r\n”;
commandStringArray[AskPassWord] = “AT+PIN\r\n”;
commandStringArray[AskState] = “AT+STATE\r\n”;
commandStringArray[AskVersion] = “AT+VERSION\r\n”;
commandStringArray[AskName] = “AT+NAME\r\n”;
break;
}
}

int FongBlueTooth01::askAtCommandNum()
{
int atCommandNum;

enum atCommandNum {AskIfOk, \
AskVersion, \
AskRole, \
SetSlaveRole, \
SetMasterRole, \
AskPassWord, \
SetPassWord1234, \
SetPassWord0001, \
AskName, \
SetNameHc05,\
SetNameTlfong01,\
AskCmode, \
SetCmodeAnyAddress, \
SetCmodeSpecifiedAddress, \
AskState, \
AskAddress, \
AskBindAddress, \
SetBindAddress123456abcdef,\
AskRemoteName000272od2224, \
AskPio89, \
SetPio8900, \
SetPio8911, \
AskDevice, \
ConnectDevice123456abcdef, \
DisconnectDevice, \
Reset, \
AskAccessCode, \
SetAccessCode9e8b3f, \
AskInquiryAccessCode, \
SetInquiryAccessCode1948, \
SetPair123456abcdef20, \
CheckPair123456abcdef, \
AskSerialParameter, \
SetSerialParameter9600n81, \
SetDefaultParameter, \
SetPio8LedOffPio9LedOn, SetPio8LedOnPio9LedOff, AskPio8Pio9, \
SetConnectAnyAddress, SetConnectSpeficiedAddress, AskConnectAddress};

Serial.print(“\n*** Select AT Command Number, … ***”);
Serial.print(“\n 0 = Ask OK”);
Serial.print(“\n 1 = Ask Version”);
Serial.print(“\n 2 = Ask Role”);
Serial.print(“\n 3 = Set Slave Role”);
Serial.print(“\n 4 = Set Master Role”);
Serial.print(“\n 5 = Ask Pass Word”);
Serial.print(“\n 6 = Set Pass Word = 1234″);
Serial.print(“\n 7 = Ask Address”);
Serial.print(“\nEnter AT command number now, … \n”);

while (Serial.available() == false)
{
}
atCommandNum = Serial.read();

switch (atCommandNum)
{
case ‘0’:
return AskIfOk;
break;
case ‘1’:
return AskVersion;
break;
case ‘2’:
return AskRole;
break;
case ‘3’:
return SetSlaveRole;
break;
case ‘4’:
return SetMasterRole;
break;
case ‘5’:
return AskPassWord;
break;
case ‘6’:
return SetPassWord1234;
break;
case ‘7’:
return AskAddress;
break;
}
}

int FongBlueTooth01::askPortNumber()
{
int portNumber;

Serial.print(“\n*** Select Port Number, … ***”);
Serial.print(“\n 1 = Port 1″);
Serial.print(“\n 2 = Port 2″);
Serial.print(“\n 3 = Port 3″);
Serial.print(“\n 4 = Port 4″);
Serial.print(“\nEnter serial type number now, … \n”);

while (Serial.available() == false)
{
}
portNumber = Serial.read();

switch (portNumber)
{
case ‘1’:
return 1;
break;
case ‘2’:
return 2;
break;
case ‘3’:
return 3;
break;
case ‘4’:
return 4;
break;
}
}

int FongBlueTooth01::askSerialType()
{
int serialType;

Serial.print(“\n*** Select Serial Type, … ***”);
Serial.print(“\n 0 = Hardware serial”);
Serial.print(“\n 1 = Software serial”);
Serial.print(“\nEnter serial type number now, … \n”);

while (Serial.available() == false)
{
}
serialType = Serial.read();

switch (serialType)
{
case ‘0’:
return 0;
break;
case ‘1’:
return 1;
break;
}
}

int FongBlueTooth01::askBlueToothModuleType()
{
int blueToothModuleType;
enum BlueToothModuleType {WaveSenHm05, CduinoHm09, BolutekMdBc04};

Serial.print(“\n*** Select BlueTooth Module, … ***”);
Serial.print(“\n 0 = WaveSenHm05/GzHc05 (Master/Slave)”);
Serial.print(“\n 1 = WaveSenHm06/CduinoHm09 (Slave) “);
Serial.print(“\n 2 = BolutekMdBc04 (Master/Slave)”);
Serial.print(“\nEnter module number now, … \n”);

while (Serial.available() == false)
{
}
blueToothModuleType = Serial.read();

switch (blueToothModuleType)
{
case ‘0’:
return 0;
break;
case ‘1’:
return 1;
break;
case ‘2’:
return 2;
break;
}
}

void FongBlueTooth01::execAtCommand(int moduleNum, int atCommandNum)
{
enum blueToothConfigArrayIndex {ModuleTypeIndex, SerialTypeIndex, PortNumberIndex};
int blueToothModuleType;
int serialType;
int portNumber;
int dioPinNum;

blueToothModuleType = blueToothConfig[moduleNum][ModuleTypeIndex];
setupCommandStringArray(blueToothModuleType);
serialType = blueToothConfig[moduleNum][SerialTypeIndex];
portNumber = blueToothConfig[moduleNum][PortNumberIndex];
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum);
}

void FongBlueTooth01::execAtCommand(int moduleNum, int atCommandNum1, int atCommandNum2, \
int atCommandNum3)
{
enum blueToothConfigArrayIndex {ModuleTypeIndex, SerialTypeIndex, PortNumberIndex};
int blueToothModuleType;
int serialType;
int portNumber;

blueToothModuleType = blueToothConfig[moduleNum][ModuleTypeIndex];
setupCommandStringArray(blueToothModuleType);
serialType = blueToothConfig[moduleNum][SerialTypeIndex];
portNumber = blueToothConfig[moduleNum][PortNumberIndex];

execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum1);
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum2);
execAtCommand(blueToothModuleType, serialType, portNumber, \
commandStringArray, atCommandNum3);
}

void FongBlueTooth01::execAtCommand(int blueToothModuleType, \
int serialType, int portNumber, \
char* atCommandStringArray[], \
int atCommandNum)
{
enum BlueToothModuleType {WaveSenHm05, CduinoHm09};
enum SerialPortType {HardwareSerial, SoftwareSerial};
enum SerialPortNumber {Port0, Port1, Port2, Port3, Port4};

String atCommandString;
atCommandString = atCommandStringArray[atCommandNum];

Serial.print(“\n*** Executing BlueTooth AT Command ***”);

switch (blueToothModuleType)
{
case WaveSenHm05:
Serial.print(“\nModule Type = WaveSenHM05″);
break;
case CduinoHm09:
Serial.print(“\nModule Type = CduinoHm09″);
break;
}

switch (serialType)
{
case HardwareSerial:
Serial.print(“\nSerial Type = Hardware”);
Serial.print(“\nPort Number = “);
Serial.print(portNumber);
Serial.print(“\n”);
(*_fut).hardwareSerialWriteRead(portNumber, atCommandString);
break;

case SoftwareSerial:
Serial.print(“\nSerial Type = Software”);
Serial.print(“\nPort Number = “);
Serial.print(portNumber);
Serial.print(“\n”);
(*_fut).softwareSerialWriteRead(portNumber, atCommandString);;
break;
}
}

void FongBlueTooth01::setModuleAtKeyHigh(int moduleNum)
{
int dioPinNum;
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinHigh(dioPinNum);
}

void FongBlueTooth01::setModuleAtKeyLow(int moduleNum)
{
int dioPinNum;
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinLow(dioPinNum);
}

// *** To move !! ***

void FongBlueTooth01::testRepeatPrintChar08(char* atCommandStringArray[], \
int atCommandNum, \
int serialType, int portNumber, \
int printCount)
{
enum SerialType {HardwareSerial = 0, SoftwareSerial, SIZE_OF_SERIAL_PORT_TYPE_ENUM};
String atCommandString;
atCommandString = atCommandStringArray[atCommandNum];

Serial.print(“\nRepeat printing character, …”);
int i;

switch (serialType)
{
case HardwareSerial:
for (i = 0; i < printCount; i++)
{
(*_fut).hardwareWriteString(portNumber, atCommandString);
}
break;

case SoftwareSerial:
for (i = 0; i < printCount; i++)
{
(*_fut).softwareWriteString(portNumber, atCommandString);
}
break;
}
}

void FongBlueTooth01::powerReset()
{
_fdio->setDioPinHigh(PowerPin);
delay(500);
_fdio->setDioPinLow(PowerPin);
}

void FongBlueTooth01::setAllModulesAtKeyHigh()
{
int moduleNum;
int dioPinNum;
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinHigh(dioPinNum);
}
}

void FongBlueTooth01::setAllModulesAtKeyLow()
{
int moduleNum;
int dioPinNum;
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
dioPinNum = blueToothConfig[moduleNum][AtKeyIndex];
_fdio->setDioPinLow(dioPinNum);
}
}

void FongBlueTooth01::execAtCommandAllModules(int atCommandNum)
{
int moduleNum;
setAllModulesAtKeyLow();
powerReset();
delay(1000);
setAllModulesAtKeyHigh();
execAtCommand(0, 1, 1, commandStringArray, atCommandNum);
for (moduleNum = 0; moduleNum < 7; moduleNum++)
{
execAtCommand(moduleNum, atCommandNum);
}
}

void FongBlueTooth01::testInterrupt(int testNum)
{
handleInterrupts(_fisr);
}

void FongBlueTooth01::handleInterrupts(FongIsr01 *fisr)
{
Serial.println(“\n\n *** Start testing interrupt, … ***”);
int interruptCount[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int i;
while (true)
{
for (i = 0; i < 7; i++)
if (fisr->globalInterruptFlagArray[i] == InterruptOn)
{
interruptCount[i]++;
Serial.print(“\n Interrupt = “);
Serial.print(i);
Serial.print(” Count = “);
Serial.print(interruptCount[i]);
if (interruptCount[i] > 9)
break; // exit for loop
delay(200); // debouncing 200 mS
noInterrupts(); // disable interrupt
fisr->globalInterruptFlagArray[i] = InterruptOff;
interrupts(); // restart interrupt
}
if (interruptCount[i] > 9)
break; // exit while loop
}
Serial.println(“\n\n*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***\n\n\n”);
while (true) {}; // loop forever
}

// *** End ***

 

Leave a comment

Filed under Uncategorized

FongInt01 tdd notes

// *** fongTest01Example_2014sep0104 ****

// ********************************************************************
// Program – FongTest01
// Purpose – Testing external and pin change interrupts
// Author – tlfong01.com
// Date – 2014sep02hkt1506
// License – Public domain
// ********************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
#include <FongIsr01.h>
#include <FongInt01.h>
#include <FongAttachIsr01.h>
// #include <PinChangeInt.h> // vector assignment crashes with software serial!!!

#include “Arduino.h”
#include “HardwareSerial.h”
#include “SoftwareSerial.h”
#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongBlueTooth01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongInterrupt01.h>
#include <FongTest01.h>

FongIsr01 fisr1(0);
FONG_ATTACH_ISR(fisr1)

void setup()
{
fongAttachIsr();
}

void loop()
{
FongTest01 ft1(&fisr1, 0);
}

// *** End ***

// *** FongTest01.h *******

// ********************************************************************
// Library – FongTest01b
// Author – TL Fong
// Date – 2014jul09hkt1206
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongTest01_h
#define FongTest01_h

#include “Arduino.h”
#include “HardwareSerial.h”
#include “SoftwareSerial.h”

#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongBlueTooth01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongBlueTooth01.h>
#include <FongInterrupt01.h>
#include <FongIsr01.h>
#include <FongInt01.h>

class FongTest01
{
public:

// *** Constructors ***

FongTest01(FongIsr01 *fisr, int testNum);

// *** Functions ***

void testAll(int testNumber);
void setupHardwareSoftwareSerialPortArrays();
void setupSoftwareSerialtestBlueTooth();

// *** Variables ***

enum BlueToothConfigNumber {BlueToothConfig00, BlueToothConfig01, BlueToothConfig02};

SoftwareSerial *softwareSerialPointerArray[5];
HardwareSerial *hardwareSerialPointerArray[5];

typedef struct
{
HardwareSerial *hsPtrArray[5];
SoftwareSerial *ssPtrArray[5];
} megaSerialPointerArrayStruct;

megaSerialPointerArrayStruct mspas;

FongIsr01 *_fisr;

private:

};

#endif

//.END

// *** fongTest01Example_2014aug2201 ****

// ********************************************************************
// Program – FongDuino01e
// Function – Test Arduino BluteTooth serial modules
// Libraries – FongConfig01b, FongGpio01b, FongSerialPort01b,
// FongUart01b, FongBlueTooth01b, FongPicoNet01,
// FongTest01b, FongDio01e
// Author – TL Fong
// Date – 2014aug22hkt1613
// License – Public domain
// Software – Arduino IDE 1.0.5-r2
// Hardware – Arduino Mega1280/2560R3, Wavesen/Gz/Cduino/Bolutek
// HC05/06/09 BLK-MD-BC-04B Bluetooth modules
// Description – Test BlueTooth modules
// Notes – Remember to press AT key before and after AT command
// ********************************************************************

// *** FongTest01.cpp *******

// ********************************************************************
// Library – FongTest01b
// Author – TL Fong
// Date – 2014aug22hkt2151
// License – Public domain
// ********************************************************************

#include <FongTest01.h>

FongTest01::FongTest01(FongIsr01 *fisr, int testNum)
{
_fisr = fisr;
testAll(testNum);
}

// *** Functions ***

void FongTest01::testAll(int testNum)
{
// *** Create serial ports **************************************************

Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
Serial3.begin(9600);

hardwareSerialPointerArray[1] = &Serial1;
hardwareSerialPointerArray[2] = &Serial2;
hardwareSerialPointerArray[3] = &Serial3;

int softwareSerialPortRxdPinArray[4] = {66, 67, 68, 69};
int softwareSerialPortTxdPinArray[4] = {62, 63, 64, 65};

pinMode(softwareSerialPortRxdPinArray[0], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[1], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[2], INPUT_PULLUP);
pinMode(softwareSerialPortRxdPinArray[3], INPUT_PULLUP);

SoftwareSerial ss1(softwareSerialPortRxdPinArray[0], softwareSerialPortTxdPinArray[0]);
SoftwareSerial ss2(softwareSerialPortRxdPinArray[1], softwareSerialPortTxdPinArray[1]);
SoftwareSerial ss3(softwareSerialPortRxdPinArray[2], softwareSerialPortTxdPinArray[2]);
SoftwareSerial ss4(softwareSerialPortRxdPinArray[3], softwareSerialPortTxdPinArray[3]);

softwareSerialPointerArray[1] = &ss1;
softwareSerialPointerArray[2] = &ss2;
softwareSerialPointerArray[3] = &ss3;
softwareSerialPointerArray[4] = &ss4;

// *** Create objects **************************************************

FongBuzzer01 fbuz1(testNum);
FongDio01 fdio1(testNum);
FongAio01 faio1(testNum);
FongUart01 fuart1(softwareSerialPointerArray, hardwareSerialPointerArray);
FongBlueTooth01 fbt1(&fuart1, &fdio1, &faio1, testNum);
FongInterrupt01 finterrupt1(&fbuz1, &fuart1, &fdio1, &faio1, &fbt1, testNum);
FongInt01 fint1(_fisr, 0);

// *** Tests ****************************************************************
fbuz1.beginBeep();

// fbuz1.testBuzzer(); // OK
// fdio1.testDio(testNum); // OK
// fbt1.testBlueTooth(testNum); // OK
// faio1.testAio(testNum); // OK
// finterrupt1.testInterrupt(testNum);

fbuz1.endBeep();
}

// *** End ***

// fbt1.testBlueTooth(testNum); // *** for debugging only, tested OK ***

// *** Create FongPicoNet01 object ***
// FongPicoNet01 fpn1(&fbt1, testNum);
// fpn1.testPicoNet(testNum); // *** for debugging only, tested OK ***

// *** Create FongPicoTalk01 object ***
// FongPicoTalk01 fpt1(&fpn1, testNum);
// fpt1.testPicoTalk(testNum); // to be modified and tested later !!!
// fpt1.testBlueToothSerialModule(testNum);

// *** End2 ***

 

Leave a comment

Filed under Uncategorized

FongAttachIsr01 tdd notes

// ********************************************************************

// Program – Testing 4 External and 3 Pin Change Interrupts
// Author – tlfong01.com
// Date – 2014sep02hkt1210
// License – Public domain
// ********************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
#include <PinChangeInt.h>
#include <FongIsr01.h>
#include <FongInt01.h>
#include <FongAttachIsr01.h>

FongIsr01 fisr1(0);
FONG_ATTACH_ISR(fisr1)

void setup()
{
}

void loop()
{
fongAttachIsr();
FongInt01 fint1(&fisr1, 0);
}

// *** End ***

*** Start testing interrupt, … ***

Interrupt = 2 Count = 1
Interrupt = 2 Count = 2
Interrupt = 2 Count = 3
Interrupt = 3 Count = 1
Interrupt = 3 Count = 2
Interrupt = 4 Count = 1
Interrupt = 5 Count = 1
Interrupt = 6 Count = 1
Interrupt = 0 Count = 1
Interrupt = 1 Count = 1
Interrupt = 0 Count = 2

// *** FongAttachIsr01.h *******

// ********************************************************************
// Library – FongAttachIsr01b
// Author – TL Fong
// Date – 2014sep01hkt1223
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongAttachIsr01_h
#define FongAttachIsr01_h

#define FONG_ATTACH_ISR(isr_object) \
void IsrExtInt0() {isr_object.globalInterruptFlagArray[0] = InterruptOn;} \
void IsrExtInt1() {isr_object.globalInterruptFlagArray[1] = InterruptOn;} \
void IsrExtInt2() {isr_object.globalInterruptFlagArray[2] = InterruptOn;} \
void IsrExtInt3() {isr_object.globalInterruptFlagArray[3] = InterruptOn;} \
void IsrPcInt0() {isr_object.globalInterruptFlagArray[4] = InterruptOn;} \
void IsrPcInt1() {isr_object.globalInterruptFlagArray[5] = InterruptOn;} \
void IsrPcInt2() {isr_object.globalInterruptFlagArray[6] = InterruptOn;} \
void fongAttachIsr() \
{ \
noInterrupts(); \
attachInterrupt(0, IsrExtInt0, FALLING); \
attachInterrupt(1, IsrExtInt1, FALLING); \
attachInterrupt(2, IsrExtInt2, FALLING); \
attachInterrupt(3, IsrExtInt3, FALLING); \
PCintPort::attachInterrupt(PcIntPin0, &IsrPcInt0, FALLING); \
PCintPort::attachInterrupt(PcIntPin1, &IsrPcInt1, FALLING); \
PCintPort::attachInterrupt(PcIntPin2, &IsrPcInt2, FALLING); \
interrupts(); \
}

#endif

// *** END ***

// *** FongAttachIsr01.cpp *******

// ********************************************************************
// Library – FongAttachIsr01i
// Author – TL Fong
// Date – 2014sep02hkt1051
// License – Public domain
// ********************************************************************

#include <FongAttachIsr01.h>

// *** End ***

// *** FongIsr01.h *******

// ********************************************************************
// Library – FongIsr01b
// Author – TL Fong
// Date – 2014sep01hkt1223
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongIsr01_h
#define FongIsr01_h

#include “Arduino.h”
#include “HardwareSerial.h”
// #include “SoftwareSerial.h”

#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongBlueTooth01.h>

// *** Create global software serial objects ***

class FongIsr01
{
public:

FongIsr01(int testNum);

void globalExtIntIsr0();
void globalExtIntIsr1();
void globalExtIntIsr2();
void globalExtIntIsr3();

void globalPcIntIsr0();
void globalPcIntIsr1();
void globalPcIntIsr2();

int globalInterruptFlagArray[7];

private:
};

#endif

// *** END ***

// *** FongIsr01.cpp *******

// ********************************************************************
// Library – FongIsr01b
// Author – TL Fong
// Date – 2014sep01hkt1222
// License – Public domain
// ********************************************************************

// *** Includes ***
#include <FongIsr01.h>

// *** Constructors ***

FongIsr01::FongIsr01(int testNum)
{
}

void FongIsr01::globalExtIntIsr0()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr1()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr2()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr3()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr0()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr1()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr2()
{
// not used for now.
}

// *** End ***

// *** FongInt01.h *******

// ********************************************************************
// Library – FongInt01b
// Author – TL Fong
// Date – 2014sep01hkt1225
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongInt01_h
#define FongInt01_h

#include “Arduino.h”
#include <FongIsr01.h>

#define InterruptOff 0
#define InterruptOn 1

#define ledPin 13
#define PcIntPin0 10
#define PcIntPin1 11
#define PcIntPin2 12

class FongInt01
{
public:
// *** Constructors ***
FongInt01(FongIsr01 *fisr, int testNum);

// *** Functions ***
void setupArduinoPins();
void blinkTwice();
void handleInterrupts(FongIsr01 *fisr);

// *** Variables ***
FongIsr01 *_fisr;

private:
};

#endif

// *** END ***

// *** FongInt01.cpp *******

// ********************************************************************
// Library – FongInt01b
// Author – TL Fong
// Date – 2014sep01hkt1226
// License – Public domain
// ********************************************************************

#include <FongInt01.h>

// *** Constructors ***

FongInt01::FongInt01(FongIsr01 *fisr, int testNum)
{
_fisr = fisr;
setupArduinoPins();
handleInterrupts(_fisr);
}

void FongInt01::setupArduinoPins()
{
pinMode(ledPin, OUTPUT);
pinMode(PcIntPin0, INPUT);
pinMode(PcIntPin1, INPUT);
pinMode(PcIntPin2, INPUT);

Serial.begin(9600);
Serial.println(“*** Start testing interrupt, … ***”);
blinkTwice();
}

void FongInt01::blinkTwice()
{
int i;
for (i = 0; i < 2; i++)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(200);
}
}

void FongInt01::handleInterrupts(FongIsr01 *fisr)
{
int interruptCount[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int i;
while (true)
{
for (i = 0; i < 7; i++)
if (fisr->globalInterruptFlagArray[i] == InterruptOn)
{
interruptCount[i]++;
Serial.print(“\n Interrupt = “);
Serial.print(i);
Serial.print(” Count = “);
Serial.print(interruptCount[i]);
if (interruptCount[i] > 9)
break; // exit for loop
delay(200); // debouncing 200 mS
noInterrupts(); // disable interrupt
fisr->globalInterruptFlagArray[i] = InterruptOff;
interrupts(); // restart interrupt
}
if (interruptCount[i] > 9)
break; // exit while loop
}
Serial.println(“\n\n*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***\n\n\n”);
while (true) {}; // loop forever
}

// *** End ***

.END

 

Leave a comment

Filed under Uncategorized

Capstone Project – The Glossary of Education Reform

Capstone Project – The Glossary of Education Reform 2014feb17

http://edglossary.org/capstone-project/

Also called a capstone experience, culminating project, or senior exhibition, among many other terms, a capstone project is a multifaceted assignment that serves as a culminating academic and intellectual experience for students, typically during their final year of high school or middle school, or at the end of an academic program or learning-pathway experience.

While similar in some ways to a college thesis, capstone projects may take a wide variety of forms, but most are long-term investigative projects that culminate in a final product, presentation, or performance.

For example, students may be asked to select a topic, profession, or social problem that interests them, conduct research on the subject, maintain a portfolio of findings or results, create a final product demonstrating their learning acquisition or conclusions (a paper, short film, or multimedia presentation, for example), and give an oral presentation on the project to a panel of teachers, experts, and community members who collectively evaluate its quality.

Capstone projects are generally designed to encourage students to think critically, solve challenging problems, and develop skills such as oral communication, public speaking, research skills, media literacy, teamwork, planning, self-sufficiency, or goal setting—i.e., skills that will help prepare them for college, modern careers, and adult life.

In most cases, the projects are also interdisciplinary, in the sense that they require students to apply skills or investigate issues across many different subject areas or domains of knowledge. Capstone projects also tend to encourage students to connect their projects to community issues or problems, and to integrate outside-of-school learning experiences, including activities such interviews, scientific observations, or internships.

While capstone projects can take a wide variety of forms from school to school, a few examples will help to illustrate both the concept and the general educational intentions:

Writing, directing, and filming a public-service announcement that will be aired on public-access television

Designing and building a product, computer program, app, or robot to address a specific need, such as assisting the disabled

Interning at a nonprofit organization or a legislator’s office to learn more about strategies and policies intended to address social problems, such as poverty, hunger, or homelessness

Conducting a scientific study over several months or a year to determine the ecological or environmental impact of changes to a local habitat

Researching an industry or market, and creating a viable business plan for a proposed company that is then “pitched” to a panel of local business leaders

For related discussions, see authentic learning, portfolio, relevance, and 21st century skills.

Reform

As a school-reform strategy, capstone projects are often an extension of more systemic school-improvement models or certain teaching philosophies or strategies, such as 21st century skills, community-based learning, proficiency-based learning, project-based learning, or student-centered learning, to name just a few.

The following are a few representative educational goals of capstone projects:

Increasing the academic rigor of the senior year.

Historically, high school students have taken a lighter course load or left school early during their twelfth-grade year, which can contribute to learning loss or insufficient preparation for first-year college work. A more academically and intellectually challenging senior year, filled with demanding but stimulating learning experiences such as a capstone project, the reasoning goes, can reduce senior-year learning loss, keep students in school longer (or otherwise engaged in learning), and increase preparation for college and work.

Increasing student motivation and engagement.

The creative nature of capstone projects, which are typically self-selected by students and based on personal interests, can strengthen student motivation to learn, particularly during a time (twelfth grade) when academic motivation and engagement tend to wane.

Increasing educational and career aspirations.

By involving students in long-term projects that intersect with personal interests and professional aspirations, capstone projects can help students with future planning, goal setting, postsecondary decisions, and career exploration—particularly for those students who may be unfocused, uncertain, or indecisive about their post-graduation plans and aspirations.

Improving student confidence and self-perceptions.

Capstone projects typically require students to take on new responsibilities, be more self-directed, set goals, and follow through on commitments. Completing such projects can boost self-esteem, build confidence, and teach students about the value of accomplishment. Students may also become role models for younger students, which can cultivate leadership abilities and have positive cultural effects within a school.

Demonstrating learning and proficiency.

As one of many educational strategies broadly known as demonstrations of learning, capstone projects can be used to determine student proficiency (in the acquisition of knowledge and skills) or readiness (for college and work) by requiring them to demonstrate what they have learned over the course of their project

In recent years, the capstone-project concept has also entered the domain of state policy. In Rhode Island, for example, the state’s high school graduation requirements stipulate that seniors must complete two out of three assessment options, one of which can be a capstone project. Several other states require students to complete some form of senior project, while in other states such projects may be optional, and students who complete a capstone project may receive special honors or diploma recognition.

Debate

Most criticism of or debate about capstone projects is not focused on the strategy itself, or its intrinsic or potential educational value, but rather on the quality of its execution—i.e., capstone projects tend to be criticized when they are poorly designed or reflect low academic standards, or when students are allowed to complete relatively superficial projects of low educational value. In addition, if teachers and students consider capstone projects to be a formality, lower-quality products typically result. And if the projects reflect consistently low standards, quality, and educational value year after year, educators, students, parents, and community members may come to view capstone projects as a waste of time or resources.

ABOUT

The Glossary of Education Reform was created to help journalists, parents, and community members—anyone with an interest or investment in our public schools—understand some of the major reform concepts being discussed by educators, researchers, and policy makers. In a word, we believe that strong schools, great journalism, and an informed electorate are essential to any well-functioning democracy. For this reason, educators are encouraged to use the glossary to build a stronger understanding of school-improvement strategies in their communities.

.END

Leave a comment

Filed under Uncategorized

天黑黑 – 孫燕姿

孫燕姿-天黑黑


夢醒了,天還是黑的 – 李碧華 蘋果日報 2014年09月02日

一個女人,青春年華嫁了個賤男,有案底、沒前景、一窮二白,她生兒育女同甘共苦,誰知他搞婚外情,還讓小三侵佔家庭同食共遊,還動手毆妻受傷流血……女人仍相信「希望在明天」?一切交由上帝帶領?

旁觀者覺得為什麼那麼儍?明知前景迷茫,受騙一回又一回,仍存希望?──或者因為她愛過,愛得比對方多,才特別「儍」。

我說的不止是抑鬱的女人,而是抑鬱的香港人。

香港人等待、盼望了三十年的「真普選」,終於在晦暗的八月卅一日,因中共背棄承諾連落三閘的「偽普選」侵佔了,

翌日還下詔鎮壓

這是痛心、遺憾、絕望、欲語無言的日子,

什麼公開諮詢、有商有量、各抒己見、聽取民意……都是騙局。

但前人不是洞悉黨「尚黑」,一早提醒別作夢嗎?

強權獨裁吃定你,鷹犬爪牙還恐嚇,若不乖乖順從竟提出抗議?

必要時解放軍侍候,難免發生流血事件了。

香港人仍抱一絲希望,也特別「儍」?

當然不是──因為我們愛這片土地,愛得比誰都深沈。生於斯,長於斯,得於斯,成於斯,不忍她淪落。

夢醒了,天還是黑的 …

李碧華


天黑黑 – 百度百科

一首闽南童谣的歌词,为孙燕姿的专辑命名,表示

对小时候的自己的回顾,对现在的处世感悟,对回不去的曾经的自己的哀悼。

原唱 孙燕姿 填词 廖莹如,吴依铮 谱曲李偲菘 编曲吴庆隆 MV 导演马宜中

孙燕姿(Stefanie Sun),新加坡人,华语著名女歌手、亚洲歌坛天后。被视为华语乐坛继王菲、张惠妹之后,难得的天后接班人。

2000年推出首张专辑,与蔡依林、萧亚轩、梁静茹合称四小天后。

出道一年包揽亚洲各地15个最佳新人奖,至今仍为华语歌坛之纪录,更创下亚洲音乐市场上独特的“孙燕姿现象”。几乎拿遍各地重要奖项,且六次入围金曲奖最佳女歌手、四次入围最佳专辑,2005年获得第16届金曲歌后,连续7年获得香港IFPI十大销量国语唱片奖,亚洲唱片总销量超过2500万张,是华语乐坛最有影响力和最具指标性的女歌手之一。

2011年3月8日发行第11张全新国语专辑《是时候》,2013年于新加坡出席广告代言发布会,新专辑《克卜勒》在2014年2月推出,并于2014年1月开始新一轮巡回演唱会。

歌曲介绍

《天黑黑》,灵感来自于台湾民谣,而歌曲MV里那一位弹着钢琴、瘦削但坚强的女生也成了孙燕姿最有说服力的形象。

创作背景

作曲者和制作人李偲菘在新书-我们的乐园中谈《天黑黑》创作灵感来源:

家是最好的避风港 也是勇敢前进的力量

人常常很容易忽略一直守和在自己身边的家人,把他们给予的爱视为理所当然。直到在外面的世界跌倒了、受伤了,委屈、无助地回到家里,才感受到家人最温暖的存在,才领悟到什么样的爱是最真的。

我有一个很好的朋友就是这样。一直以来,他都对家人的爱显得漠不关心,觉得一切都是应该的。家人付出再多,似乎也引起不了他的重视。相反,她却愿意花很多的时间交朋友,经营一段段所谓的友谊,朋友的一点好,就能让他感动不已。

直到有一次,他被一段最信任的友情狠狠背叛受了伤,茫然若失的他孤独地回到家中,跟家人们倾述自己的遭遇,在家人的怀抱里痛苦释怀。

直到那时侯,他才意识到,曾经的自己是多么愚蠢,疏忽了身边那么多发自内心的关怀。懊恼之余,也告诉自己,从这一秒开始,一定要好好珍惜家人们——这个命中注定、和自己不可分割的宝物。

后来,我想着好朋友的经历,自己创作了一个小故事:

他生在小乡村,是外婆一手带大的孩子。小时候,每天晚上睡觉前,外婆都会哼着闽南民谣“天黑黑,要落雨,阿公仔举锄头要掘芋……”来哄他入睡。

长达后,他来到了城市里,忙碌的工作使他回老家看望外婆的次数越来越少,知道外婆安静地离开这个世界,他才突然发现,那首陪伴整个童年的、只属于自己和外婆间的民谣,他只记得开头的部分,后面的全都忘记了。

跪在外婆的坟前,懊恼、难过不已的他,只能够一遍遍呢喃着“天黑黑,天黑黑…………”,

努力回忆着奶奶从小照顾自己的每一个细节,泪如雨下………

也正是这个故事,给了我一个用民谣做桥段,来创作的灵感。于是,诞生了《天黑黑》这首歌。而燕姿的干净而有温柔,擅长层次变化的声音,更是我觉得能够诠释这个故事的最佳选择。

民谣、戏曲都是各地民间音乐的瑰宝,对它们的了解和学习,会让创作拥有更丰富的层次和色彩。[1]

歌词

我的小时候 吵闹任性的时候

我的外婆 总会唱歌哄我

夏天的午后 姥姥的歌安慰我

那首歌好像这样唱的

天黑黑 欲落雨

天黑黑 黑黑

离开小时候 有了自己的生活

新鲜的歌 新鲜的念头

任性和冲动 无法控制的时候

我忘记还有这样的歌

天黑黑 欲落雨 (闽南语:tin o o mie lo ho)

天黑黑 黑黑(闽南语:tin o o o o)

我爱上让我奋不顾身的一个人

我以为这就是我所追求的世界

然而横冲直撞 被误解被骗

是否成人的世界背后总有残缺

我走在每天必须面对的分岔路

我怀念过去单纯美好的小幸福

爱总是让人哭 让人觉得不满足

天空很大却看不清楚 好孤独

天黑的时候 我又想起那首歌

突然期待 下起安静的雨

原来外婆的道理早就唱给我听

下起雨也要勇敢前进…

我相信一切都会平息

我现在好想回家去

天黑黑 欲落雨

天黑黑 黑黑


謊言起家 謊言建政 謊言治港- 長平 蘋果日報 2014年09月02日

http://hk.apple.nextmedia.com/news/art/20140902/18853075

中共曾經對西藏許下「獨立聯邦」、「高度自治」的承諾,結果證實只是一片謊言。資料圖片

康藏的民族解放運動,就是要徹底的脫離英國和中國而獨立,實行民族自決,只有與英國和中國進行徹底的分裂,才能使康藏民族真正的獨立與解放」;「用自由聯邦制,統一中國本部、蒙古、西藏、回疆,建立中華聯邦共和國。」

如此極端的蒙獨、藏獨和疆獨主張者是誰?是中國共產黨。

這些主張也不是隨便說說而已,它來自該黨1922年7月發佈的《第二次全國代表大會宣言》,至今也收藏在由中共統戰部1991年彙編並內部發行的黨史文件中。

8月27日,在漢堡召開的漢藏對話會議上,歷史學者李江琳展示了部份原始檔,顯示中共對藏政策由主張獨立聯邦、高度自治、軍事佔領、全面改造、「糾偏」到鎮壓反抗的過程。就跟我們熟知的對漢民族承諾民主憲政一樣,中共對藏政策就是一部謊言史。

與會的香港人民力量副主席甄燊港比較了西藏和香港的歷史遭遇:正如這兩天香港大街上隨處可見的標語所言,中共對香港的接管與統治,也一路充斥着重重謊言。十年以前,大多數人對「一國兩制」、「港人治港」、「高度自治」的政治承諾深信不疑,而且認為在理解上也沒有太多分歧。不少中國內地人甚至認為,中共有意拿香港做民主的試驗田,試驗成功以後就會移植到內地遍地開花。直到今天,中共宣傳機器一邊強調「愛國愛港」、「全面管治權」,一邊還灌輸着「母親不會害孩子這種拙劣的情感欺騙。

回顧歷史,我們可以看到,從構思香港「回歸」開始,「一國兩制」就是處心積慮的謊言。

根據媒體報道,1984年發表的《中英聯合聲明》,英方「希望制訂出猶如《大英百科全書》般詳盡的協議,但中方想要的,卻是一份兩三頁A4紙大小的文件」。

最終出台這份,正文只有1,500餘字,為中共的變臉操作留下了空間。

隨着1997年政權移交而生效的《香港特別行政區基本法》,在普選條款中加入了循序漸進等模糊的限定條件。

於是,到了今年七一前夕,中國國務院就認為是用一份《白皮書》來「全面」、「準確」地理解和貫徹「一國兩制」的時候了。

在這份《白皮書》中,「高度自治權」變成了「中央授予多少權力,香港特別行政區就享有多少權力,不存在『剩餘權力』」。

「目前推行民主政治,主要關鍵在於結束一黨治國」、「要徹底地、充份地、有效地實行普選制,使人民能在實際上,享有『普通』、『平等』的選舉權、被選舉權」,「他們說這一套都是外國人的東西,決不適用於中國……中國雖然要民主,但中國的民主有點特別,是不給人民以自由的。這種說法的荒謬,也和說太陽曆只適用外國、中國人只能用陰曆一樣」。

這並不是香港的遊行示威者提出的解決方案,而是來自中共上世紀四十年代的中共機關報《新華日報》和《解放日報》。這些主張至今仍是有效的解決方案,因此很多人要求中共兌現承諾。

不過在我看來,謊言固然萬惡,但是要求兌現承諾並不是最好的訴求。即便民主政治,也難以避免討好選民的謊言。中共的這些彌天大謊,並沒有像揭謊者想像那樣,動搖了其統治地位。為中共辯護的人說,這些都是高明的政治策略,是善意的謊言。甚至有人說,它連謊言都不是--只是中共掌權後更多地認識了中國國情,改成了更適合中國發展的政策而已。

政治家或政黨說謊並不可怕,可怕的是說謊者不會受到懲罰,而且始終緊握權柄,去懲罰不甘受其欺騙者。這就要求有一套民主制度,限制統治者的權力,並且在其撒下彌天大謊時有被替換的可能。對於一個已然撒謊並作惡的領袖或政黨,僅僅要求兌現承諾,事實上是承認其說謊及作惡的權力。

還在津津樂道於至少擁有遊行抗議自由的香港人,應該想一想今天悲慘自焚也於事無補的西藏人,曾經也得到過「獨立聯邦」、「高度自治」的政治承諾。

長平


為何要逼港人走上抗爭之路? – 林本利 蘋果日報 2014年09月02日

2014年8月31日,全國人大常委為香港2017年特首普選全面「落閘」,直接戳破港人30年的普選夢。

同一日,澳門特首小圈子選舉,崔世安在沒有對手下「高票」連任。

另外傳出山西省委書記袁純清被免職,13名省委常委中近半被拿下。中國省市和特區領導人的欽點和下馬,果然別具特色。

中共建國60多年,頭30年把全國人民的精力投放在政治鬥爭中,不斷挑動階級矛盾,人民鬥人民,弄到整個國家一窮二白,經濟瀕臨破產。

1976年毛澤東逝世,「四人幫」被捕,鄧小平復出,嘗試撥亂反正,在1978年宣佈推行改革開放政策。鄧在深圳及沿海多個城市成立經濟特區,成為改革試點,效法香港資本主義自由市場,吸引港商和外資回到內地投資。

1984年,中國與英國簽訂《中英聯合聲明》,中國承諾香港九七回歸後,會落實鄧小平提出的「一國兩制,港人治港,高度自治」的方針。雖然中共領導人作出承諾,之後更在《基本法》內寫明香港最終會有普選,連民建聯亦以爭取2007及2008年雙普選作為黨綱,但由於中共過去假話謊話實在說得太多,欺騙億萬同胞和回歸華僑,故此仍然無法制止港人的移民潮。

那些願意留下來的人,一心希望共產黨會不斷改進,信守承諾,落實港人治港和雙普選。

並且在回歸後50年內覺醒,效法港澳台兩岸三地推行普選,讓人民當家作主選出領導人,建設民主中國。

九七回歸後,中央政府已欽點了三名特首,全部都徹底失敗。

首任特首董建華不斷向財閥輸送利益,賤賣土地,最後被迫「腳痛」下台。

繼任人曾蔭權試圖糾正董建華的錯誤政策,包括「西九」推倒重來,取締「發水樓」,引入競爭法等,但最終因接受富豪「海陸空」款待,離任前要接受廉署調查,難兄難弟許仕仁更被廉署拘控。

至於現任特首梁振英,原本不少市民對他還有一點期望,但經過僭建事件、港視發牌風波,以及放生地產商預售樓花,支持度大幅下挫。

回歸後17年,三名特首由中央欽點,再經由大多數沒有個人自由意志的選委選出,完全缺乏認受性,不用向市民問責,只須向選委投桃報李,給予政治和經濟利益,製造貪腐。2017年特首普選,正好改變上述現象,透過200萬名選民投票,選出具有認受性的特首,自然可以改善管治,減少政治爭拗,令施政更加暢順。

香港落實真正普選,對國家亦有積極意義和示範作用。過去數十年中共一直無法順利將政權移交,要透過權力鬥爭,鬥個你死我活才能安排好接班人。若領導人缺乏威望,由他們欽點或「叮走」接班人又如何服眾?中國走民主道路,以和平非暴力方式轉移權力,才能真正成為大國,是億萬中國人的期盼。那些只顧私利的當權者,不想中國真正富強,繼續封閉落後,遭世人白眼。

當權者指香港少數人勾結外國勢力,為到國家安全着想而要為普選「落閘」,但他們至今仍拿不出實質證據去支持說法。

若說勾結外國勢力,董建華本人及家族生意與美國有緊密關係,曾蔭權接受英國封爵,梁振英子女留英,在英國置業,個人財產存放在離岸公司,表面上更像勾結外國勢力,但仍然獲得欽點。若只是少數港人勾結外國勢力,當權者又何須擔心少數人可以操控普選結果?

相信大多數港人會接受一個沒有公民提名,但提委會真正具有廣泛代表性,以及提名門檻不高於選委會提名門檻(即八分一)的普選方案。現在當權者全面「落閘」,提出的普選方案與民建聯及工聯會的相若,較小圈子選舉更保守和倒退,無法解決特首認受性不足及管治問題,

相信將令那些對中共政權原本仍有一絲希望的港人,選擇離開香港。

而一些堅決留港,原本屬中間溫和派的人,亦只好被迫走上抗爭之路,向只顧私利的當權者全面進擊,

這勢將令香港社會進一步撕裂!

林本利


愛黨 - 李怡 蘋果日報 2014年09月02日

李飛日前指特首要愛共產黨是不言而喻。資料圖片

由於對人大的政改決定從來沒有幻想,因此對這兩天發生的事也沒有怎麼失望和憤怒。

特別的是,

李飛在前天被英國《金融時報》記者問到:香港領導人需要「愛國」,意思是不是「也需要愛共產黨」?

他的回答是:共產黨在憲法上有執政地位,香港特首有法例要求要對中央負責、擁護中央政府,故

特首愛共產黨亦是「不言而喻」。

對中央負責,沒有錯;但由此推論到「擁護中央政府」、愛共產黨,就是過度演繹了。

因為任何政府、任何執政黨都會犯錯,不能盲目擁護其所有的對或錯。

李飛昨天又說,「泛民主派當中的不少人也是愛國愛港的」。確實有不少泛民講自己愛國,不過他們從來不說愛黨。

現在清楚了吧。因為你愛的國是中華人民共和國,而不是中華民國或古代中國,因此照中共對憲法和一國兩制的詮釋,你的愛國就等同於愛黨。我們且看看有哪些泛民是李飛所說的「不言而喻」吧。


潘小濤﹕香港死於中國的「崛起」? – 明報 2014年09月02日

全國人大常委會一如所料為香港特首選舉落下大閘,特區政府據此訂出的選舉方案只能是「假普選」,比前兩屆的選舉還要退步。

很多人都問,習近平上台後,中共的香港政策為什麼「向左轉」,變得如此強硬和蠻橫無理?

其實今年兩會才是中共對港政策的分水嶺,當時李克強的工作報告罕有的不提「港人治港、高度自治」,而3個多月前他接見述職的梁振英,以及習近平去年12月31日在全國政協新年茶話會上都有提及。

此後,張德江等中共巨頭就開出「特首必須愛國愛港」的條件,並成為中港官員的口頭禪。

顯然,習近平已準備全面控制港澳,作為主要政績。

當年鄧小平以權宜之計「一國兩制」收回香港,但未竟全功,若習令港澳全面回歸,無疑是一大功績。

事實上,近年國內民族主義升溫,民間對崛起的期望不斷升高,中共須拿出更多「實際成績」去證明崛起,奧運、嫦娥奔月等已不能滿足大家「胃口」,開疆闢土、八方朝貢才算帝國復興。

台灣無法短期內統一、釣魚台及南中國海領土更難染指,最簡單的方法就是「拿回」香港。君不見,標榜民族主義的《環球時報》極關注香港議題,特別是可挑起中港矛盾的題材!

如何全面收回香港?西藏和平「解放」歷史可供借鏡。

1951年,中共與達賴簽訂《十七條協議》,許諾西藏一切不變:藏人治藏、高度自治,中央只管國防外交。

後來,中共不斷干涉西藏事務,甚至像內地般強行土改,藏人不滿而群起反抗時就指摘他們分裂,進而武力鎮壓,

達賴被迫出走,藏人高度自治壽終正寢。

若非中國崛起,北京或許還會信守對港承諾,但強大了,又何須顧忌國際社會和港人反應呢?

中國的崛起始於大批港商北上投資,將資金、技術等輸入中國,助其經濟發展,到它崛起了,香港卻因此而死亡,委實諷刺!


穿金戴銀, 信心十足, 打殘再同佢醫番 – 左丁山

http://tlfong01.com/2014/06/27/6417/


專政沒有贏 民主無得輸 – 王岸然 信報 2014年09月02日

世上總有出乎意料之外的事。人大強行落閘,自然是最差、最令人費解、也最出乎所有持份者意料之外。

這一刻,最差的評論者是發馬後炮的人,走出來說「早就批死中共乜乜物物」之類;最好的評論者是協助大家轉念,重新在思想上武裝起來。

本來以為是終點的這一年,轉個念,是起點,過去三十年的努力,只是準備,今天是爭民主大業的開始。

筆者喜見人生還有大目標,樂以忘憂,不知老之將至,美事也。

專政者的王牌,就是現時的模樣,擺明「以我為主」,以自己一方的意志作最終決定。這一「以我為主」的指導思想,在1997之前面對英國人,可說是無往而不利,每次都得到最終勝利。對一個正在撤退的殖民主義者而言,商貿是最大利益,遺下民主人權亦只是希望保護和延續利益。今天英國人在華利益得到充分「照顧」,便不會出一句話。

可笑的,只是舞龍獅旗的人、誤把 BNO 當英籍的人。

不過,專政者今天面對的不再是英美敵人,而是自己的國民;更麻煩的是,香港人早已是化外之民,而化外之民還不是英美之民,用來對付外敵的「以我為主」手段,注定沒有可勝之道。

今天中共的對港政策,可算是一敗塗地。

回歸之初,最少有十年時間,中央政府在港人心中的民望遠高於特區政府,現時反特區政府和中央政府的情緒,可說是歷史新高,還出現港獨之論,雖然只是情緒發洩的虛言,但甚有市場,且成為潮語,已經證明中共對港政策是如何的失敗。

今天擺在支持民主的人的面前只有一條路——只有抗爭,沒有對話。

對於由第一代人物操控的泛民主派會起而抗爭,筆者沒有期望,只希望他們能堅定地否決政改任何提議,然後把精神放在培訓新一代民主派的工作之上。新一代的人不一定要更勇敢,但要更有智慧,能感動大多數港人起而行動;在全方位作出抗爭,任何事情只要有利對專政者施加壓力,就要去做,勿以善小而不為,一條全民抗爭的道路,必須依靠所有人在本身的位置上起動和參與。

相信很多人在未來日子會向「佔中」發起人多加責難,而那只是懦夫所為。「佔中」運動筆者過去年半時間大力支持,但從不樂觀,亦深明泛民由始至終都只是想利用運動「靠嚇」。兩位書生加一位牧師,沒有任何社運經驗,紙上談兵,搞出這樣的氣勢,比任何一個誇誇其談的社運小學雞單位都要成功。

(節錄)


沒有談判空間 佔中恐失控 – 黃世澤 香港經濟日報 2014年09月02日 星期二

雖然在全國人大常委通過政改方案前,香港有不少人,包括筆者在內,都試圖由不同途徑提出可以平衡各方觀點的方案,

但全國人大常委最終通過一個最糟的政改方案,香港政局勢必風起雲湧。

拒改革派 伊朗式選舉不如

雖然有篩選的特首選舉,往往被諷刺為「伊朗式選舉」,但伊朗的憲法監護委員會篩選候選人的時候,也會容忍改革派的候選人參與其中。

2013年的伊朗總統選舉,便是改革派過半票下勝出,當選伊朗總統。盡管伊朗總統選舉結果,都被加拿大等國批評為假普選,但至少仍有一點反映民意的成分在內。

而全國人大常委通過的特首普選案,限制候選人人數為二至三人,一定要得到過半數提名﹔而特首的提名委員會的組成與現時特首選委會一樣,幾乎是中共可以完全掌控,甚至比過往選委會時更糟。

不否決方案 泛民必遭「報復」

選委會的提名門檻低,泛民控制了專業界別的選委名額,再搭上在立法會的議席便湊夠數提名參選,現時連入閘陪跑的機會也沒有,更不用說像伊朗一樣,有望改革派人選可以選上,可以透過掌控行政機關改革政治。

亦由於沒有任何希望讓泛民主派執政改革政治,這種一點空間都沒有的政改框架,任何泛民主派成員都不會接受,換言之,絕大部分的

泛民主派成員情願也好,不情願也好,都會否決政改方案,因為他們不否決政改方案的話,在2016年立法會選舉肯定會遭到大報復

民主黨在曾蔭權政改後遭激進民主派成員追打,若非部分溫和建制選民過檔民主黨,恐怕民主黨早遭沒頂之災。因此,政府期望有泛民成員支持政改方案的可能性幾乎零,

湯家驊資深大律師在人大常委議案前通過的表態,都可以推算到議案獲通過可能性之低。

在1911年5月8日前,孫中山領導的革命黨仍然未取得壓倒性的優勢,當時仍然有一群立憲派,支持大清帝國政府走向君主立憲道路,反對孫中山推翻帝制。

但1911年5月8日清政府公布皇族內閣名單,滿洲人把持重要大臣位置,漢人大臣位置可有可無的時候,

立憲派便完全心死,之後出現立憲派大搞四川保路運動,藉四川鐵路的股權問題大搞公民抗命。

清末保路動亂 佔中恐翻版

四川保路運動本來都標榜公民抗命,只限罷市罷課,不抗武裝運動,

但隨四川保路運動不斷發大,有很多革命黨支持者,或失望的立憲派人士,都以保路之名行革命之實,1911年9月底四川已有縣政府脫離清政府控制,這亦迫清廷由湖北調兵到四川鎮壓起義,間接導致10月10日晚完全急就章的武昌起義成功。而辛亥革命成功之後,四川更是一夜變天,清政府兵敗如山倒。

就算戴耀廷教授如何竭力控制佔中運動發展也好,照四川保路風潮的失控經驗來看,佔中最後變成甚麼樣子的民眾運動,就連戴耀廷都不見得有把握控制。

連十八學者之一的方志恆教授,都在香港電台香港家書節目中公開呼籲中止與北京談判,參與佔中以及以「本土運動」之名捍衞香港核心價值。

很明顯香港這次政改破局將成清末翻版,而有四川保路風潮的歷史教訓在前,北京仍要推這樣糟的政改方案,純以理性策略而言,完全令人百思不得其解。


守護尊嚴 守護未來─致專業界的公開信 – 黎廣德 蘋果日報 2014年09月02日

人大決議封殺的不僅是香港的民主進程,更是香港的發展前景。資料圖片

炎炎夏日,可能不少朋友剛外遊回港。人大常委的政改決議,未必是大家最上心的大事。無論大家的政見如何,希望都仔細想想,人大決議為何是影響自己和危害下一代發展的頭等大事。

人大決議的本質是宣佈由今天開始,中央政府透過一套提名和普選的包裝,委任中共屬意的人選成為行政長官。無論誰當特首,他都毋須面對真正的政治競爭,但必須百分百效忠當時掌權的中共領導人。

這套制度的效果,是把香港拉向內地的管治體制,最終香港的貪污腐敗與社會不公也必然與內地看齊。

因為特首毋須面對競爭卻要討好他的權力來源,必然會容忍兼且包庇貪腐,加劇利益輸送,資源投放親疏有別,反而環境破壞與貧富懸殊等社會矛盾被政府置之不理。香港發展陷入困局,專業人士最珍惜的公平市場環境將一去不返。如此下去,我們的事業能夠發展嗎?我們放心下一代能夠安居樂業嗎?

因此人大決議所封殺的不僅是香港民主進程,而是香港發展前景。

各人的處境不同,或許你今天開拓的內地業務令你有賺錢空間。但明天呢?當北京視香港特首為傀儡,香港市場是內地人和內地企業的主場時,你的子女還有發展空間嗎?

在中央的強權面前,我們未必有在短期內改變現實的能力,但我們今天有能力發聲,有能力告訴身邊的每一個人:政改離我們並不遙遠,因為專權腐敗的力量正在侵蝕我們生活中的每一寸空間。

不要小看幾句說話的力量,因為北京最害怕就是香港人拒絕生活在謊言當中。只要你發自內心,每一句給身邊人的說話都會帶來新希望。尤其是專業人士,你的聲音可以影響更多人,可以用更多創意令當權者不得不改弦易轍。

惟有如此,我們才能守護自己的尊嚴,守護孩子的未來。

黎廣德


港殤那日的傻仔與巫婆 – 林夕 蘋果日報 2014年09月02日

剛過去那週日,有人稱之為港殤日。

那日,該有許多傻仔,不知你是否其中之一。在傷逝中淚與怒。若是殤,種種死相早有跡可尋,有屍臭可聞,早有一堆行屍走肉,滿臉堆歡提前預告了訃聞;當初樂觀得太早,夢發得太長,如今悲傷得太遲,還不是傻仔?

有些資深傻仔,為民主回歸扭足了三十載傻勁,既擅於被騙,又樂於不斷上當。一次次階段性失敗,把

又傾又砌當成打情罵俏

苦戀到山無稜天地合冬有雷鳴夏有雪,方敢與君絕。

有些以為蒙主寵召,就可爭取雙贏的傻仔,熱心提出許多續命配方,結果發現只是臨時演員,被狠狠地敷衍了玩弄了被刮了一大巴掌,痛心到欲語無言。

又有一德高望重傻仔,竟然還順道為十三億人哭喪,竟不知那些人根本不知也不想知道你何以哭喪,知情的,幸災樂禍者多,跟你同聲一哭、有兔死狐悲的覺知者稀。示範單位老早給粗暴地遷拆了,大勢是用金權掐住兩岸三地的咽喉啊,傻仔。

那日,另有一枚傻仔,自詡早知如此,何必攪動徒然的情緒。又明知如果只是透過文字看訃文,還不致於動氣,路漫漫,有氣該留下來爭一口氣。但雖然歷史在重演,我們的命中命中,越醜陋的東西,傻仔居然越想看那訃聞的人肉版。

但見屏幕活現一枚人大談訃聞內容敲定時,他們全體贊成,一致鼓掌,仿佛那是出乎他們望外的喜訊。

也難怪有另一枚巫婆,一直裂開了血紅大口,裂出一個普天該同慶的表情,笑答什麼叫保守?有得你普選就不叫保守。

傻仔一想到這巫婆也曾經為人,但凡有點常人的感覺,也不會為如此毒辣的訃文滿意成這樣,這是在被你代表的人的屍身上灑鹽,而你腐肉砌出來的紅臉,應該不知臉紅,確實為慶祝成功爭取二分一入閘門檻,所以紅光滿臉;又因為發明了為政改爭議剪布這詞兒,被大老闆在直播新聞會上引用,以致紅粉緋緋如待嫁巫婆。

傻子於是為人性之墮落無下限、巫婆人渣妖獸之無量數而動了真氣,一時沒能緊守自己崗位,幹不了活。

傻仔那日直看到那晚,眼又冤又乾涸,於是,滴了許多人造淚水。

林夕


庫斯克:愈看愈想嘔 – kurskHK.net 庫斯克 2014年09月01日

http://www.kurskhk.net/politics/%E7%9C%8B%E8%91%97%E3%80%8C%E6%9C%80%E5%A4%A7%E6%B0%91%E4%B8%BB%E6%B4%BE%E3%80%8D%EF%BC%8C%E6%84%88%E7%9C%8B%E6%84%88%E6%83%B3%E5%98%94/?utm_source=rss&utm_medium=rss&utm_campaign=%25e7%259c%258b%25e8%2591%2597%25e3%2580%258c%25e6%259c%2580%25e5%25a4%25a7%25e6%25b0%2591%25e4%25b8%25bb%25e6%25b4%25be%25e3%2580%258d%25ef%25bc%258c%25e6%2584%2588%25e7%259c%258b%25e6%2584%2588%25e6%2583%25b3%25e5%2598%2594

特首提名委員會「是一項偉大的政治發明」…. 促進共識民主、避免數人頭,為世界民主作出獨特貢獻,

「愈看愈可愛」(人大常委會法工委副主任張榮順)

中央是最大民主派。(港澳辦副主任馮巍)

立法會功能組別也是直選,只是看選區,而非居住地,有些選區由選民來選,有些由法人來選。(人大常委會副秘書長李飛)[報導連結]

李飛還這樣說過:

行政長官要求要對中央負責、擁護中央政府,故特首愛共產黨亦是「不言而喻」。

政改成功即「標誌回歸20年,香港就完成西方國家100年才完成的民主歷程」。 [報導連結]

中國共產黨果然是國民教育手冊形容的「進步團結無私」的執政集團,香港政改為世界為世界民主作出貢獻,按道理不只是香港人,而是全地球的人民也應該感謝中共?

中共是最大民主派,那麼行政長官候選人就算要提委會過半提名,也100%肯定有民主派入閘了?

功能組別也是直選?那麼立法會豈不是一早已經「全面直選」,以後大家也不用再爭取普選立法會了?

真係好想嘔。

這種密集的自瀆式講話,過往通常只會在親共圍內嘅座談會講,今次李飛和他帶來的共幹,在香港土地上如此高調地公開講,是擺明車馬侮辱你們香港人。現在他們連國王的新衣也懶得扮穿,直接光著身子出巡,還要你們讚國王雄姿勃發。

中共這個姿態代表了一個 inconvenient truth(絕望真相),那就是中共對香港政策已經由左變為極左,由白皮書開始,他們連統戰門面功夫也不再做,擺明要強硬宣示他「全面管治」的本質。

現在的人大決定根本不是西方式民主,而是伊朗北韓式選舉,在他們眼中這就叫「完成民主歷程」,即是這次已經完了,還想 「袋住先」,日後再改良?不要妄想了。

事到如今,跟中共已沒有什麼好談,我們就看看已經進入國家經濟增長開始放緩的中共可以捱多久。

祝願天下所有暴政不得善終。


沒有贏家的對弈 – 李兆富 蘋果日報 2014年09月02日

北京這次政改將泛民一面倒地推向對立面,從此雙方再難建立互信。資料圖片

這是一場不會有贏家的對弈。

北京不是想香港穩定地被管治嗎?這次所謂的政改,將泛民一面倒地推往對立面;他們未必有絕大多數的優勢,可是泛民在香港的中產,支持者絕對不少。將不滿的情緒壓縮起來,就像提煉高濃度放射性元素一樣,除了是為了製造核彈,我想不到有甚麼其他目的。

泛民有贏到甚麼嗎?表面上,這是泛民過去十年來,最團結一致的日子;也有不少本來屬溫和中間派的香港人,走向泛民光譜那邊。經歷這一次,不但泛民與北京很難再建立任何信任的基礎,泛民也難以回到中間溫和的定位,長遠令泛民自困在那狹窄一端。

建制派在是次政改,刻意低調。

八月的連串大龍鳳,並非由建制派的兩大政黨打頭陣,反而由甚麼同鄉宗親會牽頭,可見在政治最前線的操作員,隱約地也感受到,就算不支持佔中的沉默大多數,也不想香港失去高度自治的地位。其實這一屆政府,已經令許多港人意識到所謂的一國兩制只是美麗誤會。

香港人,只是想香港繼續是我們熟悉的香港,北京卻老是要香港毫不含糊地成為中國的一部份。

請不要搬出一百幾十年的家仇國恨來跟我說外國人欺凌中國人。

要知道當年若非老佛爺借那個跟ISIS和塔利班沒有兩樣的義和拳到處屠殺二百多個洋人和兩萬多華人基督徒,也不會鬧出史上第一次聯合國維和行動(八國聯軍)。

再講,冤有頭債有主,美國人將賠款用作興建清華大學;稍有讀過歷史的都知道,當時最想在中國擴張領土的,其實是俄國,也是中共意識形態的始源。

最終,義和拳連光緒、奕匡和李鴻章都想誅殺,清廷向外人求助。知識分子余英時就曾經講過:「八國聯軍侵略中國是中共製造出來的謊話──如果你稍微說幾句公道話,說外國人有外國人的道理──你馬上就被看成『二毛子』、『漢奸』。」

白皮書不斷強調外國勢力,我很擔憂。也請恕我受英國作家奧維爾的影響太深;在人民內部製造敵我矛盾,這個民族一世紀以來,難道一點長進也沒有?

李兆富


另一種思維 – 李純恩 蘋果日報 2014年09月02日

這天看梁文道接受報紙訪問,說到香港亂局。他舉了個大陸的「維穩」例子,說一個經常在家鄉被維穩人員針對打擊的青年,當他想離開家鄉到外地謀生的時候,那些維穩人員卻主動找上門來,請他不要走。原因是有他在,維穩人員才有工開,才有存在價值。

一旦他走了,沒了「不穩定因素」,那也就不用再維穩,維穩人員的飯碗不就砸了?

梁文道用這個例子來看香港,意思是說,如果香港風平浪靜,事事順遂的話,香港有些人在中央眼裏也就沒有什麼作用了。唯有香港多事,亂作一團,他們才有顯出本事的機會,才有叫中央依賴的本錢,才有存在價值。

這種說法,你當然可以當作一種臆測,但也可視作另一種邏輯思維。

這一年多來,特區政府惹了不少事,從「國教」到「港視發牌風波」,許多矛盾和風波原本都是可以避免的。

當這些事情發生的時候,大家的第一個感覺就是為什麼這麼笨,為什麼要如此引火燒身。

然而這些事情接二連三地發生,每一次都鼓動了大規模的遊行集會,上萬人上幾十萬人的反抗聲勢,聚集的畫面傳到北京,感覺一定是「××勢力亡我之心不死」,這自然就會有指示了,要某些人嚴陣以待不得鬆懈,那麼得到指示的人也得到「被依賴」,有事可做,有表現可發揮,最後還有功可領。

以這樣的邏輯推論,香港之亂,表面上是什麼民主、建制之爭之亂,實質上,或許是有人唯恐天下不亂。鷸蚌相爭,漁翁得利。這漁翁是誰呢?

李純恩

.END

Leave a comment

Filed under Uncategorized

一线城市房价泡沫现象 – 朱海斌

经济学人朱海斌:一线城市房价泡沫现象最明显 – 2014-09-02 新京报

经济学家朱海斌认为,限购是临时行政性措施,非长期安排;取消限购,房价不一定会“起来”。

这一轮楼市调整将持续一至两年,部分城市房价跌幅或达20%,三线城市的去库存周期会比较长,但房价崩盘的可能性依然很小。

  经济学家朱海斌认为,限购是临时行政性措施,非长期安排;取消限购,房价不一定会“起来”

  “青年经济学人” 评选系列报道之十五

  朱海斌

  2011年9月加入摩根大通,担任摩根大通中国首席经济学家和大中华区经济研究主管。在此之前,朱海斌于2001-2011年任职于国际清算银行,先后担任经济学家和高级经济学家。研究方向专注于金融体系和实体经济的传导,风险管理和金融监管,中国经济和房地产市场。朱海斌于2001年获美国杜克大学经济学博士学位1996年获中国人民银行研究生院硕士学位,1994年获北京大学信息管理系学士学位。

  ★ 核心观点

  这一轮楼市调整过程需要的时间可能比以往更长,但房价崩盘的可能性依然很小。这一轮调整将持续一至两年,部分城市房价跌幅或达20%,三线城市的去库存周期会比较长。地产调整已成为中国经济下半年下行的最大压力,短期会有更多的城市取消或者放松限购。

  部分城市房价跌幅或达20%

  新京报:你最近表示,在全国范围内,一两年内房价降幅不超10%。如何得出这个结论?包括北上广这样的一线城市在内吗?

  朱海斌:一两年之内房价降幅不会超过10%指的是全国平均房价,区域之间、城市之间会有不同,部分城市可能会达到20%,甚至20%-30%之间。其中,一线城市房价泡沫现象最明显

  用房价收入比的指标来看,北京、上海、深圳的房价收入比在15到20之间,中国正常的水平可能应该在6到8之间。相比之下,欧美国家大部分房价收入比在4到6之间,也就是说4到6年的收入就可以买当地一套普通住房。中国房价的地区差异比较明显。

  北上广房价远超正常水平,但一线城市相对需求最大,反而价格相对稳定。短期房价下跌幅度最大的是一部分供大于求比较明显的二线城市,但是二线城市市场对价格的弹性比较大,降价后会刺激需求、促进销售。三线城市则要经历比较长的去库存周期。

  新京报:怎么测算房价不会跌10%?

  朱海斌:影响我国房价的主要因素包括城镇化进程、居民收入、货币供应量、房地产市场供需变化和人民币汇率。其中,近两年出现明显变化的是供需变化比例和货币供应量,这是导致本轮房地产市场调整的最主要原因。

  2012年开始房地产市场出现了供大于求的状况。货币供应量从2009、2010年时比较宽松到现在慢慢回到中性。在其他几个因素中,虽然整个经济增速在下滑,但居民收入增速维持在高位。去年家庭名义收入增长10%左右。一般来说,收入上升比较快的地方,其房地产调整过程中房价下跌的幅度较小。因为房地产调整本质是房地产出现泡沫,房价超出居民消费能力,调整的目标是让房价收入比降到一个更合理的水平。途径有两个:房价下跌,收入上升。

  全球金融危机期间,欧洲几个国家和美国房地产“大调整”很重要的一个原因是居民收入基本上不变,甚至有些国家是下降的,调整结果就是房价大跌,美国跌了30%,英国跌了10%。

  新京报:关于中国房地产市场触及“拐点”的论调不绝于耳。房地产的黄金十年已经过去吗?

  朱海斌:我认同这个观点

  新京报:你所说的拐点是什么拐点,是供给拐点、需求拐点还是房价拐点?

  朱海斌:从目前数据来看,供给的拐点最先出现,供大于求状况2012年出现,此后供应量不断增加,短期的供给已经明显大于需求。今年1月份开始,新开工面积同比大幅度下滑。房价的拐点出现在4月份,到目前为止环比下降了2%左右。需求的拐点还没有出现,预计未来5年内需求仍比较稳定。

  需求拐点没有出现,意味着这次房地产更可能经历一次调整而不是崩盘。我们估计未来几年需求量将维持在10亿平方米的水平。经过调整,供需会重新恢复平衡。我国房地产目前的情况,是供大于求之后市场的自我调整。

  新京报:你反对“中国房地产即将崩盘”的说法,原因是中国的城镇化进程给中国房地产带来平稳增长空间。但瑞银中国首席经济学家汪涛6月公开发表文章称,新增城镇人口对住房的需求没有想象那么大,很多人高估了城镇住房市场的实际刚需。这和你的观点相左。

  朱海斌:国内地产市场的刚需来自三个部分,第一个部分是新进城的新增人员;第二个部分是改善住房的需求;第三类是旧房重建。汪涛表述的是第一个部分。确实,新进城的人口并不是100%对住房都有需求,比如乡改镇、镇改县,由于建制的变化一些居民被城镇化,他们通常不用买新的住房,这个有可能占到新增城镇人口的50%。“新增的流动人口不会很快买房,住房的需要没有想象得那么大”,这个理解是有偏差的。因为从城镇化过程带来的需求并不是当期的需求,它是一个滚动式的需求。

  我们不能奢望房价能够降到让刚进城的农民工和刚毕业的大学生都可以马上买房,那同样不是一个合理的现象。所以今年城镇化带来的住房需求,对应的可能是五六年之前进城的那些农民工,或者是说五六年前毕业的大学生,这是个滚动式的过程。

  房价调整会持续一到两年

  新京报:这次调整和2012年的房地产调整有何不同?

  朱海斌:二者有很多相似之处,包括市场供大于求和楼市各项指标的下滑。不同之处是2012年供大于求是区域性的,主要体现在东部沿海地区和一些高房价地区。目前的供大于求是全国性问题。

  新京报:现在房地产供大于求的情况有多严峻?

  朱海斌:两个指标可以参考。一个是全国在建的住房面积跟过去一年的住房销售面积的比率。这一比率在2013年底达到4.2,也就是说,要把目前在建住房全部卖完需要约4.2年,而历史平均水平是3.3年左右;第二个是库存指标,目前我们追踪的八个大城市平均库存大概是18个月,去年年底时也就10个月左右,目前水平远远超出历史平均值。

  新京报:你怎么评价这次楼市调整的性质?

  朱海斌:从需求来看,目前还是比较稳定的,政策上还有一定的调整空间。从整个行业来看,目前很多开发商的利润是15%左右,如果房价降幅超过15%,就会成为一个分界线,开发商会大幅削减未来新开盘或投资。从宏观角度,对房地产投资增速下滑会加大,对宏观经济造成更大压力。从这点看,政策不会容忍崩盘式的调整。

  目前来看,这次仍是一个温和的调整。

  新京报:这次的调整期会有多长?

  朱海斌:房价调整会持续未来一到两年,从今年4月份开始算,全国平均房价可能会持续下调5到10个百分点。

  调整引发宏观风险或大于金融风险

  新京报:最近地方政府救市热情高涨,楼巿政策松绑此起彼伏。但就目前来看,多数放松限购城市楼市成交量仍旧低迷。怎么评价现在地方政府的救市行为?

  朱海斌:取消限购有利于销售回稳,但楼市价格不一定会起来。今年退出限购是比较合适的一个时间窗口。限购本身就是一个临时的行政性措施,而不是中长期的政策安排。在目前整个房地产市场整体供大于求的情况下,取消限购是一个正常的政策反应。

  新京报:过去几年政府也参与了地产调整,但为何房价越调越高?为何这次房价顶不住了?

  朱海斌:从1998年房改到2011年的13年里,大部分时间房价都是上升。房价上升主要由两个因素决定:一个是市场因素,1998年房改的时候,房价是低于市场价格的;另一个因素就是供求关系,2011年前一直是供小于求的局面。

  2012年的调整并没有持续太久,主要原因是货币政策放松,2012年年中中国人民银行连续地下调利率和存款准备金率,信贷也重新加速。

  从目前的观察看,今年下半年货币政策很难宽松,信贷增长会保持稳定。当前的宏观经济政策并不支持房价在短期调整后的复苏。

  新京报:你认为,中国房地产接下来的调整期,取决于政策是不是出现大的变化。你期待政策如何调整?

  朱海斌:短期会有更多的城市取消或者放松限购,这是目前政策调整的重点方向。另外,7月份以来首套房房贷利率出现下滑,也会有利于市场压力减轻。如果这些措施还没有起作用,下一步有可能会出现二套房的房贷政策调整。

  总体而言,本届政府没有特别多直接的政策出台(干预市场)。房地产市场的长期制度安排需要注意三个方面:一个是房地产税收政策(包括房产税)的制定和执行;第二个是要考虑存量二手房政策(包括租房);第三个是保障房政策。我认为相关政策还是有调整空间的。

  新京报:在保障房政策方面,存在哪些问题?

  朱海斌:我认为政策应针对不同城市,进行不同处理。具体来说,要加强一二线城市的保障房建设,减少甚至取消三四线城市保障房的建设。因为一二线城市房价收入比很高,中低收入阶层根本买不了房。在三四线城市,房价本身相对合理,保障房跟商品房的价格差别并不是很大,导致保障房跟商品房有一些直接的竞争,在这些地方并不需要大规模的保障房。

  新京报:如果政府不“救市”,会发生哪些连锁反应?

  朱海斌:用“救市”形容,有一些偏颇。政府在这一段调整里,更多是托底的功能,控制尾部风险。房地产的正常调整政府不应该干预,如果超出一定的幅度,影响到整个经济运行,政府应该采取一些逆周期的措施,控制尾部风险。我们判断,今年房地产调整可能引发的宏观风险会大于金融风险。

  新京报:为什么?

  朱海斌:房地产市场的调整会导致房地产投资增速的下滑。房地产投资是支柱产业,占整个固定资产投资的25%,对GDP直接的贡献率在12%-13%之间。房地产投资下滑会直接影响固定资产投资的增速,也会直接影响经济增速,如果投资下滑太快,经济可能就会出现硬着陆。这样实体经济的其他部分,如贸易、制造业都受到波及,银行整体的不良贷款率会上升。如果说有金融风险的话,我们担心的是由宏观向金融传导的这样一个传导机制。

  爆发财政危机的可能性非常小

  新京报:房地产调整已经成为中国经济下半年下行的最大压力,是否也会给稳增长带来难题?

  朱海斌:今年下半年最大的压力是房地产市场调整导致的房地产投资下滑。另一个宏观风险来自财政压力。去年地方政府土地收入4.2万亿,相当于去年地方总支出的三分之一左右。我们预计今年土地收入会下降15%到20%。如果土地出让金下滑15%到20%的话,地方政府的资金来源会受到很大影响。

  目前稳增长政策的一部分还是提振内需。基础设施建设和保障房建设目前大部分是由地方政府提供财政支持的。如果土地出让金下滑,这也会给稳增长带来难题,就是地方政府既没钱又要投资。当然,开放民间资本投资和PPP(公私合作模式)是可能的解决方案。

  新京报:今年地方政府发债额度达到4000亿元,其中地方政府背负实有债务中,将有2.4万亿到期。在房地产不景气的情况下,地方政府的财政问题进一步恶化。有分析称,地方政府今年会爆发财政危机。你怎么看?

  朱海斌:中国出现财政危机的可能性还是非常小的。第一我们看政府负债水平,在国际上属于中游或中上的水平。中央政府、地方政府,包括像铁路总公司这些部门的负债全都加起来,大概占GDP的60%。另外,从政府的资产负债表来看,中国政府拥有大量资产,其实负债率相对来说是比较健康的。整体看,中国爆发财政危机的可能非常小。

  今年或者未来一两年内,市场担心的主要是流动性问题,而不是违约问题。最近几年投资的项目要完成还需要融资,而现在土地出让金下降,中央又加强了对地方政府融资平台的监管,这给地方政府融资带来困难。

  新京报:你预测中央会动用哪些政策来促增长?

  朱海斌:一方面,政府会继续强调通过基建、保障房、环保等定向领域投资来稳增长。另外,政府也在尝试通过改革寻找新的经济增长点。李克强总理一直强调几件事情,第一是简政放权,开放民间资本投资;第二,降低实体投资融资成本;第三,减轻企业的税费负担。这三点都是从供给方着手的,也体现了本届政府的新思路。目前看,这几点执行并未到位,我预计这些是下半年工作的重点。

  【人物】

  经济学家中最尊敬林毅夫

  他是新凯恩斯主义者。他既主张为市场多留空间,又赞同一定程度的政府调控。

  在中国诸多经济学家中,朱海斌最尊敬林毅夫。理由是林毅夫创办了中国经济研究中心,对下一代做经济研究的学者影响非常大;同时林毅夫致力于探索适用于发展中国家的新增长模式。

  “我不一定同意他的观点,但是探讨怎么样跟中国的国情结合起来,形成与中国经济发展相关的经济理论,而不是人云亦云,这点上林是很值得尊重的。”

  这也正是朱海斌做研究的出发点,和中国国情结合,不一味套用国外理论。

  朱海斌在国际清算银行任职11年,2011年加盟摩根大通,担任摩根大通中国首席经济学家和大中华区经济研究主管。虽然履历非常“国际化”,但他并不会直接套用国际标准来研究中国当前的问题,而是从中国国情分析,稳妥地提出短期、中长期两种方案。

  在采访过程中,面对每一个问题,朱海斌都会用严密的论证方式进行回答。提观点、摆事实、讲道理,同时说明可能存在的个别问题,最后总结核心观点。朱海斌给人的感觉是,严谨睿智,但隐藏锋芒,绝不激进。

  他认为,当前中国改革的症结在于执行力不够,因此确保改革措施落到实处,应该成为下半年政府工作的重点。

  ■ 同题问答

  Q:对2014年的经济、社会运行,你最大的担忧是什么?

  A:宏观经济运行担心的还是房地产,准确地说是房地产投资的调整幅度。

  Q:十八届三中全会确立的300多项改革中,你最关注哪一项?

  A:土地改革。这是目前诸多改革领域中最关键的一环,也是最难的一环。

  Q:评论认为,未来两年是上述改革推进的重要窗口期,你认为两年内,最有希望改变现状的一项改革是什么?

  A:金融改革。

  Q:未来10年,你认为哪一个行业最具有投资前景?

  A:健康或养老相关的行业。

  Q:怎么看待知识分子的社会责任话题?

  A:作为知识分子最重要的两条,一是独立思考的能力,二是分析要尽量做到客观。

  Q:对于中国的诸多经济学家,你最为尊敬的是哪一位?

  A:林毅夫教授。

  采写/新京报记者 林其玲 实习生 陶平颖

  摄影/新京报记者 王嘉宁

编辑:闫宪宝


金融高管薪酬与员工差百倍 – 新华社 2014-09-01

中共中央政治局8月29日审议通过了《中央管理企业负责人薪酬制度改革方案》。有分析认为,作为国有金融机构改革的重点领域,触动利益最大的群体之一是金融业央企负责人。

■ 高薪之外还有“隐性福利”

■ 国有金融机构成个别官员“养老院”

 综合新华社上海8月31日电 中共中央政治局8月29日审议通过了《中央管理企业负责人薪酬制度改革方案》。有分析认为,作为国有金融机构改革的重点领域,触动利益最大的群体之一是金融业央企负责人。

  “新华视点”记者调查发现,被视为最赚钱的垄断金融机构收入“鸿沟”巨大,“高管干一天,柜员干仨月”;薪酬标高,旱涝保收,赴国有金融机构任职甚至沦为个别官员的“养老归宿”。

“高管干一天,柜员干仨月”

  今年的A股“半年报季”恰逢央企限薪令出台,尽管半年报中不披露高管薪酬,但“降薪”还是成为五大国有银行在新闻发布会上绕不开的话题,目前农行、工行高管纷纷表态支持中央限薪令。有消息称,建行总行拟将推行减薪方案,行领导减半,部门老总减三成,处长减两成,员工减一成。

  从国有控股金融机构年报来看,一段时期以来,“一把手”固定薪酬普遍超过百万,部分高管已突破500万元。

  仅在2013年,A股16家上市银行共为管理层发放了4.8亿元薪酬。工农中建交五大行年报均公布了高管的固定部分薪酬,其董事长平均为103.73万元;其中,两家已发布年报补充公告显示,工行董事长姜建清去年最终薪酬核定为199.56万元,2013年5月底才出任中国银行董事长的田国立8个月拿了135.82万元;保险高管同样不低,中国人寿总裁2012年最终薪酬160.42万元,中国太保董事长高国富2013年报酬税后总额为190.2万元;而2012年和2013年年报中,中国银行信贷风险总监詹伟坚取酬596万元、574万元,连年问鼎国有上市银行,加上绩效年薪后更是达到了850万元。

  记者调查发现,高管与基层职工间的利润分配标准不健全。一些地方的小银行问责时“重一线轻高管”,发钱时却对管理层“更敢发大钱”,高管与基层职工收入悬殊。

  以中行信贷风险总监一职为例,2013年平均日赚1.57万元,加上绩效部分则日进2.3万元。记者在长三角地区的调查发现,部分银行的派遣制“编外”柜员年收入仅5万至6万元,“高管干一天,柜员干仨月”,高管薪酬超过基层员工约百倍。

  业内人士表示,由于普遍按级别确定收入系数乃至增速,各类金融机构内部收入“鸿沟”日渐拉大。

“官大”就能拿高薪

  2013年,A股上市公司中最终年薪超过500万元的公司高管有53位,金融类机构占近半壁江山。

  不少金融业内人士反映,与接受股东监督的上市大行相比,一些地方中小金融机构的待遇情况更隐蔽,大量未上市的地方“国字头”控股银行薪酬披露还“犹抱琵琶半遮面”。从财政、审计等监管部门发布的整改情况看,以报销名义发放职工补贴、按岗位确定“固化”薪酬增幅等做法,存在于多家地方城商行、农商行。

  一方面是高薪酬、低风险,而另一方面,赴银行任职却往往仅靠“一纸任命”就能获取动辄超百万的年薪。

  据中央第四巡视组通报,吉林省有多名副省级领导干部违规担任金融机构董事长,其中受贿1919万元已被判无期徒刑的吉林省原副省长田学仁,退休后便选择任吉林银行董事长“发挥余热”。青海银行、浙商银行、齐鲁银行等一批地方国资持股银行高管,也调任自政府官员,部分官员“跨业”前并无企业经营经历。

  “银行薪酬高不高应由市场决定,但部分机构薪酬机制没有与工作责任挂钩,高管任免与问责没有市场化,靠‘官大’就拿到高薪。”复旦大学经济学院副院长孙立坚指出,国企薪酬机制不能助长不劳而获。

“旱涝保收”

  对金融业高管来说,薪酬高的同时还能旱涝保收。例如,成都银行年报显示,其行长、副行长等管理层平均薪酬多年上百万元,水平频频赶超五大行。然而,2012年其净利润增速从48%缩水至5.74%,同比放缓近九成,成为业绩最差的排队上市银行。

  财政部也曾通报,郑州、呼和浩特等地城商行薪酬管理违反规定,高管薪酬逆势大涨,限薪令执行不到位。

  国资委、银监会近年已多次要求,国有企业薪酬改革应与绩效挂钩,商业银行的薪酬机制也需与治理要求相统一。“但现实中,不少国企高管多数时候都旱涝保收。”某银行上海分行去年因坏账核销,利润从50亿元骤降至2亿元,降幅超过九成,高管薪酬却未受影响。

  专家建议,从国有金融机构改革的需要来看,规范任职、薪酬机制可以走市场化的“双轨制”之路,还要刹住官员赴金融机构任职之风。

  《商业银行稳健薪酬监管指引》已要求,商业银行应制定绩效薪酬延期追索、扣回规定。银行有权视任职期间过失,向高管追回绩效薪酬。“金融危机后,发达国家银行高管普遍采取薪酬延期支付,动辄因贷款损失被追索薪酬。但至今为止,国内还没有一名国有金融高管因坏账、违规放贷,被追索或止付薪酬。”孙立坚说。

录入编辑:薛冬霞


“相亲角”9年:父母们的集体焦虑 – 东方早报 2014-09-01

从最初的阿姨爷叔为子女相亲到最近的各类婚介穿插其间……年代更迭,父母对子女寻觅另一半的关切之情却始终未曾变换。

  自2005年6月起,每逢周末和节假日,在上海人民公园的北角,就会上演“白发相亲”的街头剧,成百上千的父母像赶集一样,带着列有子女各项相亲条件的“简历”聚到这里,以“摆摊”、“挂牌”的方式,为子女寻觅结婚对象。最早是人民公园内锻炼身体的老年人开始互相交流,随后,发展为上海市全市老年人集中在人民公园进行交流。

  人民公园“相亲角”人山人海如同赶集般的热闹已有9年历史,从最初的百人规模到如今的千人规模,从当年聚集于著名的5号门到如今延伸至园内的荷花池,从最初的阿姨爷叔为子女相亲到最近的各类婚介穿插其间……年代更迭,父母对子女寻觅另一半的关切之情却始终未曾变换。

  于是,比早在1980年代出现的人民公园“英语角”晚出现的“相亲角”,后来者居上,甚至成为上海地标之一。

  人民公园“相亲角”不仅成了上海地标,也成了专家学者研究的对象。“每逢周末和法定节日,上海市HP(黄浦)区NJ(南京)路附近某公园的北角人头攒动,熙熙攘攘。一群中老年人三三两两,或立或坐,以品评的目光相互打量。这些人或是拿着写满信息的纸牌四处游走,或是站在自己的‘摊位’前面。这里就是上海‘相亲角’,一个特殊的公共聚会场所。‘相亲角’中上演的并非是‘剩男剩女’的戏码,真正的主角是他们的父母——当年的知青一代。知青一代在婚恋大事上曾经被‘组织上关怀’,而今他们的子女要解决婚姻问题时,组织上却早已从私人情感领域退出。市场化对日常生活的入侵,以及国家对住房、医疗、教育等社会保障性领域的改制,迫使城市居民凡事依靠自己的程度达到了1949年以来前所未有的高度,父母们的集体性焦虑在‘相亲角’中展露无遗。白发苍苍的他们为何要瞒着子女跑到公园来代理相亲?为什么明知子女的婚事要由子女决定,却乐此不疲地奔波于各大公园的‘相亲角’?为什么‘相亲角’的婚配效率基本为零,却聚集了越来越多的人气,日均人流量过万次?”

  社会学博士孙沛东在其所著的《谁来娶我的女儿:上海相亲角与“白发相亲”》一书中,探究了人民公园“相亲角”的现象。

  孙沛东也曾在《东方早报》上刊文解读“相亲角”的火热,“首先,知青一代父母独特的人生经历决定了他们不可能对子女的择偶问题不管不问。 其次,独生子女政策也是父母迫切帮助子女来到‘相亲角’寻找合适的结婚对象的一个重要因素。在‘相亲角’,绝大多数待婚男女都是独生子女。

父母的所有希望都寄托在这个孩子身上,盼着孩子上好大学,找好工作,找好对象,过好生活——这种四好人生,怎能在择偶这个环节出错呢?

另外,城市第一代独生子女上大学时刚赶上学费双轨制,父母为他们念大学支付了较昂贵的费用;不仅如此,很多父母或节衣缩食,或通过理财投资,帮孩子购买了婚房,至少准备了首付款,所有努力怎么能在择偶这个事上停滞呢?正是因为存在生存、成才和养老等风险,独生子女与其父母才毫无选择地被‘绑缚’在了协同择偶这辆战车之上。另外,现行的社会福利和保障体系还不能妥善解决养老和医疗问题,目前主要还是依靠子女照顾老人,‘三代单传’夫妇可能要赡养12位老人,独生子女家庭的负担沉重。在‘相亲角’,父母们帮助已经非常优秀的子女不断寻求比自己更优秀的结婚候选人的案例比比皆是;父母之间相互关注对方的工作单位、福利待遇、养老保险等个人经济状况和社保状况这一现象的背后,也隐含着人们对未来生活的担心。”

  2005年6月起,每逢周末和节假日,在上海人民公园的北角,成百上千的父母带着列有子女各项相亲条件的“简历”聚到这里,以“摆摊”、“挂牌”的方式,为子女寻觅结婚对象。

录入编辑:崔彩云


赴台读书大学生自曝被问“大陆有洗衣机吗” 首批72名赴台读本科的广州学子进入毕业季 – 南方都市报 2014-09-01

在台湾义守大学就读的张一童手拿《陆生元年》合影。

今年是台湾高校在大陆招生的第四年。

当85名广州仔女带着一丝新奇,即将踏上这段前途未卜的旅程时,他们的“大四师兄”张一童却将要对台湾 say good bye。因为,明年7月,他和其他71位广州学生将结束学业,从台湾的高校毕业了。三年前,2011年,也是“陆生元年”。台湾的高校首次面向大陆招生。据统计,48所公立和86所私立院校共录取了1015人。但实际报到确认者只有742人。其中72名学生来自广州。

前奏曲:《请跟我来》我踩着不变的步伐/是为了配合你到来/在慌张迟疑的时候/请跟我来

2011年6月8日,高考最后一天。

爸爸告诉广东仲元中学的文科班毕业生张一童,台湾的大学首次在大陆招生。他的成绩刚过本A线。想上理想的院校,他没什么优势,就将目光投向了高雄。

他去过高雄。那是高二,赴台旅游,高雄给他留下了好印象,“城市漂亮,规划整洁。”

他的三个志愿选择的是义守大学、铭传大学和辅仁大学。高雄本来就没有几所大学。他父亲曾去台湾访问过多所大学,对义守大学的师资、环境都比较认可。

那天,高考成绩不如预想的余泽霖也通过网络报名去台湾读书。他只填了一所大学:文化大学。专业填了两个:历史、新闻。其余志愿空缺。

代嘉翊的高考成绩超出一本线8分。这是个有些尴尬的分数。上名牌大学,肯定分不到好专业。上普通学校又心有不甘。于是,他选择了台湾的辅仁大学。

据台湾陆联会数据显示,陆生元年,134所登“陆”台校,本科拟招1488人,最后确定录取1015人,实际报到确认742人,放弃人数为273名,放弃比例超1/4。975名大陆学生(本科及以上)赴台就读。这其中,有219名广东学生,74名广州学生。

台湾陆联会总干事张鸿德说,这次录取的考生总体成绩不算非常顶尖,但报考学生多很有主见。他们的共性是,家境殷实、父母学历较高、视野开阔……据南都记者对40名广东陆生的问卷调查,有27.5%的学生来自公务员家庭,22.5%来自国企,20%来自事业单位,10%的学生来自从商的家庭。

诙谐曲:《台北的天空》台北的天空/有我年轻的笑容/还有我们休息和共享的角落/台北的天空/常在你我的心中/多少风雨的岁月我只愿和你度过

初到台湾,余泽霖经历了种种的“崩溃”。

比如,申请一张手机卡,竟折腾了整整一年。因为台湾法律规定,年满20岁才能拥有手机卡。可赴台读本科的陆生大多未满20岁。而学校又不愿为其担保。他们只能用为赴台旅游的游客设计的易付卡,贵得离谱。一个月,余泽霖的电话费就近4000元人民币,占生活费的一半。

还有,台湾同学那些令人啼笑皆非的问题:

“你们家还有没有人在耕田?”

“你们现在是不是还指腹为婚?”

“大陆有洗衣机吗?”

“你们也有手机?”……

对大多数陆生而言,台湾也是新鲜的。

第一次碰到地震,在中原大学心理学系就读的刘思琪撒腿就跑,被台湾的同学嘲笑了很久。

“去台湾之前以为男帅女美,我还偷偷学了化妆,结果发现并不是这样”。

“台湾的楼都好旧”。

“深山老林里都有便利店”……

代嘉翊说,大街小巷的台湾人张口“你好”闭口“谢谢”的礼貌以及对问路者热心的指点,都给他留下了深刻的印象。很多台湾同学也告诉陆洲,想来广州旅游。

交响曲:《生龙活虎打冲锋》生活好比是战场你要做英雄/打仗要做先锋你千万别孬种/做人你要抬头挺胸 拿出勇气冲冲冲

余泽霖曾经选修过课程“台湾史”。

起初,有三位大陆学生都选了这门课。可第一堂课结束,两个学生就退了课。因为,教台湾史这门课的老师说话直白,每次提问都会刻意强调大陆学生的身份。

课堂上,余泽霖多次就两岸关系和他激辩。

或许是专业兴趣,他与很多台湾老师进行过关于历史、政治的思想交锋。大二,他就去外校旁听各类课程。早晨6点,他睡眼惺忪地赶公交地铁,只为了在9点前抵达政大课堂。一旁听就是两年。

绕不开的政治话题很多。

“有人说陆生不谈政治,这是个伪命题。陆生本身就是个政治。绕不开,就得直面。”余泽霖说。

台湾课堂比较流行讨论,甚至是辩论。公共政策与管理的张一童说,有时,这种辩论就会演变成台生与陆生的争论,尤其是涉及到两岸关系时。“老师乐于看到学生辩论,最后出来和和稀泥。他们觉得不同观点交锋挺好。”

张一童会对这种辩论保持敏感,并有所回避。“会跟我争辩的都是不熟的同学。玩得最好的那几个台生从来不谈敏感话题。”

狂想曲:《跟往事干杯》人生际遇就像酒/有的苦有的烈/这样的滋味/你我早晚要体会/也许那伤口还流着血/也许那眼角还有泪/现在的你让我陪你/喝一杯

两岸年轻学子“跨海恋”开花结果的很少。

根据台湾当局目前的规定,大陆学生完成学业后,不能留岛工作,需返回大陆,“新萌芽的恋情仅靠网络、电话来维系,终究不能持久。”

在一次校际联谊会上,谭茜(化名)跟外校一台生擦出了“火花”。尽管相处愉快,但她有时笑着笑着,居然笑出了眼泪。因为她的心里充满着对未来的惶恐。

还有一年就毕业了。这个暑假,妈妈不断地催她备考雅思,到国外读研究生,谭茜说,无论是留下来,抑或他跟我一起走,都是两难。而男方父母发觉儿子“跨海恋”后,曾找到她,苦口婆心地劝她放弃,谭茜红着眼。

明年7月,首批赴台的本科陆生真的要毕业了。他们不能在台湾实习,有的人只好回广州找单位。比如刘晨就在广东电视台《麦王争霸》栏目组实习。

代嘉翊的学业很紧张,一周必须要修够九学分才能毕业。他只能让大陆的同学帮忙递简历。

不过,余泽霖说,身边的七八成大陆学生都选择读研深造。不管是远赴欧美还是就近去香港、新加坡,抑或是留台。

元年陆生,乘风而来。

他们与一座岛屿谈了场恋爱,虽然没有一见钟情的热烈,却是在摩擦、点滴温暖共处中,生出的日久之情。

一眨眼,毕业已在眼前。

[算账]

在台湾上大学要花多少钱?

在台湾,公立大学每年的学费大约是1.2万元人民币,私立学校每年的学费是2万元人民币。对大陆学生的费用方面,总的宗旨是:私立大学对大陆学生的学费不得低于私立大学对本地学生收取的费用;而公立大学对大陆学生的费用将参照私立大学的费用,不能低于私立学校的费用。

在住宿方面,各校收费标准亦不一,通常单人房每学期需人民币4000-5200元,二人房每学期需人民币2000-4000元,三人房则每学期需人民币1600-2600元,四人房需人民币1600-2400元。

另外还要加上计算机实习费、网络使用费、书籍费等。

生活费视个人开销而定,基本上每月需人民币2000-3000元。

此外,旅游及医疗保险需大陆学生自行在大陆投保,来回机票等交通费用也需由学生自付。

采写:南都记者 梁艳燕 实习生 吴欣宁

整合:陈实 摄影:南都记者 马强

南都制图 张许君

.END

Leave a comment

Filed under Uncategorized

FongInterrupt01 refactoring notes

// ********************************************************************
// Program – Testing 4 External and 3 Pin Change Interrupts
// Author – tlfong01.com
// Date – 2014sep01hkt2050
// License – Public domain
// ********************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
#include <PinChangeInt.h>
#include <FongIsr01.h>
#include <FongInt01.h>

FongIsr01 fisr1(0);

// *** Externl and Pin Change Interrupts definitions and attachments ***
void IsrExtInt0() {fisr1.globalInterruptFlagArray[0] = InterruptOn;}
void IsrExtInt1() {fisr1.globalInterruptFlagArray[1] = InterruptOn;}
void IsrExtInt2() {fisr1.globalInterruptFlagArray[2] = InterruptOn;}
void IsrExtInt3() {fisr1.globalInterruptFlagArray[3] = InterruptOn;}
void IsrPcInt0() {fisr1.globalInterruptFlagArray[4] = InterruptOn;}
void IsrPcInt1() {fisr1.globalInterruptFlagArray[5] = InterruptOn;}
void IsrPcInt2() {fisr1.globalInterruptFlagArray[6] = InterruptOn;}
void setupInterruptVectors()
{
noInterrupts();
attachInterrupt(0, IsrExtInt0, FALLING);
attachInterrupt(1, IsrExtInt1, FALLING);
attachInterrupt(2, IsrExtInt2, FALLING);
attachInterrupt(3, IsrExtInt3, FALLING);
PCintPort::attachInterrupt(PcIntPin0, &IsrPcInt0, FALLING);
PCintPort::attachInterrupt(PcIntPin1, &IsrPcInt1, FALLING);
PCintPort::attachInterrupt(PcIntPin2, &IsrPcInt2, FALLING);
interrupts();
}

void setup()
{
setupInterruptVectors();
}

void loop()
{
FongInt01 fint1(&fisr1, 0);
}

// *** End ***

Leave a comment

Filed under Uncategorized

FongInterrupt01 refactoring notes

// ********************************************************************
// Program – Testing 4 External and 3 Pin Change Interrupts
// Author – tlfong01.com
// Date – 2014sep01hkt2050
// License – Public domain
// ********************************************************************

#include <avr/io.h>
#include <avr/interrupt.h>
#include <PinChangeInt.h>
#include <FongIsr01.h>
#include <FongInt01.h>

FongIsr01 fisr1(0);

void setup()
{
setupInterruptVectors();
}

void loop()
{
FongInt01 fint1(&fisr1, 0);
}

// **********************************************************************************
// 7 ISRs
// **********************************************************************************
void IsrExtInt0()
{
fisr1.globalInterruptFlagArray[0] = InterruptOn;
}

void IsrExtInt1()
{
fisr1.globalInterruptFlagArray[1] = InterruptOn;
}

void IsrExtInt2()
{
fisr1.globalInterruptFlagArray[2] = InterruptOn;
}

void IsrExtInt3()
{
fisr1.globalInterruptFlagArray[3] = InterruptOn;
}

void IsrPcInt0()
{
fisr1.globalInterruptFlagArray[4] = InterruptOn;
}

void IsrPcInt1()
{
fisr1.globalInterruptFlagArray[5] = InterruptOn;
}

void IsrPcInt2()
{
fisr1.globalInterruptFlagArray[6] = InterruptOn;
}

// **********************************************************************************
// Setup interrupts
// **********************************************************************************

void setupInterruptVectors()
{
noInterrupts();

attachInterrupt(0, IsrExtInt0, FALLING);
attachInterrupt(1, IsrExtInt1, FALLING);
attachInterrupt(2, IsrExtInt2, FALLING);
attachInterrupt(3, IsrExtInt3, FALLING);

PCintPort::attachInterrupt(PcIntPin0, &IsrPcInt0, FALLING);
PCintPort::attachInterrupt(PcIntPin1, &IsrPcInt1, FALLING);
PCintPort::attachInterrupt(PcIntPin2, &IsrPcInt2, FALLING);

interrupts();
}

// *** End ***

// *** FongIsr01.h *******

// ********************************************************************
// Library – FongIsr01b
// Author – TL Fong
// Date – 2014sep01hkt1223
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongIsr01_h
#define FongIsr01_h

#include “Arduino.h”
#include “HardwareSerial.h”
// #include “SoftwareSerial.h”

#include <FongBuzzer01.h>
#include <FongUart01.h>
#include <FongDio01.h>
#include <FongAio01.h>
#include <FongBlueTooth01.h>

// *** Create global software serial objects ***

class FongIsr01
{
public:

FongIsr01(int testNum);

void globalExtIntIsr0();
void globalExtIntIsr1();
void globalExtIntIsr2();
void globalExtIntIsr3();

void globalPcIntIsr0();
void globalPcIntIsr1();
void globalPcIntIsr2();

int globalInterruptFlagArray[7];

private:
};

#endif

// *** END ***

// *** FongIsr01.cpp *******

// ********************************************************************
// Library – FongIsr01b
// Author – TL Fong
// Date – 2014sep01hkt1222
// License – Public domain
// ********************************************************************

// *** Includes ***
#include <FongIsr01.h>

// *** Constructors ***

FongIsr01::FongIsr01(int testNum)
{
}

void FongIsr01::globalExtIntIsr0()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr1()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr2()
{
// not used for now.
}

void FongIsr01::globalExtIntIsr3()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr0()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr1()
{
// not used for now.
}

void FongIsr01::globalPcIntIsr2()
{
// not used for now.
}

// *** End ***

// *** FongInt01.h *******

// ********************************************************************
// Library – FongInt01b
// Author – TL Fong
// Date – 2014sep01hkt1225
// License – Public domain
// ********************************************************************

// *** Includes ***

#ifndef FongInt01_h
#define FongInt01_h

#include “Arduino.h”
#include <FongIsr01.h>

#define InterruptOff 0
#define InterruptOn 1

#define ledPin 13
#define PcIntPin0 10
#define PcIntPin1 11
#define PcIntPin2 12

class FongInt01
{
public:
// *** Constructors ***
FongInt01(FongIsr01 *fisr, int testNum);

// *** Functions ***
void setupArduinoPins();
void blinkTwice();
void handleInterrupts(FongIsr01 *fisr);

// *** Variables ***
FongIsr01 *_fisr;

private:
};

#endif

// *** END ***

// *** FongInt01.cpp *******

// ********************************************************************
// Library – FongInt01b
// Author – TL Fong
// Date – 2014sep01hkt1226
// License – Public domain
// ********************************************************************

#include <FongInt01.h>

// *** Constructors ***

FongInt01::FongInt01(FongIsr01 *fisr, int testNum)
{
_fisr = fisr;
setupArduinoPins();
handleInterrupts(_fisr);
}

void FongInt01::setupArduinoPins()
{
pinMode(ledPin, OUTPUT);
pinMode(PcIntPin0, INPUT);
pinMode(PcIntPin1, INPUT);
pinMode(PcIntPin2, INPUT);

Serial.begin(9600);
Serial.println(“*** Start testing interrupt, … ***”);
blinkTwice();
}

void FongInt01::blinkTwice()
{
int i;
for (i = 0; i < 2; i++)
{
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
delay(200);
}
}

void FongInt01::handleInterrupts(FongIsr01 *fisr)
{
int interruptCount[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int i;
while (true)
{
for (i = 0; i < 7; i++)
if (fisr->globalInterruptFlagArray[i] == InterruptOn)
{
interruptCount[i]++;
Serial.print(“\n Interrupt = “);
Serial.print(i);
Serial.print(” Count = “);
Serial.print(interruptCount[i]);
if (interruptCount[i] > 9)
break; // exit for loop
delay(200); // debouncing 200 mS
noInterrupts(); // disable interrupt
fisr->globalInterruptFlagArray[i] = InterruptOff;
interrupts(); // restart interrupt
}
if (interruptCount[i] > 9)
break; // exit while loop
}
Serial.println(“\n\n*** Already 10 interrupts from External Interrupt 0 or 1, Now pause program, … ***\n\n\n”);
while (true) {}; // loop forever
}

// *** End ***

.END

 

 

Leave a comment

Filed under Uncategorized