FongTest03 tdd notes

void FongSegmentLed03::writeSegmentLed(uint8_t segmentLedNum, uint8_t digit7, uint8_t digit6, uint8_t digit5, \
uint8_t digit4, uint8_t digit3, uint8_t digit2, uint8_t digit1, \
uint8_t digit0)
{
initMax7219SevenSegmentMode(segmentLedNum);

writeSegmentLed(segmentLedNum, Digit0RegAdd, digit7);
writeSegmentLed(segmentLedNum, Digit1RegAdd, digit6);
writeSegmentLed(segmentLedNum, Digit2RegAdd, digit5);
writeSegmentLed(segmentLedNum, Digit3RegAdd, digit4);
writeSegmentLed(segmentLedNum, Digit4RegAdd, digit3);
writeSegmentLed(segmentLedNum, Digit5RegAdd, digit2);
writeSegmentLed(segmentLedNum, Digit6RegAdd, digit1);
writeSegmentLed(segmentLedNum, Digit7RegAdd, digit0);

startUpSegmentLed(segmentLedNum);
delay(100);

normalDisplayOnSegmentLed(segmentLedNum);
delay(100);
}


// *** FongTest03.cpp *******

// ********************************************************************
// FongTest03 – TL Fong 2015apr21hkt1410
// ********************************************************************

#include <FongTest03.h>

// *** Constructor ***

FongTest03::FongTest03(int initNum, int testNum): FongI2c03(initNum, testNum), \
FongLcd03(initNum, testNum), \
FongTtp229KeyPad03(initNum, testNum), \
FongPcf8591Adc03(initNum, testNum), \
FongSpi03(initNum, testNum), \
FongSegmentLed03(initNum, testNum), \
FongAlphaNumLed03(initNum, testNum)
{
// Serial.println(F(“\nBegin FongTest03::FongTest(), … >>>>>>>>>”));

_initNum = initNum;
_testNum = testNum;

if (_initNum <= InitNum0)
initTest(_initNum, _testNum);

if (_testNum <= TestNum14)
{
// beep();
testTest(_initNum, _testNum);
}

// Serial.println(F(“End FongTest03::FongTest03(), … >>>>>>>>>”));
}

// *** Functions ***

void FongTest03::initTest(int8_t initNum, int8_t testNum)
{
// Serial.println(F(“\n\nBegin FongTest03::initTest(). >>”));

// Serial.println(F(“End FongTest03::initTest(). >>\n”));
}

void FongTest03::testTest(int8_t initNum, int8_t testNum)
{
Serial.println(F(“\nBegin FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>>>”));

// *** Create objects ***

FongI2c03 fi2c1(initNum, testNum);
FongLcd03 flcd1(initNum, testNum);
FongTtp229KeyPad03 ftkp1(initNum, testNum);
FongPcf8591Adc03 fadc1(initNum, testNum);
FongSpi03 fspi1(initNum, testNum);
FongSegmentLed03 fsled1(initNum, testNum);
FongAlphaNumLed03 fanled1(initNum, testNum);

// *** Select tests ***

char selectChar;
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);

while (selectChar != ‘x’)
{
exeTestSelectFunction(selectChar, &fi2c1, &flcd1, &ftkp1, &fadc1, &fspi1, &fsled1, &fanled1);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);
}

Serial.println(F(“End FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>”));
}

char FongTest03::askTestSelectChar(String askString, int8_t initNum, int8_t testNum)
{
char selectChar;
char dummyChar;

// *** flush read buffer ***
while (Serial.available() > 0) {dummyChar = Serial.read();} // flush

// *** get user selection ***
Serial.print(F(“\n”));
Serial.print(askString);
Serial.println(F(” = ? >>>> “));

while (Serial.available() == false) {} // wait for char
selectChar = Serial.read();
Serial.print(F(“”));
Serial.print(askString);
Serial.print(F(” = “));
Serial.print(selectChar);
Serial.println(F(” >>>>”));
return selectChar;
}

void FongTest03::printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum)
{
const char menu0[] PROGMEM = “0 = Test I2c.”;
const char menu1[] PROGMEM = “1 = Test Lcd.”;
const char menu2[] PROGMEM = “2 = Test Keypad.”;
const char menu3[] PROGMEM = “3 = Test Adc/Dac.”;
const char menu4[] PROGMEM = “4 = Test Spi.”;
const char menu5[] PROGMEM = “5 = Test Segment Led.”;
const char menu6[] PROGMEM = “6 = Test AlphaNum Led.”;
const char menu7[] PROGMEM = “7 = Reserved.”;
const char menu8[] PROGMEM = “8 = Reserved.”;
const char menu9[] PROGMEM = “9 = Reserved.”;
const char menu10[] PROGMEM = “a = Reserved.”;
const char menu11[] PROGMEM = “m = Menu.”;
const char menu12[] PROGMEM = “h = Help.”;
const char menu13[] PROGMEM = “x = Exit.”;

const char * const selectMenu[] PROGMEM = \
{menu0, menu1, menu2, menu3, menu4, \
menu5, menu6, menu7, menu8, menu9, \
menu10, menu11, menu12, menu13};

Serial.println(F(“\n### Test test selection ###”));
for (int8_t i = firstSelectNum; i <= lastSelectNum; i++)
{
Serial.println(selectMenu[i]);
}
}

void FongTest03::exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, \
FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr, \
FongPcf8591Adc03 *fadcPtr, FongSpi03 *fspiPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr)
{
switch (selectChar)
{
case ‘0’:
Serial.println(F(“Test I2c.”));
fi2cPtr -> testI2c(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘1’:
Serial.println(F(“Test Lcd.”));
// flcdPtr -> testLcd(_initNum, _testNum); // tested OK
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “test line 1″);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “test line 2″);
delay(100);
break;
case ‘2’:
Serial.println(F(“Test KeyPad.”));
ftkpPtr -> testTtp229KeyPad(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘3’:
Serial.println(F(“Test Adc.”));
fadcPtr -> testPcf8591Adc(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘4’:
Serial.println(F(“Test Spi.”));
fspiPtr -> testSpi(_initNum, _testNum);
delay(100);
break;
case ‘5’:
Serial.println(F(“Test SegmentLed.”));
// fsledPtr -> testSegmentLed(_initNum, _testNum); // tested OK
// fsledPtr -> testMax7219SevenSegmentMode(SegmentLedNum0, TestModeNum0);
// fsledPtr -> testMax7219SevenSegmentMode(SegmentLedNum1, TestModeNum1);

fsledPtr -> writeSegmentLed(SegmentLedNum0, 2, 0, 1, 5, 10, 0, 4, 10);
fsledPtr -> writeSegmentLed(SegmentLedNum1, 2, 1, 15, 1, 5, 10, 2, 6);

delay(100);
break;
case ‘6’:
Serial.println(F(“Test AlphaNumLed.”));
// fanledPtr -> testAlphaNumLed(_initNum, _testNum);
fanledPtr -> displayFongLab();
fanledPtr -> displayFongWork();
delay(100);
break;
case ‘m':
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
break;
case ‘h':
Serial.print(“Sorry, no help available, …”);
break;
default:
Serial.print(“Sorry, no such option, …”);
break;
}
}

void FongTest03::testAll(FongLcd03 flcd03Ptr, FongTtp229KeyPad03 *ftkp03Ptr, \
FongPcf8591Adc03 *fadcPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr)
{
/

// *** Init Lcd ***
Serial.println(F(“Start testing Lcd, …”));

LiquidCrystal_I2C *lcI2cPtr0 = flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “Testing”);
LiquidCrystal_I2C *lcI2cPtr1 = flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “Testing”);

// *** Init keypad ***
Serial.println(F(“Start testing keypad, …”));
ftkpPtr -> initTtp229KeyPad(_initNum, _testNum);
uint8_t keyNum;
while (true)
{
keyNum = ftkpPtr -> getKeyNum();

if (keyNum == 0)
delay(500);
else if (keyNum == 16)
{
Serial.println(F(“Key pressed = 16.”));
Serial.println(F(“End testing keypad”));
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “End of test.”);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “End of test.”);
break;
}
else
{
Serial.print(F(“Key pressed = “));
Serial.println(keyNum);
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, (“Key pressed = ” + String(keyNum)));
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, (“Key Pressed = ” + String(keyNum)));
delay(500);
}
}
*/
}

// *** End ***

Leave a comment

Filed under Uncategorised

矽谷没有股民 – 楊珮珊

矽谷没有股民--專訪 500 Startups 合夥人 楊珮珊 Edith Yeung – Cyberport April 20, 2015

閱讀美國的 Startup 新聞,會常看到 Edith Yeung 的名字,知道她是矽谷知名投資者,500 Startups的 500 Mobile Collective合夥人,但大家未必知道她的中文名字是「楊珮珊」,是一個香港長大的女子。

楊珮珊以一口流利的廣東話接受訪問,她自16歲到美國升學,93年至今她一直在美國生活,事業歷程由程式開發員為開首,之後分別在甲骨文及 Autodesk 擔任管理層,最後自己創業打天下,蛻變成為投資者。突然放棄大公司的高薪厚職,父母不禁為女兒擔心,一度誤會她忽然懷孕。

「到了30歲時,我在想,如果我開發的軟件都是為大公司而做,我會覺得很沉悶,我從來不明白我做出來的東西,一個普通人如何可以用到,我離開了公司(Autodesk),父母一直在香港,我離開了一間很好的公司,有年多兩年都没有告訴他們,我自己出來創業,到最後自己公司做得不錯時,才告訴他們,自己在三藩市成立一間與科技媒體有關的公司(BizTechDay)」。

遇上來自中國的海豚

BizTechDay 專門為小企業提供資訊,楊珮珊亦在經營公司期間認識了不少矽谷知名企業家,自己創業,也為別人的創業打拼,她結識來自內地的海豚瀏覽器創始人楊永智,對方欲打入美國市場,楊珮珊便為他鋪橋搭路,2011年加入其團隊,現時為該公司的顧問,「當時我想,雖然我的公司發展不錯,但發展海豚瀏覽器,會比自己做的更大」,海豚瀏覽器已是國際上有名氣的企業,下載數量已逾1億,9成是 Android手機用戶。

海豚瀏覽器的介面

為中國企業造成亮麗的成績,那她會否扶助自己出生地的企業一把?楊珮珊自言很渴望投資香港的Startup,但在美國發展20年,很少見到香港人在美國做得好,而在香港時,見到放洋回港的創業家會覺得香港市場太小,但又不熟悉美國市場,她希望自己能點事情,協助香港創業家能了解其他市場,使港人更有國際競爭力。

香港應了解中國市場

除了做好產品外,她建議香港的 Startup 要了解大陸市場,「許多香港的創業家都不明白大陸是如何的,我自己本來都不明白。我媽媽是北京人,我懂說國語,但如果我不是認識海豚瀏覽器和楊永智,我根本不需要了解大陸市場。其實香港和大陸這樣近,可以好好發揮」,許多外國企業來到內地水土不服,反而香港卻能令外資落腳。

她又說,開拓新市場時,必需要找當地的專才,就算香港創業者的國語不靈光,都必需在當地找到認識自己行業的人士。

海豚瀏覽器便是進軍國際的成功例子,一個中國企業融入到美國的市場。海豚瀏覽器第一個登陸的國家就是在美國,而在當地的團隊是不會聘用中國人,以有效地與最早期用戶溝通,不斷更新產品,「所有美國用戶根本不知我們就是中國公司」。

成功企業家初衷不是為賺錢

創新科技領域無邊無際,年輕人準備創業前如何選擇自己適合的範疇?

楊珮珊引用美國的經驗,最好的團隊開始時不是為賺錢而做,

「大部份優秀的人都明白,自己是在解決甚麼問題,

你想想,例如 DropBox 聯合創辦人 Drew Houston 在想為何處理不同地方的檔案這樣麻煩,他明白這個問題,做了這個產品,解決自己面對問題」,

最成功的企業家必需先了解用戶為何要用自己的產品。

談及創業氣氛,她便認為矽谷、北京、以色列特拉維夫最活躍

三個地方的創業家的思考模式很相似,

「喜歡搖滾音樂的人,穿衣風格差不多,喜歡的節奏亦差不多」,

因此她向各地的創業家發問的問題也很相近。

中美的科技差異

至於行業趨勢上,她預計中國科技行業的未來主要在電商,中國的民眾對食品欠缺信心,「反而願意在網上,在可靠的門戶購物,我相信中國會是移動電商上最發達的一個國家。

中國在營運上有許多創新,會比美國快」,而美國在科技上會有許多創新,例如虛擬實境及人工智能技術,但表面看未必有實際用途,

「美國人有時做許多事情不一定為了賺錢,只覺得這個幾酷」,

在矽谷會看到最新的科技,有些不知道如何賺錢,「但絕對會有VC(風險投資者),包括我,我在想,如果我投資,會有甚麼可能性,可做到更大或賺錢」,例如已有人開始研究

虛擬實境技術應用在治療戒酒或失憶症上。

她指出,中國的互聯網用戶較美國多,但美國社會較富裕,用戶較願意在互聯網上付鈔。不過在互聯網金融上,她認為美國比中國落後,例如

阿里巴巴的支付系統應用比美國網絡支付的好

,希望美國有更好的手機支付系統。

除了行業發展差異外,楊珮珊道出兩國之間一個有趣的文化差異,美國股票雖然備受中華地區注視,但

美國股民數目比香港及中國的少得多,

「矽谷没有甚麼股民,每人專注自己的事情,買賣股票的比較少。

我身邊的人與我談天時,無一個會談論股票。」

楊珮珊為「數碼企業 — 卓越領袖論壇」的嘉賓之一,活動將在本月23日於數碼港舉行,詳情請瀏覽http://delf.cyberport.hk/speakers.php


林行止大「數」城中「經濟學家」- 邱析鎮 Post852 2015apr21

《信報》創辦人林行止,在今日該報個人專欄中,就大「數」修讀經濟學人士的道德水平。

林行止先引述美國兩篇學界論文,文中結論指出,有57%受訪大學經濟學教授均直指,跨學科的知識不比單學科的有益或有用;就算

只是「主修經濟學的學生」,也普遍不喜歡跟人分享、對有需要者少伸援手,以至有欺騙、說謊和偷竊的傾向。

文章續指,學生本身性格若偏向不合群,修讀經濟學後會更不合群;

因為他們考慮問題時,會更不帶感情,卻又

同時極注重「機會成本」及慎防有「意外結果」

林行止進而再引述德國一篇學術論文,該文作者查閱近700名美國眾議員05年至09年間的表現,發現

讀經濟學出身的,更多涉及貪腐行為。

當中原因,與他們比較「自利中心」及較少關注社會事務有關,

以致即使因此令他人有所損失亦在所不計,不會輕易放過任何對他們有利的事。

這或與他們普遍自視阿當.史密斯在《原富論》中提及,「自己有利世人有益」之哲學有關。

林行止到最後一段,終點出他寫此文評論經濟學家有如此心態之意:

「料想象牙塔經濟學蛋頭亦如是。照香港近日的政情,讀者至此應有會心……。」

林行止直斥,那些

「理性特別那些重效益和功利薄是非公道的經濟學家,了解逆京意的『機會成本』太大(可能失去晉升機會、可能不獲續約、可能不易進入建制的委員會、可能沒人邀請北上講學、可能退休後不會有「榮譽」職務〔不能繼續發光發熱〕……)」

等考量下,自然大有理由不作「無謂犧牲」,

「他們中不少人因而選擇了對自己(進而以為整體香港)最有利的『袋住先』!」

走筆至此,公眾也許都會想起,城中不少重量級經濟學家的名字:

早已是「幫港出聲」一方的嶺南大學經濟學系教授何濼生、科技大學經濟學系教授雷鼎鳴;以至是近日與主催「溫和平台」的湯家驊,走在一起的香港大學經濟學講座教授王于漸,與中文大學經濟學教授宋恩榮等……

作為城中最具影響力財經報章的創辦人,林行止此文還是要不點名批評,城中部分經濟學者近年如斯政治取態,恐怕更是當今港人尤其是知識分子,理應心痛之所在。


機會成本有得計! 經濟學家「袋住先」? – 林行止 信報 2015年04月21日

.END

Leave a comment

Filed under Science & Technology

FongTest03 tdd notes

Begin FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>>>

Test test selection

0 = Test I2c.
1 = Test Lcd.
2 = Test Keypad.
3 = Test Adc/Dac.
4 = Test Spi.
5 = Test Segment Led.
6 = Test AlphaNum Led.
7 = Reserved.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.

Test Test Select = ? >>>>
Test Test Select = 1 >>>>
Test Lcd.

Test Test Select = ? >>>>
Test Test Select = 5 >>>>
Test SegmentLed.

Test Test Select = ? >>>>
Test Test Select = 6 >>>>
Test AlphaNumLed.

Test Test Select = ? >>>>
Test Test Select = x >>>>
End FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>


// *** testFongDuino03v2015apr20hkt1612.ino ****
// ********************************************************************
// FongDuino03 tlfong01.com 2015apr21
// ********************************************************************
#include “Arduino.h”
#include “HardwareSerial.h”
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <FongDigiOut03.h>
#include <FongDigiControl03.h>
#include <FongHardSerial03.h>
#include <FongBlueToothBase03.h>
#include <FongSpi03.h>
#include <FongAdc03.h>
#include <FongIox03.h>
#include <FongKeyPad03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>
#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongPcf8591Adc03.h>
#include <FongTtp229KeyPad03.h>
#include <FongTest03.h>

/*
#include <FongAnaIn02.h>
#include <FongEeprom02.h>
#include <FongBlueToothConnect02.h>
#include <FongTest02.h>
*/

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};
void setup()
{
Serial.begin(9600);
Serial.print(F(“FongDuino03v2015apr21hkt1041.ino”));
}

void loop()
{

// FongDigiOut03 fdo1(InitNum0, TestNum0); // 2015mar27 testing
// FongDigiControl03 fdc1(InitNum0, TestNum1); // 2015mar06 OK
// FongHardSerial03 fhs1(InitNum0, TestNum3); // 2015mar16 OK
// FongBlueToothBase03 fbtb1(InitNum0, TestNum4); // 2015mar16 OK
// FongSpi03 fspi1(InitNum0, TestNum4); // 2015mar26 testing
// FongAdc03 fadc1(InitNum0, TestNum5); // 2015mar16 OK
// FongIox03 fiox1(InitNum0, TestNum6); // 2015mar16 OK
// FongKeyPad03 fkp1(InitNum0, TestNum7); // 2015mar16 OK
// FongSegmentLed03 fsl1(InitNum0, TestNum10); // 2015apr16 OK
// FongAlphaNumLed03 fanl1(InitNum0, TestNum10); // 2015apr16 OK
// FongI2c03 fi2c1(InitNum0, TestNum10); // 2015apr17 OK
// FongLcd03 flcd1(InitNum0, TestNum11); // 2015apr17 OK
// FongPcf8591Adc03 fpcf8591cadc1(InitNum0, TestNum12); // 2015apr20 OK
// FongTtp229KeyPad03 fttp229kp1(InitNum0, TestNum13); // 2015apr18 OK

FongTest03 ftest1(InitNum0, TestNum14); // 2015apr21 testing

// FongAnaIn02 fai1(InitNum0, TestNum0); // OK 2015jan22
// FongEeprom02 feep1(InitNum0, TestNum5); //To test later
// FongBlueToothConnect02 fbtc1(InitNum0, TestNum2); // To test later
// FongTest02 ft1(Init0, Test0); // To test later

while (true) { };
}

// *** End ***


// *** FongTest03.h *******

// ********************************************************************
// FongTest03b – TL Fong 2015apr21hkt1209
// ********************************************************************

// *** Includes ***

#ifndef FongTest03_h
#define FongTest03_h

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

#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongTtp229KeyPad03.h>
#include <FongPcf8591Adc03.h>
#include <FongSpi03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>

class FongTest03: public FongI2c03, FongLcd03, FongTtp229KeyPad03, FongPcf8591Adc03, FongSpi03, \
FongSegmentLed03, FongAlphaNumLed03
{
public:

// *** Constructors ***

FongTest03(int testNum, int debugNum);

// *** Variables ***

int _initNum ;
int _testNum;

// *** Univerasl constants *****************************************************

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};

// *** Functions ***

void initTest(int8_t initNum, int8_t testNum);
void testTest(int8_t initNum, int8_t testNum);

enum MenuNum {FirstSelectNum = 0, LastSelectNum = 13, TotalSelectNum = 14};
void printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum);
char askTestSelectChar(String askString, int8_t initNum, int8_t testNum);

void exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, FongLcd03 *flcd03Ptr, \
FongTtp229KeyPad03 *ftkp03Ptr, FongPcf8591Adc03 *fadcPtr, \
FongSpi03 *fspiPtr, FongSegmentLed03 *fsledPtr, \
FongAlphaNumLed03 *fanledPtr);

void testAll(FongLcd03 *flcd03Ptr, FongTtp229KeyPad03 *ftkp03Ptr, \
FongPcf8591Adc03 *fadcPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr);
private:

};

#endif

// *** END ***


// *** FongTest03.cpp *******

// ********************************************************************
// FongTest03 – TL Fong 2015apr21hkt1410
// ********************************************************************

#include <FongTest03.h>

// *** Constructor ***

FongTest03::FongTest03(int initNum, int testNum): FongI2c03(initNum, testNum), \
FongLcd03(initNum, testNum), \
FongTtp229KeyPad03(initNum, testNum), \
FongPcf8591Adc03(initNum, testNum), \
FongSpi03(initNum, testNum), \
FongSegmentLed03(initNum, testNum), \
FongAlphaNumLed03(initNum, testNum)
{
// Serial.println(F(“\nBegin FongTest03::FongTest(), … >>>>>>>>>”));

_initNum = initNum;
_testNum = testNum;

if (_initNum <= InitNum0)
initTest(_initNum, _testNum);

if (_testNum <= TestNum14)
{
// beep();
testTest(_initNum, _testNum);
}

// Serial.println(F(“End FongTest03::FongTest03(), … >>>>>>>>>”));
}

// *** Functions ***

void FongTest03::initTest(int8_t initNum, int8_t testNum)
{
// Serial.println(F(“\n\nBegin FongTest03::initTest(). >>”));

// Serial.println(F(“End FongTest03::initTest(). >>\n”));
}

void FongTest03::testTest(int8_t initNum, int8_t testNum)
{
Serial.println(F(“\nBegin FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>>>”));

// *** Create objects ***

FongI2c03 fi2c1(initNum, testNum);
FongLcd03 flcd1(initNum, testNum);
FongTtp229KeyPad03 ftkp1(initNum, testNum);
FongPcf8591Adc03 fadc1(initNum, testNum);
FongSpi03 fspi1(initNum, testNum);
FongSegmentLed03 fsled1(initNum, testNum);
FongAlphaNumLed03 fanled1(initNum, testNum);

// *** Select tests ***

char selectChar;
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);

while (selectChar != ‘x’)
{
exeTestSelectFunction(selectChar, &fi2c1, &flcd1, &ftkp1, &fadc1, &fspi1, &fsled1, &fanled1);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);
}

Serial.println(F(“End FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>”));
}

char FongTest03::askTestSelectChar(String askString, int8_t initNum, int8_t testNum)
{
char selectChar;
char dummyChar;

// *** flush read buffer ***
while (Serial.available() > 0) {dummyChar = Serial.read();} // flush

// *** get user selection ***
Serial.print(F(“\n”));
Serial.print(askString);
Serial.println(F(” = ? >>>> “));

while (Serial.available() == false) {} // wait for char
selectChar = Serial.read();
Serial.print(F(“”));
Serial.print(askString);
Serial.print(F(” = “));
Serial.print(selectChar);
Serial.println(F(” >>>>”));
return selectChar;
}

void FongTest03::printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum)
{
const char menu0[] PROGMEM = “0 = Test I2c.”;
const char menu1[] PROGMEM = “1 = Test Lcd.”;
const char menu2[] PROGMEM = “2 = Test Keypad.”;
const char menu3[] PROGMEM = “3 = Test Adc/Dac.”;
const char menu4[] PROGMEM = “4 = Test Spi.”;
const char menu5[] PROGMEM = “5 = Test Segment Led.”;
const char menu6[] PROGMEM = “6 = Test AlphaNum Led.”;
const char menu7[] PROGMEM = “7 = Reserved.”;
const char menu8[] PROGMEM = “8 = Reserved.”;
const char menu9[] PROGMEM = “9 = Reserved.”;
const char menu10[] PROGMEM = “a = Reserved.”;
const char menu11[] PROGMEM = “m = Menu.”;
const char menu12[] PROGMEM = “h = Help.”;
const char menu13[] PROGMEM = “x = Exit.”;

const char * const selectMenu[] PROGMEM = \
{menu0, menu1, menu2, menu3, menu4, \
menu5, menu6, menu7, menu8, menu9, \
menu10, menu11, menu12, menu13};

Serial.println(F(“\n### Test test selection ###”));
for (int8_t i = firstSelectNum; i <= lastSelectNum; i++)
{
Serial.println(selectMenu[i]);
}
}

void FongTest03::exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, \
FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr, \
FongPcf8591Adc03 *fadcPtr, FongSpi03 *fspiPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr)
{
switch (selectChar)
{
case ‘0’:
Serial.println(F(“Test I2c.”));
fi2cPtr -> testI2c(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘1’:
Serial.println(F(“Test Lcd.”));
// flcdPtr -> testLcd(_initNum, _testNum); // tested OK
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “test line 1″);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “test line 2″);
delay(100);
break;
case ‘2’:
Serial.println(F(“Test KeyPad.”));
ftkpPtr -> testTtp229KeyPad(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘3’:
Serial.println(F(“Test Adc.”));
fadcPtr -> testPcf8591Adc(_initNum, _testNum); // tested OK
delay(100);
break;
case ‘4’:
Serial.println(F(“Test Spi.”));
fspiPtr -> testSpi(_initNum, _testNum);
delay(100);
break;
case ‘5’:
Serial.println(F(“Test SegmentLed.”));
// fsledPtr -> testSegmentLed(_initNum, _testNum); // tested OK
fsledPtr -> testMax7219SevenSegmentMode(SegmentLedNum0, TestModeNum0);
fsledPtr -> testMax7219SevenSegmentMode(SegmentLedNum1, TestModeNum1);
delay(100);
break;
case ‘6’:
Serial.println(F(“Test AlphaNumLed.”));
// fanledPtr -> testAlphaNumLed(_initNum, _testNum);
fanledPtr -> displayFongLab();
fanledPtr -> displayFongWork();
delay(100);
break;
case ‘m':
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
break;
case ‘h':
Serial.print(“Sorry, no help available, …”);
break;
default:
Serial.print(“Sorry, no such option, …”);
break;
}
}

void FongTest03::testAll(FongLcd03 flcd03Ptr, FongTtp229KeyPad03 *ftkp03Ptr, \
FongPcf8591Adc03 *fadcPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr)
{
/

// *** Init Lcd ***
Serial.println(F(“Start testing Lcd, …”));

LiquidCrystal_I2C *lcI2cPtr0 = flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “Testing”);
LiquidCrystal_I2C *lcI2cPtr1 = flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “Testing”);

// *** Init keypad ***
Serial.println(F(“Start testing keypad, …”));
ftkpPtr -> initTtp229KeyPad(_initNum, _testNum);
uint8_t keyNum;
while (true)
{
keyNum = ftkpPtr -> getKeyNum();

if (keyNum == 0)
delay(500);
else if (keyNum == 16)
{
Serial.println(F(“Key pressed = 16.”));
Serial.println(F(“End testing keypad”));
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “End of test.”);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “End of test.”);
break;
}
else
{
Serial.print(F(“Key pressed = “));
Serial.println(keyNum);
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, (“Key pressed = ” + String(keyNum)));
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, (“Key Pressed = ” + String(keyNum)));
delay(500);
}
}
*/
}

// *** End ***

.END

Leave a comment

Filed under Uncategorised

Fong I2c, Lcd, Keypad, AdcDac, SPI, SegmentLed, AlphaNumLed integrated testing OKa

FongDuino03v2015apr21hkt1041.ino
Begin FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>>>

Test test selection

0 = Test I2c.
1 = Test Lcd.
2 = Test Keypad.
3 = Test Adc/Dac.
4 = Test Lcd/Keypad/Adc/Dac.
5 = Test Spi.
6 = Test Segment Led.
7 = Test AlphaNum Led.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.

Test Test Select = ? >>>>
Test Test Select = 7 >>>>
Test AlphaNumLed.

########## Begin FongAlphaNumLed03::testAlphaNumLed(). ##########
++++++++++ Current AlphaNumLed number = 2 ++++++++++

>>>>>>>>> AlphaNumLed test selection >>>>>>>>>>
0 = Change AlphaNumLed Num.
1 = Test AlphaNumLed #0, #1 all segments on.
2 = Display FongLab at AlphaNumLedNum 0, 1.
3 = Display FongWork at AlphaNumLedNum 2, 3.
4 = Reserved.
5 = Reserved.
6 = Reserved.
7 = Reserved.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.
>>>>>>>>> AlphaNumLed Test Selection = ? >>>>>>>>>>
>>>>>>>>> AlphaNumLed Test Selection = 2 >>>>>>>>>>
AlphaNumLed Test Select = ? >>>>>>>>>>
AlphaNumLed Test Select = 3 >>>>>>>>>>
AlphaNumLed Test Select = ? >>>>>>>>>>
AlphaNumLed Test Select = x >>>>>>>>>>
########## End FongAlphaNumLed03::testAlphaNumLed(). ##########

Test Test Select = ? >>>>
Test Test Select = x >>>>
End FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>


// *** testFongDuino03v2015apr20hkt1612.ino ****
// ********************************************************************
// FongDuino03 tlfong01.com 2015apr21
// ********************************************************************
#include “Arduino.h”
#include “HardwareSerial.h”
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <FongDigiOut03.h>
#include <FongDigiControl03.h>
#include <FongHardSerial03.h>
#include <FongBlueToothBase03.h>
#include <FongSpi03.h>
#include <FongAdc03.h>
#include <FongIox03.h>
#include <FongKeyPad03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>
#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongPcf8591Adc03.h>
#include <FongTtp229KeyPad03.h>
#include <FongTest03.h>

/*
#include <FongAnaIn02.h>
#include <FongEeprom02.h>
#include <FongBlueToothConnect02.h>
#include <FongTest02.h>
*/

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};
void setup()
{
Serial.begin(9600);
Serial.print(F(“FongDuino03v2015apr21hkt1041.ino”));
}

void loop()
{

// FongDigiOut03 fdo1(InitNum0, TestNum0); // 2015mar27 testing
// FongDigiControl03 fdc1(InitNum0, TestNum1); // 2015mar06 OK
// FongHardSerial03 fhs1(InitNum0, TestNum3); // 2015mar16 OK
// FongBlueToothBase03 fbtb1(InitNum0, TestNum4); // 2015mar16 OK
// FongSpi03 fspi1(InitNum0, TestNum4); // 2015mar26 testing
// FongAdc03 fadc1(InitNum0, TestNum5); // 2015mar16 OK
// FongIox03 fiox1(InitNum0, TestNum6); // 2015mar16 OK
// FongKeyPad03 fkp1(InitNum0, TestNum7); // 2015mar16 OK
// FongSegmentLed03 fsl1(InitNum0, TestNum10); // 2015apr16 OK
// FongAlphaNumLed03 fanl1(InitNum0, TestNum10); // 2015apr16 OK
// FongI2c03 fi2c1(InitNum0, TestNum10); // 2015apr17 OK
// FongLcd03 flcd1(InitNum0, TestNum11); // 2015apr17 OK
// FongPcf8591Adc03 fpcf8591cadc1(InitNum0, TestNum12); // 2015apr20 OK
// FongTtp229KeyPad03 fttp229kp1(InitNum0, TestNum13); // 2015apr18 OK

FongTest03 ftest1(InitNum0, TestNum14); // 2015apr21 testing

// FongAnaIn02 fai1(InitNum0, TestNum0); // OK 2015jan22
// FongEeprom02 feep1(InitNum0, TestNum5); //To test later
// FongBlueToothConnect02 fbtc1(InitNum0, TestNum2); // To test later
// FongTest02 ft1(Init0, Test0); // To test later

while (true) { };
}


// *** FongTest03.h *******

// ********************************************************************
// FongTest03b – TL Fong 2015apr21hkt1209
// ********************************************************************

// *** Includes ***

#ifndef FongTest03_h
#define FongTest03_h

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

#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongTtp229KeyPad03.h>
#include <FongPcf8591Adc03.h>
#include <FongSpi03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>

class FongTest03: public FongI2c03, FongLcd03, FongTtp229KeyPad03, FongPcf8591Adc03, FongSpi03, \
FongSegmentLed03, FongAlphaNumLed03
{
public:

// *** Constructors ***

FongTest03(int testNum, int debugNum);

// *** Variables ***

int _initNum ;
int _testNum;

// *** Univerasl constants *****************************************************

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};

// *** Functions ***

void initTest(int8_t initNum, int8_t testNum);
void testTest(int8_t initNum, int8_t testNum);

enum MenuNum {FirstSelectNum = 0, LastSelectNum = 13, TotalSelectNum = 14};
void printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum);
char askTestSelectChar(String askString, int8_t initNum, int8_t testNum);

void exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, FongLcd03 *flcd03Ptr, \
FongTtp229KeyPad03 *ftkp03Ptr, FongPcf8591Adc03 *fadcPtr, \
FongSpi03 *fspiPtr, FongSegmentLed03 *fsledPtr, \
FongAlphaNumLed03 *fanledPtr);

void testLcdKeyPad(FongLcd03 *flcd03Ptr, FongTtp229KeyPad03 *ftkp03Ptr);

private:

};

#endif

// *** END ***


// *** End ***


// *** FongTest03.cpp *******

// ********************************************************************
// FongTest03 – TL Fong 2015apr20hkt1615
// ********************************************************************

#include <FongTest03.h>

// *** Constructor ***

FongTest03::FongTest03(int initNum, int testNum): FongI2c03(initNum, testNum), \
FongLcd03(initNum, testNum), \
FongTtp229KeyPad03(initNum, testNum), \
FongPcf8591Adc03(initNum, testNum), \
FongSpi03(initNum, testNum), \
FongSegmentLed03(initNum, testNum), \
FongAlphaNumLed03(initNum, testNum)
{
// Serial.println(F(“\nBegin FongTest03::FongTest(), … >>>>>>>>>”));

_initNum = initNum;
_testNum = testNum;

if (_initNum <= InitNum0)
initTest(_initNum, _testNum);

if (_testNum <= TestNum14)
{
// beep();
testTest(_initNum, _testNum);
}

// Serial.println(F(“End FongTest03::FongTest03(), … >>>>>>>>>”));
}

// *** Functions ***

void FongTest03::initTest(int8_t initNum, int8_t testNum)
{
// Serial.println(F(“\n\nBegin FongTest03::initTest(). >>”));

// Serial.println(F(“End FongTest03::initTest(). >>\n”));
}

void FongTest03::testTest(int8_t initNum, int8_t testNum)
{
Serial.println(F(“\nBegin FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>>>”));

// *** Create objects ***

FongI2c03 fi2c1(initNum, testNum);
FongLcd03 flcd1(initNum, testNum);
FongTtp229KeyPad03 ftkp1(initNum, testNum);
FongPcf8591Adc03 fadc1(initNum, testNum);
FongSpi03 fspi1(initNum, testNum);
FongSegmentLed03 fsled1(initNum, testNum);
FongAlphaNumLed03 fanled1(initNum, testNum);

// *** Select tests ***

char selectChar;
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);

while (selectChar != ‘x’)
{
exeTestSelectFunction(selectChar, &fi2c1, &flcd1, &ftkp1, &fadc1, &fspi1, &fsled1, &fanled1);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);
}

Serial.println(F(“End FongTest03::testTest(). >>>>>>>>>>>>>>>>>>>>”));
}

char FongTest03::askTestSelectChar(String askString, int8_t initNum, int8_t testNum)
{
char selectChar;
char dummyChar;

// *** flush read buffer ***
while (Serial.available() > 0) {dummyChar = Serial.read();} // flush

// *** get user selection ***
Serial.print(F(“\n”));
Serial.print(askString);
Serial.println(F(” = ? >>>> “));

while (Serial.available() == false) {} // wait for char
selectChar = Serial.read();
Serial.print(F(“”));
Serial.print(askString);
Serial.print(F(” = “));
Serial.print(selectChar);
Serial.println(F(” >>>>”));
return selectChar;
}

void FongTest03::printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum)
{
const char menu0[] PROGMEM = “0 = Test I2c.”;
const char menu1[] PROGMEM = “1 = Test Lcd.”;
const char menu2[] PROGMEM = “2 = Test Keypad.”;
const char menu3[] PROGMEM = “3 = Test Adc/Dac.”;
const char menu4[] PROGMEM = “4 = Test Lcd/Keypad/Adc/Dac.”;
const char menu5[] PROGMEM = “5 = Test Spi.”;
const char menu6[] PROGMEM = “6 = Test Segment Led.”;
const char menu7[] PROGMEM = “7 = Test AlphaNum Led.”;
const char menu8[] PROGMEM = “8 = Reserved.”;
const char menu9[] PROGMEM = “9 = Reserved.”;
const char menu10[] PROGMEM = “a = Reserved.”;
const char menu11[] PROGMEM = “m = Menu.”;
const char menu12[] PROGMEM = “h = Help.”;
const char menu13[] PROGMEM = “x = Exit.”;

const char * const selectMenu[] PROGMEM = \
{menu0, menu1, menu2, menu3, menu4, \
menu5, menu6, menu7, menu8, menu9, \
menu10, menu11, menu12, menu13};

Serial.println(F(“\n### Test test selection ###”));
for (int8_t i = firstSelectNum; i <= lastSelectNum; i++)
{
Serial.println(selectMenu[i]);
}
}

void FongTest03::exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, \
FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr, \
FongPcf8591Adc03 *fadcPtr, FongSpi03 *fspiPtr, \
FongSegmentLed03 *fsledPtr, FongAlphaNumLed03 *fanledPtr)
{
switch (selectChar)
{
case ‘0’:
Serial.println(F(“Test I2c.”));
fi2cPtr -> testI2c(_initNum, _testNum);
delay(100);
break;
case ‘1’:
Serial.println(F(“Test Lcd.”));
flcdPtr -> testLcd(_initNum, _testNum);
delay(100);
break;
case ‘2’:
Serial.println(F(“Test KeyPad.”));
ftkpPtr -> testTtp229KeyPad(_initNum, _testNum);
delay(100);
break;
case ‘3’:
Serial.println(F(“Test Adc.”));
fadcPtr -> testPcf8591Adc(_initNum, _testNum);
delay(100);
break;
case ‘4’:
Serial.println(F(“Test LCD/Keypad/ADC/DAC, …”));
testLcdKeyPad(flcdPtr, ftkpPtr);
delay(100);
break;
case ‘5’:
Serial.println(F(“Test Spi.”));
fspiPtr -> testSpi(_initNum, _testNum);
delay(100);
break;
case ‘6’:
Serial.println(F(“Test SegmentLed.”));
fsledPtr -> testSegmentLed(_initNum, _testNum);
delay(100);
break;
case ‘7’:
Serial.println(F(“Test AlphaNumLed.”));
fanledPtr -> testAlphaNumLed(_initNum, _testNum);
delay(100);
break;
case ‘m':
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
break;
case ‘h':
Serial.print(“Sorry, no help available, …”);
break;
default:
Serial.print(“Sorry, no such option, …”);
break;
}
}

void FongTest03::testLcdKeyPad(FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr)
{
// *** Init Lcd ***
Serial.println(F(“Start testing Lcd, …”));

LiquidCrystal_I2C *lcI2cPtr0 = flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “Testing”);
LiquidCrystal_I2C *lcI2cPtr1 = flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “Testing”);

// *** Init keypad ***
Serial.println(F(“Start testing keypad, …”));
ftkpPtr -> initTtp229KeyPad(_initNum, _testNum);
uint8_t keyNum;
while (true)
{
keyNum = ftkpPtr -> getKeyNum();

if (keyNum == 0)
delay(500);
else if (keyNum == 16)
{
Serial.println(F(“Key pressed = 16.”));
Serial.println(F(“End testing keypad”));
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “End of test.”);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “End of test.”);
break;
}
else
{
Serial.print(F(“Key pressed = “));
Serial.println(keyNum);
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, (“Key pressed = ” + String(keyNum)));
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, (“Key Pressed = ” + String(keyNum)));
delay(500);
}
}
}

// *** End ***

.END

Leave a comment

Filed under Project

Memorialisation, Chess – The BBC Why Factor

Memorialisation The Why Factor BBC

http://www.bbc.co.uk/programmes/p029p7l3

How do we remember the dead and why does it matter? Mike Williams considers the promise of so many nations never to forget the death and suffering of World War One, and explores how the dead have been remembered around the world and through the ages.

Produced by Ben Crighton

Image: Ceramic poppies covered in rainwater at the Blood Swept Lands and Seas of Red evolving art installation at the Tower of London Credit: Chris Jackson/PA Wire


Chess The Why Factor

http://www.bbc.co.uk/programmes/p029cx8x

Why has the game endured over more than 1500 years and how has it mirrored politics and changes in society? We speak to Chess federation president Kirsan Ilyumzhinov, chess pupil Diana Davletova, women’s chess champion Judit Polgar, Grande Master Dan King, Artificial Intelligence expert David Levy, chess historian Marilyn Alom and chess author Dave Edmonds.

.END

Leave a comment

Filed under Philosophy & Religion

水中銀生物科技公司 – 陳子翔

內地生「轉基因魚」 助港科技走出去 – 文匯報 2013年10月22日 星期二

陳子翔指本港倘無科研,易遭邊緣化,遂決心留港經營。曾慶威 攝

人和社會,就像樹和大自然,既吸收養分,亦為整個環境作出自己的貢獻。

2006年來到香港城市大學的內地生陳子翔,無疑是享受了優越的大學學習環境,在這充滿機會的城市下發展了自己的事業,但他亦同時透過「轉基因鯖(魚將)魚卵類雌激素檢測」的技術,寫下了本地科研產業亦可賺錢的勵志故事,更將這「本土科技」帶往歐美和日本,「我想外國知道,這一次不是因為我們便宜,而是因為我們也可以有好的科技」。

香港文匯報記者 歐陽文倩

普遍香港人都認為難以發展的科學園中,其實有不少人在付出青春、汗水和努力,從零開始於這裡創業,希望可以打造屬於香港的奇蹟。

畢業已3年的陳子翔所創立的水中銀(國際)生物科技公司,就是其中的例子。從首年的入不敷支,變成今年賺得7位數盈利,有著十數個員工,訪問的前後,他都忙著接待生意夥伴。

參賽燃念頭 獲千萬設公司

「這要多謝香港政府、科學園和天使基金的支持」。談起今日這一切,陳子翔率先提到的,是這片土地給予他的種種機會︰先是大學時的創業比賽,讓他接觸了這個由城大教授研發的轉基因魚雌激素檢測技術,也燃起了創業的念頭;後是創新科技署及科學園對其項目的支持,讓他可先後取得約1,000萬元的資助,並設立公司,令這本土科技有了發揚光大的據點和基礎。

吸收了大量的養分,他的公司亦長出了纍纍果實。陳子翔表示,其公司的「轉基因鯖(魚將)魚卵類雌激素檢測」,由於能快速、有效地檢測食品、藥品及化妝品裡是否有雌激素及有關劑量,再加上這技術是透過鯖(魚將)魚的胚胎進行,不屬於動物測試,受各大標榜人道、產品安全的企業所歡迎,「雖然外國也有檢測雌激素的技術,但不少歐美的一線公司都會找我們做檢測。可以幫香港走出去,以本土的技術『打贏』全世界的公司,證明了香港也可發展科研,創新科技署亦把我們當作一成功例子。我想外國知道,這一次不是因為我們便宜,而是因為我們也可以有好的科技」。

爭商業化廚餘變天然氣堆肥技術

除了在國際科研企業間證實香港實力,能將本地教授的研究成果從象牙塔帶出現實生活,也令他倍感自豪,「其實香港的教授做的研究成果非常突出,但由於香港缺乏相應的產業,令不少教授的研究最終也只能擱置一旁,變做『古董』,這樣非常可惜,也令政府所投入的資源不能產生出應有的好處」。所以,他亦正積極爭取將城大把廚餘轉化為天然氣及堆肥的技術商業化,希望將另一個「香港技術」帶出市面。

決心申港永久居民

展望將來,陳子翔表示,不論未來公司業務如何擴張,科技的研發一定會留在香港,「雖然不少人認為香港做不起科技產業,但我都會繼續下去,因為如果一個地方只做金融、地產這些虛擬經濟,而沒有自己的技術,很容易會被邊緣化」。已在香港7年的他,亦決心申請為香港永久居民,「無論業務的重心在哪裡,香港都會是我主要居住的地方之一」。


魚胚胎驗毒 港企獲發明大獎 盼改善內地貨安全 從源頭解水貨問題 – 明報 2015-04-20

城市大學學者利用特定魚類胚胎遇毒素會變畸形,或植入特定基因後可發光等特質,研發用以檢測有害物質,該校畢業生取得此技術獨家使用權後,創辦水中銀(國際)生物科技有限公司,測試化妝品及食品安全等。該公司的檢測技術日前在日內瓦國際發明展大獎上獲最高榮譽獎(The Grand Prix),是港產公司第二次獲得該榮譽。公司合伙人表示,希望藉技術提升內地食品與日用品安全,從源頭上減少困擾香港的水貨問題。

第二間港公司奪日內瓦展大獎

日內瓦國際發明展由瑞士政府及「世界智慧財產權組織」等於1973年創辦,一年一度舉行,本屆有來自45個國家地區逾千件新發明參展,主辦單位讚揚水中銀的技術一次可驗過千種毒素,且過程中只用胚胎,不需用動物做測試。本港公司首次奪此大獎為2012年,作品是理大研發、助中風病人做物理治療的機械臂「希望之手」。

今次得獎技術最初由城大生物醫學系教授鄭淑嫻帶領團隊研發而成,她表示因斑馬魚胚胎對很多有害物質都很敏感,會發育成畸胎,例如心臟肥大、出現腫瘤甚至死亡等;將發光蛋白質的基因植入轉基因鯖[魚將] 魚體內,其胚胎在遇到雌激素時能製造出綠色熒光蛋白質,利用兩魚的胚胎就可檢測有害物質。

城大研發 畢業生競專利

鄭淑嫻說,當年城大技術轉移處公開讓全球投資者角逐該技術專利,

城大本科畢業生、水中銀創辦人陳子翔也參與競逐,其計劃書脫穎而出,獲得技術的獨家使用權。

水中銀合伙人兼首席技術官陳雪平說,該公司創辦人陳子翔在城大讀書時,便用魚胚胎驗毒技術的理念參加商業賽,獲比賽評審、投資者賞識,最終獲得投資。

鄭補充,創新科技署其後因應該公司爭取到投資,提供配對資助,科學園則提供免租期,兩者的資助相等於約1000萬元。

陳雪平在城大博士畢業,當年跟隨鄭淑嫻參與研發轉基因發光魚技術。

陳表示,傳統化學測試一次只能選擇小量有害物質來測試,若用魚胚胎則一次可測試逾千種物質,包括塑化劑、農藥等,大大節省時間,轉基因鯖[魚將] 魚胚胎及斑馬魚胚胎測毒分別要24及48小時,且用來測試的仍是魚類胚胎,未發育成會主動攝食的魚苗,符合各地動物法規。

可驗千種毒 包括塑化劑農藥

公司於2010年創立,陳雪平指取得技術使用權後,經過研發將結果應用在食品及化妝品的檢測上,開發一套化驗標準程序,

經過4年發展,現時客戶遍及歐亞等4、5個國家,而該公司剛剛回本。

該公司會幫客戶化驗其產品是否含有害物質,若有,則幫客戶分析是生產過程中什麼環節出錯,最後提供改善產品安全的建議。

陳雪平在內地碩士畢業後來港攻讀生物科技博士,至今10年。

她住在粉嶺,不時看見水貨客與市民衝突,她認為水貨有市場的背後根源是內地民眾對食品及日用品安全沒有信心,公司當年是眼見內地毒奶粉事件而成立,現時也在與內地企業及政府部門合作,希望藉魚胚胎驗毒技術協助企業改善產品,提高內地食品及日用品安全,從源頭上減少水貨問題。

特首梁振英昨在網誌稱,水中銀獲獎證明只要善用官產學研(政府、業界、學術界及科研)的結合,便能締造佳績。他指政府兩度提出設立創新及科技局,便是為更有效推動創新科技,惟泛民議員拉布,致該局3年來仍不能成立。


3個陌生人 創「小確幸」購物網 – 香港經濟日報 2015年04月20日

不收上架費 支援亞洲設計品牌

台灣矽谷人顏君庭留美7年,感受至深的,是創業者對理想的熱情。但當他回望祖家,卻發覺很多有天賦、有理想的年輕人,有理想難實現:「沒有一個好的平台和社區,讓年輕人將好設計展示出來。」

他想到建立一個亞洲最大的設計師網絡社區,「讓人們在生活中享用到更多好的設計,也就是要將幸福感(小確幸)帶到生活。」

創業是一種冒險,但顏君庭冒的險也實在大了點他竟然透過網絡找尋創業夥伴!「我利用社交網站、部落格(博客)之類,向很多網友講述大計。」第一位積極回應的網友,是有網站創辦經驗的李讓。

另一位創辦人林怡君則是透過朋友介紹相識。二人一直在綫上溝通,首次見面,竟是1年後,Pinkoi 網站正式上綫時。

港品牌fb宣傳 一晚6700個Like

2011年底,由3個陌生人創立的設計品購物網站 Pinkoi,正式上綫。在這個網站上,設計師可以毋須支付「上架費」,販售3種產品:

  1. 原創設計品、
  2. 經合法渠道獲得代理權的產品、
  3. 古董(例如是幾十年前的打字機)。

眼見很多設計師徒有設計才華,卻對商業零概念,不懂得推廣自己的設計,讓顏君庭決意幫上一把。因此 Pinkoi 既是網店,又是設計師全天候支援:

教他們如何開始推廣自己的設計品,包括拍一些吸引人,且能告訴人創作理念的產品圖片;

透過文字或面對面訪談,分享港台設計師創立品牌、組建團隊的成功案例;

於 Pinkoi 的社交網站上推廣不同品牌。香港新進設計品牌 Backtozero 登陸 Pinkoi 大約1個月,曾獲Pinkoi 於Facebook 上宣傳,結果一晚內多了6,700個「Like」!「簡直就好像看着股市上升!」Backtozero 設計師 Lingke 說。

售價1成作管理費 唯一收入

以上各種服務,統統免費。每賣出一件設計品,Pinkoi會抽取售價的10%作管理費。「一件設計品賣1,000元,Pinkoi 讓設計師拿9成(900元);換轉是以前,那9成統統跑到租金、銷售代理等等那裏去,賣1,000元的設計品最終只得1成(100元)落到設計師口袋裏,根本不能維生!」顏君庭說。「這些充滿天份的設計師,就只能當打工族,最多只可以在公餘時間接工作,那時候,市場上就再沒有好的設計。」

新進設計師對於品牌建立充滿疑問:「他們會問我:如何聘請第一位員工?如何成立一間公司?如何處理帳目?如何發發票?」萬事起頭難,此亙古不變道理,顏君庭豈會不知?「我們當初也是由零開始。對我們而言,一開始最難的,就是得到設計師信任,願意跟我們合作。」與其說是向設計師尋求合作機會,倒不如說是跟設計師交朋友。「誠懇、目標純粹,告訴對方:你們是很棒的,你現在或許感到很迷惘,但沒關係,還有很多設計師跟你一樣,你並不孤獨。讓我們來助你一把。」

近年港台兩地新一代對「生活」有了新的演繹,「小確幸」之說由是而來,人們對設計和生活品味有更多追求。

4年過去,Pinkoi 有超過40萬名會員、逾2萬名活躍設計師,賣出超過120萬件設計品。

然而創業有得亦有失,顏君庭坦言:「我還是很懷念矽谷的。」回到台灣創業,認識到很多朋友。但最大滿足是:「很多獨立設計師非常受歡迎,設計品銷售往超過20個國家。」

撰文:陳子健


香港年輕設計師何去何從?UI/UX Design 的一片天空 – YM Chan 輔仁媒體 2015年4月20日

畢業的月份又來了,又是年輕畢業生開始找工作的時份。

話說,我畢業後第一份工作,是獵頭公司,然後輾轉到了一間歐資品牌營造設計公司,一滾就在設計行業滾了差不多三年,因此對香港設計行業的發展有一定認識,即使現在轉到科技公司,有獵頭經驗的我,在兩個行業亦有協助公司招賢納士,因此對設計師求職有點看法可以分享。

寧選 Agency,不作 In-house designer

我經常跟剛畢業的學生說,第一份工作如果可以選擇,儘可能別選擇 in-house 職位。這點其實不限於設計行業,放到其他專業的畢業生也適用。

In-house designer,機構內部設計師,從工作崗位上,in-house 員工產出是服務公司內部的需要。另一端,在設計領域有關的 Agency 類型包括廣告公司、平面設計公司、品牌營造公司等等,比較準確的名字該稱為服務型企業 (Professional services firm),泛指那些為不同機構提供專業支援的企業,這包括需要專業資格認證的律師行、會計師行、建築師樓等等。

服務型企業就像是木人巷,讓剛畢業的年輕人在行業迅速地打下紮實根基,以往獵頭公司的經驗,大企業都很喜歡從服務型企業挖角,特別是有三至五服務型企業經驗的人才,譬如是銀行或金融機構喜歡從四大會計師樓挖人做內部審計或財務總監的位置,大企業亦喜歡從公關公司挖人負責企業公關的工作。另一點可能很吸引90後的,是服務型企業工作一般比較「好玩」,好玩有幾個原因,

第一,一般 in-house 部門比較穩定,同事年紀比較大,而服務型企業同期新入職的同事都比較年輕。

第二,服務型企業一個項目的周期比較短,而企業亦通常會服務不同行業的不同客戶,今天的項目可能是關於食品,下星期的項目可能已變了電子產品,變化比較大。曾經接觸過一個作品集很亮麗的設計師,剛畢業因為公司規模而進入了一間大型銀行,幾個月後發現不對勁,公司對設計不太重視,學習很慢,因此要急急再找工作。

當然,既然說得上「迅速打下根基」,工時一般都比較長,而且,起步的人工很多時都比不上大企業。剛畢業在某行業當 in-house,毫無疑問是對該行業會有更深厚的認識,但定型後可塑性不高,轉行業比較困難,轉工極其量只可轉公司,總的來說,服務型企業的工作經驗普遍對長遠事業發展來說是比較有利的。

傳統設計業在香港萎縮

在這裏用上傳統設計業,我所指的是廣告設計、平面設計、包裝設計等。

在中國未開放的年代,香港憑著中西文化相匯的優勢,吸引很多國際大品牌落戶香港,在香港成立地區總部,因此,一些國際設計公司,會順利成章的於香港設立地區總部,照顧國際客戶之餘,也開拓其他亞洲區域的業務,整個設計行業也因此變得很蓬勃,創意冠絕亞洲(日本除外)。隨著中國堀起,外國品牌到排著隊到中國淘金,亞洲區的總部不是搬到上海就是北京,市務推廣的預算都隨之而搬到中國,令香港的設計行業經營環境變得十分艱難。同時,中國本身的客戶都豪氣起來,種種因素之下,這些國際設計公司,不得不也得跟著客戶北移,早陣子,國際 4As 廣告公司 DraftFCB 及 MC Saachi 也要關掉香港的創意部門或辦公室,相信就是這個原因。

本地經濟產業單一,成功的本地企業又不太著重設計,對香港設計學生的多元發展有很大窒礙。舉例說,香港少有本土品牌成功發展成國際品牌,有志從事包裝設計的設計學生,該漸漸會發現

香港少有包括物料應用、結構設計(structural design) 等大型包裝設計項目,

香港所謂的包裝設計,大部份都只是需要包裝盒上的平面設計。

你猜最接近香港的包裝設計樞紐在哪兒?答案是在廣州,畢竟那裏是生產中心,不少國際大企業如P&G 或箭牌的包裝設計創新中心都是設於廣州。另一方面,雖然本地有不少紡織及服裝生產商,理應造就不少時裝設計師,事實卻不然,因為香港鮮有著重設計而又以設計聞名的服裝品牌,同樣的情況亦發生在工業設計之上,本地有不少做家品的廠商,然而他們對沒有追求高質素設計的心,大大扼殺了本地工業產品設計師的發展潛力。

資訊科技業發展蓬勃

在傳統設計行業萎縮的同時,資訊科技行業卻發展得非常蓬勃,

自從香港有幾個科技初創企業如 9gag, GoGoVan 等成功獲得融資並打響名堂,大家的信心都壯大了,初創企業如雨後春筍的發展起來。

然而觀察所見,有強烈創造能力的設計畢業生,普遍首選都是傳統的廣告、平面設計工作,資訊科技公司的設計師空缺敬陪末座。

相信這關乎本地設計學校的教師都是傳統設計訓練出身,對電子互動設計可能比較陌生,亦未必看到這方面的潛力。要做出一款用戶喜愛的手機應用程式或網頁,除了開發工程人員技術水平要夠高之外,出色的用戶界面 (User Interface) 及用戶體驗 (User Experience) 設計亦極為重要,因此,能否吸引到本地優秀的設計人才投身資訊科技行業,對香港整個行業的發展有著關鍵的影響力。

香港 IT 公司喜歡在招聘廣告上寫招聘 UI/UX 設計師,但很多新晉設計師都給 UI/UX design 這個名詞嚇跑了,要麼完全不知道甚麼是UI/UX,要麼以為要懂得寫程式才能勝任。其實,用戶界面 (UI) 設計就是傳統的平面設計,

用戶體驗 (UX) 設計就是如何讓用家容易學習並使用你的產品,

有UX經驗固然加分,沒有的話也可透過設計工作慢慢學習。我經常掛在口邊,我認為我入職到目前為止最大的成就,就是把公司出的 UI/UX designer 招聘廣告改為 Graphic designer, 然後成功請了位那個時候唯一全職坐辦公室的女同事(笑)。

我對年輕設計師的一點建議

設計師的工作,是要有創意有美感地表達一個訊息,第一個能表現你這種能力的,是你的履歷表與作品集。如果一個設計師發給我一個 Word 文件檔履歷,一般我都會直接刪除;另外要好好處理你作品集的表達方式,你的設計能力除了反映在作品集上的項目,也反映在整個作品集的設計。

設計並不是藝術品,創作一件藝術品可以純是你喜歡而無任何目的,但卻設計是有目的地表達一個訊息,因此,我們不能對客戶說我們用這個顏色是因為我們喜歡。一個商標設計,或者一份海報設計,可能一個機構內部設計師的職位能接受到你把東西放進去填滿便可以,但希望到服務型企業工作的朋友,謹記這點並不足夠,我們的出品講究創作概念(creative concept),我們需要跟客戶解釋整個設計的靈感,發展與結果,常思考這個過程可以令你的設計變得更紮實。

設計師跟我們資訊科技行業的程式開發員有幾點其實很類似,譬如是很容易接到 Freelance,接到足夠的 Freelance 後又很容易自行創業。有創業精神的設計師們,不妨考慮一下加盟本地的初創企業,提升本地產品的設計水平。

.END

Leave a comment

Filed under Science & Technology

維穩機器越轉越緊 – 長平

維穩機器越轉越緊 – 長平 蘋果日報 2015年4月21日 星期二

2006年,高瑜在一篇文章裏寫道:「六四時期我和一批記者被追捕,那是國家在抓我們。後來又發生高勤榮、姜維平案件,那是省裏的大員要治他們的『罪』。現在令人吃驚到,一個縣的書記就可以把北京的記者抓走。」八年之後,中國進入習近平時代,她再次由「國家」抓捕、第三次入獄,以「為境外非法提供國家機密」罪名,被判處有期徒刑七年。

高瑜比較了江澤民和胡錦濤兩個時代迫害記者的區別,認為打壓輿論的權力下放,低級官員肆意為之,新聞自由變得越來越糟糕。分析她這一次的牢獄之災,我們可以看到習近平時代的變化。

習近平一個明顯的統治術就是再次收權,以反腐敗的名義讓各級官員噤若寒蟬。然而,大權回收之後並沒有變得謹小慎微,而是更加肆無忌憚。

正如江澤民在2000年怒斥香港記者時的語態一樣,他的統治有些神經質,偶爾會情緒失控,但是渴望得到西方社會的承認(連接受採訪都以回答西方名記者華萊士提問為榮)。更嚴格地控制媒體輿論,是在中共六四鎮壓之後,從蘇聯解體、東歐巨變得出的「歷史教訓」。自那後,

媒體輿論和學校教育都進行大規模改造,一個典型的特徵是,從虛偽的正義教育到無恥的去正義化教育,對新一代人灌輸唯利是圖觀念。

正是在這個時代,勇敢的記者高瑜兩次失去新聞自由。第一次是因為直接參與六四運動,第二次是「洩露國家機密罪」。

在此期間,高瑜的貢獻得到國際社會的廣泛承認,先後獲得

國際報業發行人協會頒發的「自由金筆獎」、

國際婦女媒體基金會頒發的「新聞勇氣獎」、

記者無國界新聞獎、

聯合國教科文組織頒發的吉耶爾莫‧卡諾新聞自由獎及

「全球20世紀的新聞自由英雄獎」。

這些國際獎勵對江澤民政府構成一定壓力,高瑜一次被無罪釋放,三次被「保外就醫」。

人們對江澤民的神經質極度厭煩之際,聽到了新任最高領導人胡錦濤字正腔圓、有板有眼的講話,頓時覺得如沐春風。但是,掩藏在這種毫無個性的語態背後的,是十年間機械化一般系統性的維穩體制的建成。

胡錦濤對西方的在意減弱了,甚至提出「向朝鮮學習」的要求。在周永康幫助下,這種維穩體制周密細緻,無微不至。高瑜所指「下放抓人權」,即是這種體制的一個佈局。

習時代文革幽靈浮現

2012年11月,習近平用輕鬆自如的口氣發表了簡短「就職演說」。與胡錦濤的刻板無趣相比,習的講話簡直說得上生動幽默了,一度傳出他組織了特別的語言顧問班子,改革就從字詞開始。習近平的確比前兩任多了「三個自信」(道路自信、理論自信、制度自信),擁有更多的政治野心(實現「中國夢」)。然而人們很快發現,這些自信和野心為中國帶來更加可怕的政治高壓,文革幽靈浮現在社會各個方面。

2013年初,很多人還迷倒在習近平語言新風之下時,高瑜就在文章中指出:「習近平不僅要力挽中共政權於不倒,避免『君子之澤,五世而斬』的命運,而且要重整朝綱,以期恢復毛澤東建國初期的權威性和合法性。

那才是他『復興之路』的宗旨和目標」。今天回讀高瑜這些話,不得不佩服她的觀察之敏銳深刻。在胡錦濤時代暫時避禍的高瑜,進入七十高齡之後,被關進習近平政府的監獄。

我無意比較三任中共領導人的個人品質優劣,而是想要指出,無論是放權還是收權,這套維穩及輿論控制的機器持續運動,就注定它將越來越緊,而不是像有些人想像的那樣,是甚麼「日益開放」。

長平


高瑜案缺實證 起訴書受質疑 – 丁望 信報 2015-04-20

北京資深記者、71歲的高瑜,被北京第三中級法院一審判刑7年,罪名是「為境外非法提供國家秘密」,高瑜當庭表示會提出上訴。北京高級法院將受理二審,其結果是可預料的:「維持一審判決」。

像過去知識界的「洩密」或「尋釁滋事」案,

法院按照黨意、家長意志或長官意志判決

法律只是政治丫環,高瑜案也是按「政治需要」處置,缺乏充分、可靠的證據。

傳媒報道高瑜的判刑,未提法院判刑7年的法律條款。按中共中央主導制定、人大通過的刑法(1979年7月公布,1997年3月大修訂,後來多次小修正),高瑜涉嫌洩密的判罪量刑適用法條,是「危害國家安全罪」類的第111條:「為境外的機構,……非法提供國家秘密或者情報的,處5年以上10年以下有期徒刑;情節特別嚴重的,處10年以上有期徒刑或者無期徒刑。」

檢察院的起訴書,稱高瑜向境外媒體「非法提供國家秘密」。假如檢方的證據充分、可靠,法院可判處她5至10年的徒刑;一審判她7年徒刑,算是重判了。

法院援引刑法第111條判罪,必須有證據支持。檢方依據偵查方(公安局)提供的證據,受到辯方質疑。

疑點之一,高瑜是否有中共中央9號文件(2013)的原文或影印件,是否由她直接傳給境外傳媒刊出?高瑜的辯護律師提出質疑,是檢方提不出相關的「物理證據」。偵、檢方查抄高瑜電腦,並未查出高瑜直接向境外傳媒傳出9號文件的記錄(或復原的記錄),此即刑事訴訟中的「物理證據」。

本人查閱《刑事訴訟法》(簡稱《刑訴法》)2012年3月第二次修正文本(2013年1月1日生效),在第五章「證據」中,查到第48條「可以用於證明案件事實的材料」,列出8類證據,其中第8類是「視聽資料、電子數據」。按此規定,電腦的數碼記錄在「證據」之列,但是第48條也有此規範:「證據必須經過查證屬實,才能作為定案的根據。」

檢方控高瑜以電腦傳送「國家秘密」類的文件,必須提供實實在在的「物理證據」,而不是「政治假定」。

按偵、檢方的相關文件,中共中央9號文件是由姚監復提供複印本。姚氏是北京自由派學者,曾任中共中央農村政策研究室研究員、國務院發展研究中心農村部研究員。

辯方的辯詞稱:「控方現有證據只能證明高瑜電腦中中辦9號文件電子版的『創立』時間,而高瑜供述,該文件是她從互聯網上下載的。高瑜電腦中有3個該文件的電子文檔,判決書的證據顯示,這3個電子版文檔與姚監復提供的複印件的比對後,發現有多達27、45、27處的不同之處,『這難以用錄入時打字錯誤予以解釋』。」


呂秉權﹕重判高瑜 自暴其短 – 明報 2015年4月21日 星期二

71歲的內地資深記者高瑜,被指觸犯「為境外非法提供國家秘密罪」,被北京市第三中級人民法院重判入獄7年,引起中外極大迴響。

中國正全面推進「依法治國」,以案論案,大家不妨看看高瑜案是否「依法治國」的一次良好示範?即內地所講「要把每個案子都辦成鐵案」,經得起法律和時間的考驗。

根據起訴書,高瑜案所涉的國家秘密,是俗稱「七不講」的《關於當前意識形態領域情况的通報》的「中共中央辦公廳【2013】9號文件」。

所謂「七不講」,即不講西方憲政民主、普世價值、公民社會等七種主張。

第一方面,先論證據。

當局的控罪指,高瑜在獲取這份機密文件後,於2013年7月利用 Skype 軟件,發送給身在海外的明鏡新聞出版集團創辦人何頻。

判案講求人證、物證。可是控方在庭上,無法提出鑑定證據指出,高瑜究竟在何時、何地、用哪部電腦傳送出有關的文件。中國網監科技之高,資源之厚舉世聞名,但經過一年調查,如果連最基本的電腦犯罪實證紀錄的時、地、物都無法提出就將人治罪,那麼,這種判決實在馬虎、兒戲,為依法治國自暴其短。

中國的網絡和科技警察,應該不止這種水平,即使資料被刪,他們亦應能修復,之後一一呈堂,擺出鐵證如山之勢,壓下泄密者,令你百辭莫辯,輸得心服口服,否則將辜負無數為網管大量投入的中國納稅人。

有本港熟悉科技罪行檢控程序的人指,調查這類案,一般會從收件者的IP開始查起,再追回發件者的IP,並查出違法行為的時與地。得此資料後,控方就會向軟件公司要求獲取被查者的資料,以及看看能否追回所涉文件等。可以確定的是,當局無法調查身在海外、被指是「接密者」何頻,但暫時不能確定中國官方有否從軟件公司獲得任何證據,如果有就應該讓證據說話,以理服眾。

黨國不分 重判良心 如何服人?

另一方面,何頻的聲明指,早於當局指高瑜發出文件之時,自己早一個月已從其他渠道獲得文件,來源並非高瑜。如此的時間出入,未知當局如何解釋?

第二方面,程序公義。

當局的判刑,主要基於高瑜的認罪證供。她的辯護律師指,高瑜之所以認罪,是由於辦案人員威脅要將其子「抓起來」脅迫而成的。根據最高人民法院相關解釋,令被告人在精神上受痛苦的方法而逼出違願的證供,屬於非法取證,應當排除。

另外,高瑜案開庭前,她的「認罪和深刻懺悔」的片段先在中央台播出,有違公平審訊原則。

最後一方面,就是黨國不分的問題。

今次的文件,是一份黨的文件。在黨國體制下,將「黨」的文件當成「國家」文件,再以「國法」對高瑜治罪,實在不符「依法治國」的精神,對國際社會作出一次錯誤的示範。

而根據《保守國家秘密法》,國家秘密包括國防、外交、經濟等範疇,意識形態不在其列。將黨的意識形態正確方針列為秘密,再以國法限之到底是否正確?

再退一萬步,高瑜並非黨員,沒有法律責任為黨保守秘密。

黨國不分,重判良心,如何服人?


潘小濤﹕高瑜獲刑與畢福劍被貶 – 明報 2015年4月21日

高瑜,被稱為中國最勇敢女記者,剛被指控「為境外非法提供國家秘密罪」,判刑7年,將成為其中一名最年老的良心犯。

畢福劍,中央電視台名主持,多年來都是央視春晚的台柱,深獲重用,最近在私人飯局的一段評唱《智取威虎山》中,加插了狠批毛澤東的評論(「可別提那個老×養的,可把我們害苦了」),被偷錄後流出,受到左派猛烈抨擊,結果他主持的節目被停播,甚至被央視除名,很可能還會被施以更重懲罰。

一個是體制外異見者,一個是體制內吹鼓手,兩人應互不相識,也沒多少交集,但從他們的遭遇可進一步觀察習近平的政見,再度印證他「政治上全面收緊及向左、經濟上繼續向右」的治國手腕。這是鄧小平改革開放初期及「六四」後的策略:政治上堅持「四項基本原則」(堅持社會主義道路;堅持人民民主專政;堅持共產黨的領導;堅持馬列主義、毛澤東思想),絕不許觸碰;經濟上靈活變通,只要不觸及上述紅線,則任何刺激經濟增長的手段都可嘗試。

習近平掌權後,政治上收緊的動作多如牛毛,更不容公開批評毛澤東(卻容忍「毛左」批罵鄧小平)。高瑜被指向境外網站提供的「國家機密」,就是習近平內部講話整理而成的中共第9號文件〈關於當前意識形態領域情况的通報〉,即網上俗稱「七不講」(普世價值、新聞自由、公民社會、公民權利、中國共產黨的歷史錯誤、權貴資產階級、司法獨立都不要講),本身就是政治上向左轉及迎合「毛左」的動作。

事實上,習上台後拘捕的維權人士、記者等是胡溫十年的總和,包括前《新維月刊》創辦人王健民、前《亞洲週刊》高級編輯咼中校、香港晨鐘出版社總編輯姚文田、人權律師浦志強等仍被拘捕。而高瑜獲刑與畢福劍被貶,不正是「七不講」的最佳註腳嗎?


港大的災難 – 陳雅明 蘋果日報 2015年4月21日 星期二

去年佔領行動過後,港大成為政治風眼,《學苑》風波、陳文敏事件、李國章空降,反映梁振英決意先在港大開刀,展開他對青年的意識形態工作及大專院校整治計劃。日前,港大副校長何立仁

(Ian Holliday)指「If you don’t want to go to China, don’t come to HKU.」

一事,極不尋常,很可能涉及政治干預,計劃亦直接影響到大學生的自由,引起了廣泛的不滿。若校方解釋不清,很可能會連同之前梁振英干預港大的事情觸發校內大型抗爭。

何立仁在港大學生會舉辦的高桌晚宴上,指校方將在2022年強制要港大學生到中國大陸交流的計劃,不參加不能畢業。

另一港大副校長蘇彰德也表示校內高層早已討論並通過強制回中國大陸交流的政策。

不過,據《學苑》即時新聞報道,消息人士透露這個計劃仍在討論中,並未在教務委員會通過。另外,港大發言人發了書面聲明回應事件,指計劃「已得到大學的教務委員會支持」,但關於強制性的部份則指「是否每位學生都必須全面參與,將有進一步諮詢和討論」,明顯跟何立仁及蘇彰德兩位副校長的講法有出入。

這些前言不對後語的講法,令本來荒謬的事情更加荒謬。

這計劃茲事體大,必定引發爭議,理應諮詢同學意見;可是,校方完全沒有諮詢,之後何立仁及蘇彰德的態度又是事在必行的,沒有商量餘地,似乎某些校方高層必定要通過這個計劃。直至現時為止,校方仍沒有一個合理的理由解釋同學何以必須回中國大陸交流。那些互相矛盾的講法,加上兩個副校長事在必行的態度,令人合理懷疑背後是否涉及政治干預。

或涉政治干預

正如練乙錚早前撰文指出,港大現時是處於極之嚴峻的時期,梁振英是依足法例在港大搞批鬥、搞奪權。由於特首不合理地必然成為港大校監,而校監又在人事委任上掌握大權,因此梁振英可以「合法」通過港大的制度安插心腹,從而控制校務委員會及教務委員會。梁振英那些充滿意識形態的所謂青年工作就可以透過校政實踐出來,使人防不勝防。

梁振英根本不用親自出手,只要通過安插在校務委員會及教務委員會的「梁粉」,就可以執行他的整治計劃及青年工作。加上這些安插是「合法」的,即使好像李國章那樣明目張膽空降港大的政治安排,校內學生組織也無可奈何。「梁粉」未必個個好像李國章那樣相由心生,在這嚴峻時期,港大學生必定要保持警覺性,抗議那些沒有學生諮詢但又事在必行的不合理校政,否則港大的自主性盡失,任由外部政治力量干預甚至主導,這樣的話,港大就變北大了。

大學是一個自由的學習場所,可以給同學自由選擇學習的內容及方式,去甚麼地方交流也可以由學生自由選擇,可以去外國,也可以去中國。為甚麼硬要將去中國大陸交流成為港大入學及畢業的必要條件?這計劃一來是剝奪了大學生的選擇自由,二來很可能涉及外部政治勢力干預大學自主。

若港大高層不交代得清清楚楚,而只講一句「If you don’t want to go to China, don’t come to HKU.」搪塞,將會付出很大的代價。

現在已經學期尾,沒有課可罷,但一個月後,考試完了,學生時間多的是,到時抗爭的激烈程度必定遠超過罷課,這是他們難以承受的。

陳雅明


強制交流比國教更可怕 – 莫鍶軒 蘋果日報 2015年4月21日 星期二

上星期,香港大學副校長何立仁教授在高桌晚宴中透露,港大將會實施強制交流計劃,每名同學將需參與到大陸的交流計劃。此說法一出,惹來不少人關注,批評

港大的做法專橫,毫不尊重同學的自我意願

我固然是反對此等粗暴的做法,

但都請大家想想,為何港大需要走到此步,破壞自己一直以來相對開放自由的校園風氣?

大專院校一直都被北京和西環認為是「反對派」陣地,西化的教育制度和內容,相當開放和自由的氣氛,院校條例所保障的院校自主制度,以及多年來建立的學術自由傳統,均對建制具潛在的殺傷力。

同時,一直以來的社會運動,多數都是由大專生發動,去年的雨傘運動,正正是大專院校罷課所引發的浪潮。即使是和平佔中,當中的倡議人正正是港大法律系副教授戴耀廷。應對大專院校這條戰線,北京和西環一直都嘗試影響,以至控制院校的決策。

如之前就先利用群眾壓力,迫使港大和中大處理戴耀廷和陳健民煽動佔中的問題,再委任李國章、廖長城等「梁粉」出任大學校董會、校務委員會等要職,試圖改變當中校內架構的決策。

以上談到這些,都是校內的決策問題的戰線,在院校條例的授權下,西環和北京固然較容易控制到校內架構的人選。另一條中共的核心戰線,就是學生方面的戰線。

中共從未放棄統戰青年

中共過往為學生運動出身,相當明白統戰學生的重要性。因此,中共早年透過成立學友社、八十年代前統戰過往的學聯,牽起不少學生的民族情緒,再以認同中共政權,當年被稱為「國粹派」的大學生正正是宣揚「認祖關中」的精神。後來,中共的統戰策略隨四人幫倒台、六四事件後而失敗,中共轉為另立組織以達成影響青少年的目標。現時許多以交流為名的組織,大部份均是在這十多年間由不同的親建制人士成立,就可見到中共一直以來未有放棄青年的戰線。今天港大所發生的事,其實只是過往共產黨所做過的加強版,而校方高層守不住底線,更令人失望。

以交流為名,其實為統戰。現時參與任何一個回大陸的交流團,大部份均不會赤裸裸地接觸到共產黨的思想或政治宣傳,反而參加者所獲得的待遇,跟參與旅遊團差不多,甚至受地方政府、部門不少的禮待,從而

建立一種虛榮感,抱着越來越少的懷疑心態思考中國的問題,甚至毫不猶豫地接受中國所有官方宣傳

這種經驗比我們認為「有毒」的國民教育來得真實,我們更應防範此種似是而非的政治宣傳途徑,反對港大欲推動的強制交流計劃。

城大、嶺大、公大等大專院校均由「梁粉」、政協或人大出任校長,

校方領導層相繼赤化和靠攏建制,已毫無風骨。

相對較開明的中大,其在大陸的合辦院校,又被捲進在共青團招收「網絡警察」的風波之中,校方高層又有不少「聽話之人」,亦早已成為西環和北京的囊中之物

當下仍可能有反抗的空間,則只有港大這間百年老校。港大至今所充滿的西方意識,尤其開校之時早已形成,百多年來港大的目標就是培育香港人才,為香港服務。如現時有校方高層放棄這段歷史,轉為對中國投懷送抱,甚至協助政權推動強制的交流計劃,扼殺同學的自主權利,我們必須堅決地對此等行為說不,並應該監察其他院校會否乘勢推出同等的計劃,向北京獻媚。

莫鍶軒


持平而論 – 陶傑 蘋果日報 2015年4月21日 星期二

港大一位姓何的洋人副校長公開訓示:不想去中國大陸(即香港華文傳媒所稱的「內地」)交流者,不要來港大,引起社會公議。

由學術理性角度,港大學生如果受鼓勵(Encouraged),或受推薦(Recommended)去大陸交流,一點問題也沒有。香港離大陸最近,一向是觀察中國的瞭望台。大學是研究和進修的地方,大學校長呼籲學生多去中國交流,除非有證據顯示該校長私下收受了中國教育部的錢,否則鼓勵你「交流」不等同「親中」。在學術上,何副校長如果這樣呼籲,跟「港大醫學院學生在學期間應該去非洲伊波拉疫區視察至少一次」一樣,是很科學的,並無任何道德立場。

身為港大學生,也應該有點自信。如果有獨立的知識思考能力,如果不是一個維園阿伯之類的農民,而是上等人,去中國大陸「交流」,是不會被「洗腦」的。譬如李光耀,就是劍橋畢業的高等華人,去中國訪問了不下數十次。「交流」之後,也批准數以萬計中國的技術專業移民來到新加坡,但是李光耀的新加坡並沒有證據顯示有一個中國移民成立的地下黨支部。

港大學生北上「交流」,是不怕的,只要閣下對中國有足夠的了解。譬如,一個港大學生,到了河北石家莊的一個企業,企業的書記說:「歡迎你來交流。」這個港大學生笑一笑,用帶有北方口音的普通話說:「不是交流,像王光美,想要點桃園經驗嘛,我是來蹲點的。」你會說「蹲點」,而且還拋出「桃園經驗」這個中國典故,你的主人家,就會一楞,不敢把你當傻瓜。

香港大學生應該了解中國,由中國各地的細節了解,不要將中國當作厭惡的話題,你會增長見識和智慧。

當然,這個何副校長,身為洋人,說話的態度有問題,他太「串」了。如果他是牛津或哈佛的校長,不會敢對英美的大學生像小孩一樣訓令。

或者這位洋朋友在中國太久了,對香港人之蔑視,腔調像魯平和陳佐洱。

如果何校長有點英式趣怪幽默,改一個方式,說:「你們北上交流,如果不俘獲一個內地性伴侶,而且要處女──我知道這是個艱鉅的 Challenge,but you’re from HKU ── 不准回港大畢業」,學生會欣然鼓掌。抗議的,最多是外面幾個左翼女權團體,而不是港大的學生。

我那時會義務解畫:「英文的 Virgin,也可以是處男。副校長沒有歧視,對港大北上的男女生的期許,是平等的。

陶傑


不會被馴服的城市 – 戴耀廷 蘋果日報 2015年4月21日 星期二

在處理香港前途問題時,中共也應感到香港與大陸有很強的疏離感,不然也不會提出以一國兩制的方式來讓香港回歸北京政府的主權之下。

不少上一代的港人就是為了逃避中共統治才走到香港來,故在疏離中還有着不輕的恐共情意結。

不過港人對中國的感情應也不算是淡薄的,這可反映在港人熱心援助國內受災害影響、血濃於水的同胞,及熱烈地投入為國家隊在不同國際體育賽事中打氣。

但八九六四前後,過百萬港人上街支持北京學生,及之後不間斷地每年都去紀念六四,因此對中共來說,香港這地方還未算是一個馴服的城市。

按一國兩制及《基本法》的原設計,北京是用十年時間在香港做工作,希望人心由疏離變得親近,到人心回歸,就可按計劃實行普選。其實當年讓香港最終實行普選,對中共來說也要冒一些險的,因也難保十年就可把香港馴服,故在《基本法》也預先留下後着,規定特首候選人一定要由提委會按沒有人可說得清的「民主程序」提名,再保留着《基本法》的最終解釋權,一旦出亂子也能有方法彌補。

北京政府原以為只要換一個港人來當特首,大體維持着殖民地時代的管治模式,就能延續港英殖民地的有效管治。只要香港能繼續維持繁榮穩定,以港人務實和看重經濟利益的特性,十年時間應可成功馴服香港。

但想不到回歸不久就出現了亞洲金融風暴,香港經濟出現幾十年來最大的危機。董建華由「有所作為」至「無能為力」,在○三年觸發了最大規模的反政府示威遊行。

北京政府不得不改變策略,但方向仍是一樣,還是以經濟為主軸,透過引進 CEPA 和自由行來幫助香港經濟復蘇。香港經濟是回復過來了,但人心卻仍是沒有回歸。也因這原因,回歸十年後實行普選的計劃被推遲十年。

回歸了那麼多年,用了不同方法,也投入了不少資源,但人心不但未見回歸,反更是越益背離,究其原因可以有兩方面。

一方面是中共在文革後在大陸推行改革,雖然在經濟上有很大的成果,但政治的格局,基本上自七九年後並沒有大變。「依法治國」的確比無法無天好,但卻見不到能成功解決貪腐問題。

貪官是捉了不少,官員在大力打貪下也有所收斂,但導致貪腐的根源,就是權力不受制約,還是未有觸碰。

推行了領導層十年換一次的制度,看來使權力交接有序及和平得多,但內部權爭仍是非常激烈。

習近平雖能快速集權,清除黨內反對力量,但也帶來自改革以來最大的權爭危機。

這些都令已帶有先天恐共情結的港人更難接受中共政權。

本土意識提升加深矛盾

另一方面是香港內部在過去二十多年也出現了很大的變化,就是本土意識的提升。

這不是指反水貨客、反大陸人的那種狹隘式及排他式的本土意識。

本土意識第一個重點是在回歸後更多港人更強烈地感到香港是屬於我們自己的地方。

對不少上一代港人來說,香港只是在借來的時間下的一個借來的地方,歸屬感不強,香港是一個跳板多於是他們的家。

第二個重點是港人有了更強的自我身份認同。

這身份認同也不只是空洞地為自己身屬香港這社群及地方而感到驕傲,而還是帶有道德價值取向的。

法治、平等、自由、公平等價值常被引述為香港的核心價值,就是香港身份認同的實質價值內容。

在○三之後的十年,這種本土意識一步步強化,與大陸仍實行的那一套及大陸人的文化,出現了越來越大的差距。

大家之間的矛盾越來越尖銳,這在一四年雨傘佔領行動之後,更由深層浮現到表層來。雨傘運動的出現本身就是一個最好的例證。

現在政改還未到最後拍板之日,但看來被否決的機會是相當大。

北京政府或許以為過去那麼多年未能馴服香港,問題只是出在用錯了方法。故在未來幾年,北京政府可能會投入更多的資源去滲透至香港社會更闊更深的層面,並以各種方法去打壓反對力量及壓抑本土意識,誓要把香港馴服。

但觀乎過去三十多年的發展,香港受到越大的打壓下,抗衡只會更加強烈。

中共必須放棄那種以我為主,要把香港馴服的心態,接受及承認香港已成長至一個具備了強烈自主意識的地方,願意用一個相互尊重的方法來對等地對待香港,中港關係才有望拉近及回復和諧。

香港是一個不會被馴服的城市,我以此為傲。

戴耀廷


民意 – 李怡 蘋果日報 2015年4月21日 星期二

政改方案明天出爐,林鄭月娥表示會動員整個問責團隊落區宣傳,相信民意能起「決定性作用」。與此同時,兩個建制派政團也發表政改民調為袋住先造勢。工聯會的民調,指約七成半受訪者支持政改;新界社團聯會民調則指同意政改方案者有六成人。

整個問責團隊,許多人的民意支持度都屬負值,

要陳茂波、吳克儉落區宣傳政改,對民意會起甚麼影響,可以預期

當然,若長期處超高民意負值的梁振英落區宣傳,就更見負成效矣。

至於一向對北京唯唯諾諾的兩個聯會,

他們的問卷如何設計,他們的民調有多少公信力,根本就是造勢氣味太重,

更使市民懷疑其動機不純,都會引起實質民意走向反方向。

建制派惟有曾鈺成較清醒

針對林鄭所說的民意能起「決定性作用」,他昨天說,只靠打民意戰,不能令問題有圓滿出路。

民意戰非以理服人,有「夾硬來」的味道,可能是一場社會撕裂戰。

李怡


那些無法移民的香港人 – 阿諾 信報 2015年04月17日

移民到哪裡去?對於一些香港人來說,是一個嚴肅的命題;

有沒有移民的能力,又是另一個問題。

港人移民高峯期發生在上個世紀九十年代初,因為六四效應以及九七逼近,最多是

一九九二年,有六萬六千二百名港人移民海外,美歐澳等地接納了不少香港專業人士。

香港,這個蕞爾小島,位於大陸邊緣,

聚居的是逃難者的後代;他們靈活變通、慷慨而又務實,血液裡流淌著逃難者的基因,不會坐守一個地方等待不可測的命運降臨。

今年年初,香港保安局曾出了一份資料,估計2014年有近7000名本港居民移居外國,最多港人移民的三個國家是美國、澳洲及加拿大,數字比一三年減少近10%,創九七回歸以來新低。另一方面,台灣移民署的資料顯示,一四年居留台灣的香港人數量創下九七以來新高,比一三年激增超過60%

北美向來是港人移居的熱門地點,不少明星或中產老了或退休,都喜歡移民到加拿大的多倫多和温加華。這幾年,隨著中國國力增强,中國富人移民歐美人數急劇上升,西方對華人提高了戒心;再加上歐洲本土右翼排外勢力壯大、恐襲威脅等,多個西方國家都收緊了移民門檻。

移居西方的路收窄後,華人在大中華區內的流動卻增加了,台灣成為香港其中一個熱門的移居地。台灣這十多年來的社會制度建設,如民主政制與全民健保皆領先香港,對於港人有相當的吸引力。但台灣為了控制人口,其實也並不歡迎香港人大量湧入。

台灣內政部上年年初表示「為避免難以預期的衍生性人口」,將收緊港、澳居民移民台灣的規定;上年年中,台灣修改移民法,把港澳人士投資移民的金額由五百萬新台幣提高到六百萬新台幣。這個門檻,日後只會越弄越高,而不會降低

一小部分人移出香港的同時,不少的中國大陸居民則以工作、讀書、投資、家庭團聚等方式移入香港。

明年,香港連接深圳的高速鐵路工程完工,坐列車從香港到北京只需八個小時

2017年,港珠澳大橋預計建成通車,駕車從香港到珠海只要半個小時

正在建設中的港珠澳跨海大橋,是連接香港的大嶼山島、澳門半島和廣東省珠海市的快速通道,

全長49.968公里;建成後對香港、澳門、珠海三地經濟社會一體化意義深遠。

這條大橋與從羅湖口岸伸過來的廣九鐵路,如兩隻長臂,把香港緊緊箍在懷裏。

還有另外一隻手:從深圳的福田口岸延伸到西九龍的高鐵,把香港的中心地帶抓在手裡。

屆時,珠三角一帶被打造成一日生活圈,香港人的活動範圍不再局限於羅湖橋以南。中港經濟甚至政治融合將更上一台階,同時無可避免地,也會在香港社會尤其中產階層,催生出更多的對香港大陸化的恐懼。

對於七百多萬香港人來說,能夠移民離開的只佔一小部分,大部分人還是必須跟這塊土地共呼吸、同患難。

尤其八十後九十後,比那些累積了一筆資產的中老年人更能深刻體認到這一點:香港是他們唯一的家園,除了經營好這裡,他們並沒有別的地方可以去。

這也是為什麼,香港近年政治抗爭日漸激烈,並且是以年輕人為主體的原因。

只是車輪滾動,大的格局已發生變化。

近兩個星期,大陸資金通過正式與地下渠道湧入香港,港股連續多日創出2000億以上大成交,被某些評論視為「新常態」。一旦大陸公募基金入市,北水規模將更大,兩個不同的金融市場不排除全面互通的可能。

香港將更深地嵌入中國的經濟肌理,單靠「勇武」、「衝撞」難以抗衡。

上個世紀九十年代,香港尚未回歸,李光耀已指出北京不可能長期讓香港實行不一樣的制度。

留下來的香港人該如何自處,跟比自身強大的力量週旋、維護核心價值不墜,需要更多的智慧。

.END

Leave a comment

Filed under Geopolitics

港男不思進取, 港女轉嫁內地男 – 人民日報

《人民日報》指港女不滿港男不思進取寧嫁內地男 – 蘋果日報 2015年04月20日

http://hk.apple.nextmedia.com/realtime/news/20150420/53653319

統計處日前公佈,過去近5年港女嫁內地男的數目大增。

《人民日報》海外版引述本港婚禮顧問指,「不少港女認為部分港男不思進取,內地男愈來愈優秀及富有,吸引大批港女青睞」,不過報道並無寫出該婚禮顧問的姓名。

報道指,去年本港5.6萬宗結婚登記中,有5400多宗新郎是內地人,即差不多

每10對新人就有一對屬港女嫁內地男

1997年,北上嫁內地男的港女只有675人,2014年增至5400多人,

16年間急增7倍

報道具名引述一婚姻中介顧問指,港女願嫁內地男,除因內地男性質素提升,亦因她們希望想到內地工作和生活。

另一具名報道的香港學者亦指,隨著內地經濟發展,溝通交流增多,港女對內地男觀感轉好,北京和上海等大城市的生活水平與香港趨近,故打破港女的心理障礙。

但報道中二人均無說因部分港男不思進取,才令港女轉投內地男。

.END

Leave a comment

Filed under Geopolitics, Reading

FongI2c03, FongLcd03, FongKeypad03, FongAdc03 integrated testing OK

Begin FongTest03::testTest(). >>

Test test selection

0 = Test I2c.
1 = Test Lcd.
2 = Test Keypad.
3 = Test Adc/Dac.
4 = Test Lcd/KeyPad.
5 = Reserved.
6 = Reserved.
7 = Reserved.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.

Test Test Select = ? >>>>
Test Test Select = 3 >>>>
Test Adc.
Begin FongPcf8591Adc03::testPcf8591Adc(). >>

I2c test selection

0 = Check I2C addresses.
1 = Test analog to digital conversion.
2 = Test digital to analog conversion.
3 = Reserved.
4 = Reserved.
5 = Reserved.
6 = Reserved.
7 = Reserved.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.

Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = 0 >>>>

I2C Scanner
Scanning…
I2C device found at address 0x26 !
I2C device found at address 0x27 !
I2C device found at address 0x48 !
I2C device found at address 0x4F !
done

Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = 1 >>>>
Channel 0 result = 128
Channel 1 result = 77
Channel 2 result = 117
Channel 3 result = 222
Channel 0 result = 255
Channel 1 result = 43
Channel 2 result = 10
Channel 3 result = 10

// *** testFongDuino03v2015apr20hkt1612.ino ****

// ********************************************************************
// FongDuino03 tlfong01.com 2015apr20
// ********************************************************************
#include “Arduino.h”
#include “HardwareSerial.h”
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <FongDigiOut03.h>
#include <FongDigiControl03.h>
#include <FongHardSerial03.h>
#include <FongBlueToothBase03.h>
#include <FongSpi03.h>
#include <FongAdc03.h>
#include <FongIox03.h>
#include <FongKeyPad03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>
#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongPcf8591Adc03.h>
#include <FongTtp229KeyPad03.h>
#include <FongTest03.h>

/*
#include <FongAnaIn02.h>
#include <FongEeprom02.h>
#include <FongBlueToothConnect02.h>
#include <FongTest02.h>
*/

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};
void setup()
{
Serial.begin(9600);
Serial.println(F(“FongDuino03v2015apr16hkt1134.ino”));
}

void loop()
{

// FongDigiOut03 fdo1(InitNum0, TestNum0); // 2015mar27 testing
// FongDigiControl03 fdc1(InitNum0, TestNum1); // 2015mar06 OK
// FongHardSerial03 fhs1(InitNum0, TestNum3); // 2015mar16 OK
// FongBlueToothBase03 fbtb1(InitNum0, TestNum4); // 2015mar16 OK
// FongSpi03 fspi1(InitNum0, TestNum4); // 2015mar26 testing
// FongAdc03 fadc1(InitNum0, TestNum5); // 2015mar16 OK
// FongIox03 fiox1(InitNum0, TestNum6); // 2015mar16 OK
// FongKeyPad03 fkp1(InitNum0, TestNum7); // 2015mar16 OK
// FongSegmentLed03 fsl1(InitNum0, TestNum10); // 2015apr16 OK
// FongAlphaNumLed03 fanl1(InitNum0, TestNum10); // 2015apr16 OK
// FongI2c03 fi2c1(InitNum0, TestNum10); // 2015apr17 OK
// FongLcd03 flcd1(InitNum0, TestNum11); // 2015apr17 OK
// FongPcf8591Adc03 fpcf8591cadc1(InitNum0, TestNum12); // 2015apr20 OK
// FongTtp229KeyPad03 fttp229kp1(InitNum0, TestNum13); // 2015apr18 OK

FongTest03 ftest1(InitNum0, TestNum14); // 2015apr20 testing

// FongAnaIn02 fai1(InitNum0, TestNum0); // OK 2015jan22
// FongEeprom02 feep1(InitNum0, TestNum5); //To test later
// FongBlueToothConnect02 fbtc1(InitNum0, TestNum2); // To test later
// FongTest02 ft1(Init0, Test0); // To test later

while (true) { };
}

// *** End ***


// *** FongTest03.h *******

// ********************************************************************
// FongTest03b – TL Fong 2015apr20hkt1608
// ********************************************************************

// *** Includes ***

#ifndef FongTest03_h
#define FongTest03_h

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

#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongTtp229KeyPad03.h>
#include <FongPcf8591Adc03.h>

class FongTest03: public FongI2c03, FongLcd03, FongTtp229KeyPad03, FongPcf8591Adc03
{
public:

// *** Constructors ***

FongTest03(int testNum, int debugNum);

// *** Variables ***

int _initNum ;
int _testNum;

// *** Univerasl constants *****************************************************

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};

// *** Functions ***

void initTest(int8_t initNum, int8_t testNum);
void testTest(int8_t initNum, int8_t testNum);

enum MenuNum {FirstSelectNum = 0, LastSelectNum = 13, TotalSelectNum = 14};
void printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum);
char askTestSelectChar(String askString, int8_t initNum, int8_t testNum);

void exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, FongLcd03 *flcd03Ptr, \
FongTtp229KeyPad03 *ftkp03Ptr, FongPcf8591Adc03 *fadcPtr);

void testLcdKeyPad(FongLcd03 *flcd03Ptr, FongTtp229KeyPad03 *ftkp03Ptr);

private:

};

#endif

// *** END ***


// *** FongTest03.cpp *******

// ********************************************************************
// FongTest03 – TL Fong 2015apr20hkt1615
// ********************************************************************

#include <FongTest03.h>

// *** Constructor ***

FongTest03::FongTest03(int initNum, int testNum): FongI2c03(initNum, testNum), \
FongLcd03(initNum, testNum), \
FongTtp229KeyPad03(initNum, testNum), \
FongPcf8591Adc03(initNum, testNum)
{
// Serial.println(F(“\nBegin FongTest03::FongTest(), … >>>>>>>>>”));

_initNum = initNum;
_testNum = testNum;

if (_initNum <= InitNum0)
initTest(_initNum, _testNum);

if (_testNum <= TestNum14)
{
// beep();
testTest(_initNum, _testNum);
}

// Serial.println(F(“End FongTest03::FongTest03(), … >>>>>>>>>”));
}

// *** Functions ***

void FongTest03::initTest(int8_t initNum, int8_t testNum)
{
Serial.println(F(“\n\nBegin FongTest03::initTest(). >>”));

Serial.println(F(“End FongTest03::initTest(). >>\n”));
}

void FongTest03::testTest(int8_t initNum, int8_t testNum)
{
Serial.println(F(“\nBegin FongTest03::testTest(). >>”));

FongI2c03 fi2c1(initNum, testNum);
FongLcd03 flcd1(initNum, testNum);
FongTtp229KeyPad03 ftkp1(initNum, testNum);
FongPcf8591Adc03 fadc1(initNum, testNum);

char selectChar;
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);

while (selectChar != ‘x’)
{
exeTestSelectFunction(selectChar, &fi2c1, &flcd1, &ftkp1, &fadc1);
selectChar = askTestSelectChar(“Test Test Select”, initNum, testNum);
}

Serial.println(F(“End FongTest03::testTest(). >>”));
}

char FongTest03::askTestSelectChar(String askString, int8_t initNum, int8_t testNum)
{
char selectChar;
char dummyChar;

// *** flush read buffer ***
while (Serial.available() > 0) {dummyChar = Serial.read();} // flush

// *** get user selection ***
Serial.print(F(“\n”));
Serial.print(askString);
Serial.println(F(” = ? >>>> “));

while (Serial.available() == false) {} // wait for char
selectChar = Serial.read();
Serial.print(F(“”));
Serial.print(askString);
Serial.print(F(” = “));
Serial.print(selectChar);
Serial.println(F(” >>>>”));
return selectChar;
}

void FongTest03::printTestTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum)
{
const char menu0[] PROGMEM = “0 = Test I2c.”;
const char menu1[] PROGMEM = “1 = Test Lcd.”;
const char menu2[] PROGMEM = “2 = Test Keypad.”;
const char menu3[] PROGMEM = “3 = Test Adc/Dac.”;
const char menu4[] PROGMEM = “4 = Test Lcd/KeyPad.”;
const char menu5[] PROGMEM = “5 = Reserved.”;
const char menu6[] PROGMEM = “6 = Reserved.”;
const char menu7[] PROGMEM = “7 = Reserved.”;
const char menu8[] PROGMEM = “8 = Reserved.”;
const char menu9[] PROGMEM = “9 = Reserved.”;
const char menu10[] PROGMEM = “a = Reserved.”;
const char menu11[] PROGMEM = “m = Menu.”;
const char menu12[] PROGMEM = “h = Help.”;
const char menu13[] PROGMEM = “x = Exit.”;

const char * const selectMenu[] PROGMEM = \
{menu0, menu1, menu2, menu3, menu4, \
menu5, menu6, menu7, menu8, menu9, \
menu10, menu11, menu12, menu13};

Serial.println(F(“\n### Test test selection ###”));
for (int8_t i = firstSelectNum; i <= lastSelectNum; i++)
{
Serial.println(selectMenu[i]);
}
}

void FongTest03::exeTestSelectFunction(char selectChar, FongI2c03 *fi2cPtr, \
FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr, \
FongPcf8591Adc03 *fadcPtr)
{
switch (selectChar)
{
case ‘0’:
Serial.println(F(“Test I2c.”));
fi2cPtr -> testI2c(_initNum, _testNum);
delay(100);
break;
case ‘1’:
Serial.println(F(“Test Lcd.”));
flcdPtr -> testLcd(_initNum, _testNum);
delay(100);
break;
case ‘2’:
Serial.println(F(“Test KeyPad.”));
ftkpPtr -> testTtp229KeyPad(_initNum, _testNum);
delay(100);
break;
case ‘3’:
Serial.println(F(“Test Adc.”));
fadcPtr -> testPcf8591Adc(_initNum, _testNum);
delay(100);
break;
case ‘4’:
Serial.println(F(“Test LCD and keypad together , …”));
testLcdKeyPad(flcdPtr, ftkpPtr);
delay(100);
break;
case ‘5’:
Serial.println(F(“Write to LCD2004.”));
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “ghi”);
delay(100);
break;
case ‘6’:
Serial.println(F(“Write to LCD1602.”));
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “jkl”);
delay(100);
break;
case ‘m':
printTestTestSelectMenu(FirstSelectNum, LastSelectNum);
break;
case ‘h':
Serial.print(“Sorry, no help available, …”);
break;
default:
Serial.print(“Sorry, no such option, …”);
break;
}
}

void FongTest03::testLcdKeyPad(FongLcd03 *flcdPtr, FongTtp229KeyPad03 *ftkpPtr)
{
// *** Init Lcd ***
Serial.println(F(“Start testing Lcd, …”));

LiquidCrystal_I2C *lcI2cPtr0 = flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “Testing”);
LiquidCrystal_I2C *lcI2cPtr1 = flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “Testing”);

// *** Init keypad ***
Serial.println(F(“Start testing keypad, …”));
ftkpPtr -> initTtp229KeyPad(_initNum, _testNum);
uint8_t keyNum;
while (true)
{
keyNum = ftkpPtr -> getKeyNum();

if (keyNum == 0)
delay(500);
else if (keyNum == 16)
{
Serial.println(F(“Key pressed = 16.”));
Serial.println(F(“End testing keypad”));
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, “End of test.”);
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, “End of test.”);
break;
}
else
{
Serial.print(F(“Key pressed = “));
Serial.println(keyNum);
flcdPtr -> createWriteStringLcd(LcdNum0, 0, 0, (“Key pressed = ” + String(keyNum)));
flcdPtr -> createWriteStringLcd(LcdNum1, 0, 0, (“Key Pressed = ” + String(keyNum)));
delay(500);
}
}
}

// *** End ***

.END

Leave a comment

Filed under Project

FongPcf8591Adc03 tdd notes

Begin FongPcf8591Adc03::testPcf8591Adc(). >>

I2c test selection

0 = Check I2C addresses.
1 = Test analog to digital conversion.
2 = Test digital to analog conversion.
3 = Reserved.
4 = Reserved.
5 = Reserved.
6 = Reserved.
7 = Reserved.
8 = Reserved.
9 = Reserved.
a = Reserved.
m = Menu.
h = Help.
x = Exit.

Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = 0 >>>>

I2C Scanner
Scanning…
I2C device found at address 0x26 !
I2C device found at address 0x27 !
I2C device found at address 0x48 !
I2C device found at address 0x4F !
done
Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = 1 >>>>
Channel 0 result = 128
Channel 1 result = 76
Channel 2 result = 117
Channel 3 result = 224
Channel 0 result = 255
Channel 1 result = 62
Channel 2 result = 29
Channel 3 result = 20

Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = 2 >>>>

Pcf8591Adc Test Select = ? >>>>
Pcf8591Adc Test Select = x >>>>
End FongPcf8591Adc03::testPcf8591Adc(). >>


// *** testFongDuino03v2015apr16hkt1134.ino ****
// ********************************************************************
// FongDuino03 tlfong01.com 2015apr16
// ********************************************************************
#include “Arduino.h”
#include “HardwareSerial.h”
#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <FongDigiOut03.h>
#include <FongDigiControl03.h>
#include <FongHardSerial03.h>
#include <FongBlueToothBase03.h>
#include <FongSpi03.h>
#include <FongAdc03.h>
#include <FongIox03.h>
#include <FongKeyPad03.h>
#include <FongSegmentLed03.h>
#include <FongAlphaNumLed03.h>
#include <FongI2c03.h>
#include <FongLcd03.h>
#include <FongPcf8591Adc03.h>
#include <FongTtp229KeyPad03.h>
#include <FongTest03.h>

/*
#include <FongAnaIn02.h>
#include <FongEeprom02.h>
#include <FongBlueToothConnect02.h>
#include <FongTest02.h>
*/

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, TestNum11 = 11, \
TestNum12 = 12, TestNum13 = 13, TestNum14 = 14};

void setup()
{
Serial.begin(9600);
Serial.println(F(“FongDuino03v2015apr16hkt1134.ino”));
}

void loop()
{

// FongDigiOut03 fdo1(InitNum0, TestNum0); // 2015mar27 testing
// FongDigiControl03 fdc1(InitNum0, TestNum1); // 2015mar06 OK
// FongHardSerial03 fhs1(InitNum0, TestNum3); // 2015mar16 OK
// FongBlueToothBase03 fbtb1(InitNum0, TestNum4); // 2015mar16 OK
// FongSpi03 fspi1(InitNum0, TestNum4); // 2015mar26 testing
// FongAdc03 fadc1(InitNum0, TestNum5); // 2015mar16 OK
// FongIox03 fiox1(InitNum0, TestNum6); // 2015mar16 OK
// FongKeyPad03 fkp1(InitNum0, TestNum7); // 2015mar16 OK
// FongSegmentLed03 fsl1(InitNum0, TestNum10); // 2015apr16 OK
// FongAlphaNumLed03 fanl1(InitNum0, TestNum10); // 2015apr16 OK

// FongI2c03 fi2c1(InitNum0, TestNum10); // 2015apr17 OK

// FongLcd03 flcd1(InitNum0, TestNum11); // 2015apr17 OK

FongPcf8591Adc03 fpcf8591cadc1(InitNum0, TestNum12); // 2015apr17 OK

// FongTtp229KeyPad03 fttp229kp1(InitNum0, TestNum13); // 2015apr18 OK

// FongTest03 ftest1(InitNum0, TestNum14); // 2015apr18 testing

// FongAnaIn02 fai1(InitNum0, TestNum0); // OK 2015jan22
// FongEeprom02 feep1(InitNum0, TestNum5); //To test later
// FongBlueToothConnect02 fbtc1(InitNum0, TestNum2); // To test later
// FongTest02 ft1(Init0, Test0); // To test later

while (true) { };
}

// *** End ***


// *** FongPcf8591Adc03.h ***

// ********************************************************************
// FongPcf8591Adc03 – TL Fong 2015apr17hkt1717
// ********************************************************************

#ifndef FongPcf8591Adc03_h
#define FongPcf8591Adc03_h

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <FongI2c03.h>

class FongPcf8591Adc03: public FongI2c03
{
public:

// *** Constructors *******************************************************

FongPcf8591Adc03(int8_t initNum, int8_t testNum);

int8_t _initNum;
int8_t _testNum;

enum InitNum {InitNum0 = 0, InitNum1 = 1, InitNum2 = 2, InitNum3 = 3};
enum TestNum {TestNum0 = 0, TestNum1 = 1, TestNum2 = 2, TestNum3 = 3, \
TestNum4 = 4, TestNum5 = 5, TestNum6 = 6, TestNum7 = 7, \
TestNum8 = 8, TestNum9 = 9, TestNum10 = 10, Test11 = 11, \
TestNum12 = 12};

// *** General enums ***

enum RepeatCount {RepeatOnce = 1, RepeatTwice = 2, RepeatFourTimes = 4, RepeatTenTimes = 10, \
RepeatOneHundredTimes = 100, RepeatOneThousandTimes = 1000, \
RepeatTenThousandTimes = 10000, Repeat100000Times = 100000, \
RepeatOneMillionTimes = 1000000, RepeatTenMillionTimes = 10000000};

// *** Init functions ***

void initPcf8591Adc(int8_t initNum, int8_t testNum);
void testPcf8591Adc(int8_t initNum, int8_t testNum);

enum MenuNum {FirstSelectNum = 0, LastSelectNum = 13, TotalSelectNum = 14};
void printPcf8591AdcTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum);
char askPcf8591AdcSelectChar(String askString, int8_t initNum, int8_t testNum);
void exePcf8591AdcSelectFunction(char selectChar, int8_t initNum, int8_t testNum);

// *** Test functions ***

// enum ChannelNum {ChannelNum0 = 0, ChannelNum1 = 1};

enum AdcConfigArrayArrayIndex {I2cAddressIndex = 0, TotalAdcConfigIndex = 1};
enum AdcNum {AdcNum0 = 0, AdcNum1 = 1, TotalAdcNum = 2, DefaultAdcNum = 0};

uint8_t _adcConfigArrayArray[TotalAdcNum][TotalAdcConfigIndex];
uint8_t _adcNum;

enum I2cAddresses {AdcI2cAddress0 = 0x48, AdcI2cAddress1 = 0x4f};

enum ControlByteConstants {BaseControlByte = 0b00000000, \
DisableAnalogOutput = 0b00000000, EnableAnalogOutput = 0b10000000, \
FourSingleEndedInputs = 0b00000000, \
ChannelNum0 = 0b00000000, ChannelNum1 = 0b00000001, \
ChannelNum2 = 0b00000010, ChannelNum3 = 0b00000011};
enum BytesNum {OneByte = 1, TwoBytes = 2};

uint8_t getI2cAddress(uint8_t adcNum);
uint8_t convertAnalogToDigital(uint8_t adcNum, uint8_t channelNum);
void convertDigitalToAnalog(uint8_t adcNum, uint8_t eightBitNum);

private:
};

#endif

// *** End ***


// *** FongPcf8591Adc03.cpp *******

// ********************************************************************
// FongPcf8591Adc03 – TL Fong 2015apr20hkt1558
// ********************************************************************

#include <FongPcf8591Adc03.h>

// *** Constructors ***********************************************************

FongPcf8591Adc03::FongPcf8591Adc03(int8_t initNum, int8_t testNum): FongI2c03(initNum, testNum)
{
// Serial.println(F(“\nBegin FongPcf8591Adc03::FongPcf8591Adc03(), … >>>>>>>>>”));

_initNum = initNum;
_testNum = testNum;

if (_initNum <= InitNum0)
initPcf8591Adc(_initNum, _testNum);

if (_testNum <= TestNum12)
{
beep();
testPcf8591Adc(_initNum, _testNum);
}

// Serial.println(F(“End FongPcf8591Adc03::FongPcf8591Adc03(), … >>>>>>>>>”));
}

// *** Init functions ***

void FongPcf8591Adc03::initPcf8591Adc(int8_t initNum, int8_t testNum)
{
// Serial.println(F(“\n\nBegin FongPcf8591Adc03::initPcf8591Adc(). >>”));

Wire.begin();

uint8_t adcNum;

adcNum = AdcNum0;
_adcConfigArrayArray[adcNum][I2cAddressIndex] = AdcI2cAddress0;

adcNum = AdcNum1;
_adcConfigArrayArray[adcNum][I2cAddressIndex] = AdcI2cAddress1;

_adcNum = DefaultAdcNum;

// Serial.println(F(“End FongPcf8591Adcc03::initPcf8591Adc(). >>\n”));
}

// *** Test functions *********************************************************

void FongPcf8591Adc03::testPcf8591Adc(int8_t initNum, int8_t testNum)
{
char selectChar;

Serial.println(F(“Begin FongPcf8591Adc03::testPcf8591Adc(). >>”));

printPcf8591AdcTestSelectMenu(FirstSelectNum, LastSelectNum);
selectChar = askPcf8591AdcSelectChar(“Pcf8591Adc Test Select”, initNum, testNum);

while (selectChar != ‘x’)
{
exePcf8591AdcSelectFunction(selectChar, initNum, testNum);
selectChar = askPcf8591AdcSelectChar(“Pcf8591Adc Test Select”, initNum, testNum);
}

Serial.println(F(“End FongPcf8591Adc03::testPcf8591Adc(). >>”));
}

char FongPcf8591Adc03::askPcf8591AdcSelectChar(String askString, int8_t initNum, int8_t testNum)
{
char selectChar;
char dummyChar;

// *** flush read buffer ***
while (Serial.available() > 0) {dummyChar = Serial.read();} // flush

// *** get user selection ***
Serial.print(F(“\n”));
Serial.print(askString);
Serial.println(F(” = ? >>>> “));

while (Serial.available() == false) {} // wait for char
selectChar = Serial.read();
Serial.print(F(“”));
Serial.print(askString);
Serial.print(F(” = “));
Serial.print(selectChar);
Serial.println(F(” >>>>”));
return selectChar;
}

uint8_t FongPcf8591Adc03::getI2cAddress(uint8_t adcNum)
{
uint8_t i2cAddress;
i2cAddress = _adcConfigArrayArray[adcNum][I2cAddressIndex];
return i2cAddress;
}

void FongPcf8591Adc03::convertDigitalToAnalog(uint8_t adcNum, uint8_t eightBitNum)
{
uint8_t i2cAddress;
i2cAddress = getI2cAddress(adcNum);

Wire.beginTransmission(i2cAddress);

Wire.write(0b01000000); // Enable AOUT, 4 single end inputs, input channel 00
Wire.write(i2cAddress); // PCF8591 address = 0x48, LSB = 0 for write

Wire.write(eightBitNum);
Wire.write(eightBitNum);
Wire.write(eightBitNum);

Wire.endTransmission();
}

uint8_t FongPcf8591Adc03::convertAnalogToDigital(uint8_t adcNum, uint8_t channelNum)
{
uint8_t resultByte;
uint8_t dummyByte;
uint8_t controlByte;
controlByte = (BaseControlByte | DisableAnalogOutput | FourSingleEndedInputs | channelNum);

uint8_t i2cAddress;
i2cAddress = getI2cAddress(adcNum);

Wire.beginTransmission(i2cAddress);
Wire.write(controlByte);
Wire.endTransmission();
delay(100);

Wire.requestFrom(i2cAddress, TwoBytes); // request 2 bytes

if (Wire.available() >= TwoBytes)
{
dummyByte = Wire.read();
resultByte = Wire.read();
Serial.print(F(“Channel “));
Serial.print(channelNum);
Serial.print(F(” result = “));
Serial.println(resultByte, DEC);
}

delay(500);
return resultByte;
}

// *** Print select menu ***

void FongPcf8591Adc03::printPcf8591AdcTestSelectMenu(int8_t firstSelectNum, int8_t lastSelectNum)
{
const char menu0[] PROGMEM = “0 = Check I2C addresses.”;
const char menu1[] PROGMEM = “1 = Test analog to digital conversion.”;
const char menu2[] PROGMEM = “2 = Test digital to analog conversion.”;
const char menu3[] PROGMEM = “3 = Reserved.”;
const char menu4[] PROGMEM = “4 = Reserved.”;
const char menu5[] PROGMEM = “5 = Reserved.”;
const char menu6[] PROGMEM = “6 = Reserved.”;
const char menu7[] PROGMEM = “7 = Reserved.”;
const char menu8[] PROGMEM = “8 = Reserved.”;
const char menu9[] PROGMEM = “9 = Reserved.”;
const char menu10[] PROGMEM = “a = Reserved.”;
const char menu11[] PROGMEM = “m = Menu.”;
const char menu12[] PROGMEM = “h = Help.”;
const char menu13[] PROGMEM = “x = Exit.”;

const char * const selectMenu[] PROGMEM = \
{menu0, menu1, menu2, menu3, menu4, \
menu5, menu6, menu7, menu8, menu9, \
menu10, menu11, menu12, menu13};

Serial.println(F(“\n### I2c test selection ###”));
for (int8_t i = firstSelectNum; i <= lastSelectNum; i++)
{
Serial.println(selectMenu[i]);
}
}

// *** Execute selection function *********************************************

void FongPcf8591Adc03::exePcf8591AdcSelectFunction(char selectChar, int8_t initNum, int8_t testNum)
{
switch (selectChar)
{
case ‘0’:
checkI2cAddresses();
break;
case ‘1’:
convertAnalogToDigital(AdcNum0, ChannelNum0);
convertAnalogToDigital(AdcNum0, ChannelNum1);
convertAnalogToDigital(AdcNum0, ChannelNum2);
convertAnalogToDigital(AdcNum0, ChannelNum3);

convertAnalogToDigital(AdcNum1, ChannelNum0);
convertAnalogToDigital(AdcNum1, ChannelNum1);
convertAnalogToDigital(AdcNum1, ChannelNum2);
convertAnalogToDigital(AdcNum1, ChannelNum3);

break;
case ‘2’:
convertDigitalToAnalog(AdcNum0, 0x00);
delay(1000);
convertDigitalToAnalog(AdcNum0, 0x7f);
delay(1000);
convertDigitalToAnalog(AdcNum0, 0xff);
delay(1000);
convertDigitalToAnalog(AdcNum0, 0x7f);
delay(1000);
convertDigitalToAnalog(AdcNum0, 0x00);
delay(1000);

convertDigitalToAnalog(AdcNum1, 0x00);
delay(1000);
convertDigitalToAnalog(AdcNum1, 0x7f);
delay(1000);
convertDigitalToAnalog(AdcNum1, 0xff);
delay(1000);
convertDigitalToAnalog(AdcNum1, 0x7f);
delay(1000);
convertDigitalToAnalog(AdcNum1, 0x00);
delay(1000);
break;
case ‘m':
printPcf8591AdcTestSelectMenu(FirstSelectNum, LastSelectNum);
break;
case ‘h':
Serial.print(“Sorry, no help available, …”);
break;
default:
Serial.print(“Sorry, no such option, …”);
break;
}
}

// *** End ***

.END

Leave a comment

Filed under Arduino